This feels like something that ought to be a service provided by a compositing window manager, rather than externally. A compositing window manager knows where the windows are and has an X11 Picture associated with the backing store for each one. It should be able to stream those directly into a video. If it’s using OpenGL for compositing then it probably has the window’s Picture on the GPU as a texture already and so should be able to shove it into a hardware video CODEC without any additional bus round trips.
And indeed GNOME Shell (and I think other Mutter-based compositors) can do exactly this, via PipeWire. It took 5 clicks (+ → Window Capture (Pipewire) → OK → [pick a window] → OK) to tell OBS Studio to capture my terminal window. I believe DMA-BUF sharing is used to avoid copies.
I’ve been using Kazam for years for recording the entire screen, individual windows, or sections of the screen. It works wonderfully, similar to what you are describing. It’s available in the upstream repos, though not sure if it’s available on OpenBSD.
Ordinary X has all the capabilities needed to do it, just ffmpeg only allows capturing from the root window with a bounding box, hence the xwininfo extra step. There’s actually no need for any of this if you’re writing your own program (notice that things like browser screen share can pick individual windows without requiring a compositor at all), just if you are trying to make it work with only the ffmpeg command line options.
I was going to mention SimpleScreenRecorder for Linux (I often use the option to simply pick a window) but that’s already pointed out in the footnotes :)
hk is pretty interesting per se ! And your knowledge of ffmpeg format conversion and post-processing is really valuable, and I’ll steal a good bit of it 😉
I’ve been using a combination of wmutils and xrectsel to do something similar. I extend upon your solution by having the ability to record a randomly selected region of the screen, or arbitrary coordinates. I’m using different tools for that, which are more specific than simple xwindow output parsing (which is far from ideal IMO).
xrectsel lets you draw a region on the screen, and reports coordinates
slw / pfw (from wmutils) both report an X window ID (either selected by clicking it, or using the focused one)
wattr reports various window attributes (xywhb gives X, Y, Width, Height, Border width)
randr is a hacky tool I wrote to report the monitor size where the mouse cursor is (useful on multi-monitor setups)
Thanks! I tried searching for your rec script too but can’t find where you keep such things. Can you please share a link? I’m quite interested to see your script and learn how you do it vs the script in the article. Cheers
I don’t share them online, that’s why you couldn’t find anything. The rec script is basically them same as the above, but using ffmpeg rather than convert. And OP’s ffmpeg and are much better in terms of quality than what I came up with.
This feels like something that ought to be a service provided by a compositing window manager, rather than externally. A compositing window manager knows where the windows are and has an X11 Picture associated with the backing store for each one. It should be able to stream those directly into a video. If it’s using OpenGL for compositing then it probably has the window’s Picture on the GPU as a texture already and so should be able to shove it into a hardware video CODEC without any additional bus round trips.
And indeed GNOME Shell (and I think other Mutter-based compositors) can do exactly this, via PipeWire. It took 5 clicks (+ → Window Capture (Pipewire) → OK → [pick a window] → OK) to tell OBS Studio to capture my terminal window. I believe DMA-BUF sharing is used to avoid copies.
Not sure if there is better documentation around than the documentation for the ScreenCast portal.
OP uses OpenBSD so I don’t think pipewire or OBS would be an option for him at the moment.
(I know there is a porting effort for OBS underway though)
I’ve been using Kazam for years for recording the entire screen, individual windows, or sections of the screen. It works wonderfully, similar to what you are describing. It’s available in the upstream repos, though not sure if it’s available on OpenBSD.
Ordinary X has all the capabilities needed to do it, just ffmpeg only allows capturing from the root window with a bounding box, hence the xwininfo extra step. There’s actually no need for any of this if you’re writing your own program (notice that things like browser screen share can pick individual windows without requiring a compositor at all), just if you are trying to make it work with only the ffmpeg command line options.
I was going to mention SimpleScreenRecorder for Linux (I often use the option to simply pick a window) but that’s already pointed out in the footnotes :)
I have a script using slop and ffmpeg, https://raymii.org/s/snippets/Record_your_Linux_Desktop_with_ffmpeg_and_slop.html, but it creates huge files. This articles approach looks interesting because I’ve now mostly switched to Peek, which producesway smaller ffiles and can be resized to a specific window. https://github.com/phw/peek
peek is very convenient, and it’s even in most distro’s repositories, I believe. Certainly on Fedora.
I like to output mp4s with it, even if it describes itself (in the repository) as:
hk
is pretty interesting per se ! And your knowledge offfmpeg
format conversion and post-processing is really valuable, and I’ll steal a good bit of it 😉I’ve been using a combination of wmutils and xrectsel to do something similar. I extend upon your solution by having the ability to record a randomly selected region of the screen, or arbitrary coordinates. I’m using different tools for that, which are more specific than simple
xwindow
output parsing (which is far from ideal IMO).xrectsel
lets you draw a region on the screen, and reports coordinatesslw
/pfw
(from wmutils) both report an X window ID (either selected by clicking it, or using the focused one)wattr
reports various window attributes (xywhb
gives X, Y, Width, Height, Border width)randr
is a hacky tool I wrote to report the monitor size where the mouse cursor is (useful on multi-monitor setups)Here’s a showcase : ffmpeg-coordinate.webm
Lovely and simple, as always. I’d love to steal that snip screenshot script off you ;)
Thanks! I tried searching for your rec script too but can’t find where you keep such things. Can you please share a link? I’m quite interested to see your script and learn how you do it vs the script in the article. Cheers
I don’t share them online, that’s why you couldn’t find anything. The
rec
script is basically them same as the above, but usingffmpeg
rather thanconvert
. And OP’sffmpeg
and are much better in terms of quality than what I came up with.OBS?
Yes, this is trivial on X11 with OBS.
OP runs an OS with incomplete support for OBS.
I think OBS is the Open Broadcaster Software