You are not logged in.
I use Gnome and I appreciate the little feature it packs for "recording a short screencast" in one shortcut (press it once to start, another time to finish it) and gets saved into your videos folder. I want this simplicity for such a feature.
There are two cons, tho:
It has a maximum duration of around a minute (I haven't checked the exact number).
It is not hardware accelerated (you can tell by the CPU usage and the choppiness of the output as my laptop struggles to encode it).
For these two reasons, I set myself to find a substitute that, while retaining all the simplicity that Gnome Screencasting offers, it also doesn't have the limitations listed above.
Does anyone know any software that meet these requirements?
So far I have tried:
OBS, which works thanks to ffmpeg vaapi but it doesn't meet the requirements of simplicity
SimpleScreenRecorder, which has the same problem as OBS plus is not hardware accelerated
Peek, which doesn't use hw acceleration (checked htop which showed the command invoked ffmpeg ... didn't have any vaapi options enabled)
Creating my own script which has, so far, this:
#!/bin/bash
notify-send \
--urgency=low \
--icon=/usr/share/icons/Adwaita/512x512/mimetypes/video-x-generic.png \
'Starting the recording...'
echo "Press [q] to stop"
ffmpeg -vaapi_device /dev/dri/renderD128 \
-f x11grab \
-video_size 1920x1080 -r 60 \
-i :0 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24 \
recording-`date '+%d-%m-%Y_%H:%M:%S'`.mp4 > /dev/null
which I can assign to a keybind but has functionality problems, such as no way to stop it.
Last edited by icar (2021-01-03 23:18:33)
Offline
You could have a second keybind with "killall ffmpeg" to stop the recording. The other idea I have is to wrap an "if" around your current script contents that checks for ffmpeg running. Here's what I'm thinking of:
#!/bin/bash
if pkill -x ffmpeg; then
notify-send \
--urgency=low \
--icon=/usr/share/icons/Adwaita/512x512/mimetypes/video-x-generic.png \
'Stopped the recording...'
else
notify-send \
--urgency=low \
--icon=/usr/share/icons/Adwaita/512x512/mimetypes/video-x-generic.png \
'Starting the recording...'
ffmpeg -vaapi_device /dev/dri/renderD128 \
-f x11grab \
-video_size 1920x1080 -r 60 \
-i :0 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24 \
recording-`date '+%d-%m-%Y_%H:%M:%S'`.mp4 > /dev/null
fi
This runs pkill to (try to) stop an ffmpeg process. It uses pkill's exit status code to know if there was an ffmpeg process running or not.
This pkill idea will break things if there's other ffmpeg processes running because it will send signals to all ffmpeg processes. If that's a problem you could research how to save the PID of your ffmpeg process in a file like /tmp/screen-recording.pid, then use that file to do the "if-then-else" logic and the killing.
Reading your post here, I remembered seeing the following script, maybe check it out and see if there's something you can take from it for your own script:
Offline
Thanks for the ideas!
Seeing the complexity that this requires for such a functionality I might aswell start using something like Python.
New personal project
Offline
A quick search for simplescreenrecorder alternatives lead me to https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html .
It's in community and looks simple to configure but powerful.
You may find https://wiki.archlinux.org/index.php/Sc … t_software interesting .
Last edited by Lone_Wolf (2020-12-30 13:30:02)
Disliking systemd intensely, but not satisfied with alternatives so focusing on taming systemd.
(A works at time B) && (time C > time B ) ≠ (A works at time C)
Offline
I've been trying to do this with bash. So far I've got this, which is giving me a headache because for some reason ffmpeg exits generating an empty output...
Script:
│ File: /home/icar/Scripts/recordscreen
───────┼──────────────────────────────────────────────────────────────────────────────────────
1 │ #!/bin/bash
2 │
3 │ if [ -e $HOME/.cache/fifo-recording ]; then
4 │
5 │ echo -n q > $HOME/.cache/fifo-recording
6 │
7 │ notify-send --urgency=low --icon=/usr/share/icons/Adwaita/512x512/mimetypes/video-
│ x-generic.png 'Stopping the recording...'
8 │
9 │ rm -f $HOME/.cache/fifo-recording
10 │
11 │ else
12 │
13 │ notify-send \
14 │ --urgency=low \
15 │ --icon=/usr/share/icons/Adwaita/512x512/mimetypes/video-x-generic.png \
16 │ 'Starting the recording...'
17 │
18 │ rm -f $HOME/.cache/fifo-recording
19 │ mkfifo $HOME/.cache/fifo-recording
20 │ mkdir -p $HOME/Vídeos/ffmpeg
21 │
22 │ exec ffmpeg -vaapi_device /dev/dri/renderD128 \
23 │ -f x11grab \
24 │ -video_size 1920x1080 -r 60 \
25 │ -i :0 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24 \
26 │ $HOME/Vídeos/ffmpeg/recording-`date '+%d-%m-%Y_%H:%M:%S'`.mp4 \
27 │ < $HOME/.cache/fifo-recording
28 │
29 │ fi
It starts correctly, but when the script is executed again, ffmpeg throws this:
ffmpeg version n4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.2.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-shared --enable-version3
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
[x11grab @ 0x563cc11d5b00] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, x11grab, from ':0':
Duration: N/A, start: 1609617807.078819, bitrate: 3981312 kb/s
Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 1920x1080, 3981312 kb/s, 60 fps, 1000k tbr, 1000k tbn, 1000k tbc
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (h264_vaapi))
Press [q] to stop, [?] for help
Finishing stream 0:0 without any data written to it.
[h264_vaapi @ 0x563cc11bb940] Driver does not support some wanted packed headers (wanted 0xd, found 0x1).
Output #0, mp4, to '/home/icar/Vídeos/ffmpeg/recording-02-01-2021_21:03:19.mp4':
Metadata:
encoder : Lavf58.45.100
Stream #0:0: Video: h264 (h264_vaapi) (High) (avc1 / 0x31637661), vaapi_vld, 1920x1080, q=-1--1, 60 fps, 15360 tbn, 60 tbc
Metadata:
encoder : Lavc58.91.100 h264_vaapi
frame= 0 fps=0.0 q=0.0 Lsize= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
The ffmpeg command alone works ok... Could I have any suggestion? I'd appreciate it.
Offline
Peek, which doesn't use hw acceleration (checked htop which showed the command invoked ffmpeg ... didn't have any vaapi options enabled)
It shouldn't be too difficult to change the ffmpeg options in the source code and compile your own version (for example with the peek-git AUR package)
https://github.com/phw/peek/blob/master … g.vala#L11
and maybe some changes here https://github.com/phw/peek/blob/master … order.vala
Last edited by progandy (2021-01-02 20:28:45)
| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |
Offline
Peek, which doesn't use hw acceleration (checked htop which showed the command invoked ffmpeg ... didn't have any vaapi options enabled)
It shouldn't be too difficult to change the ffmpeg options in the source code and compile your own version (for example with the peek-git AUR package)
https://github.com/phw/peek/blob/master … g.vala#L11and maybe some changes here https://github.com/phw/peek/blob/master … order.vala
Thanks for the suggestion. I was modifying it and was looking good, but then I realized I can't do a one-liner to record the whole screen. Looking at the man page one could think of
peek --backend=ffmpeg --start --no-headerbar --display=:0
but that actually requires the application to be already running because it needs to read the coordinates at runtime... Which defeats the idea I'm trying to pursue. I still think that it could be achieved through bash, but if after a couple days trying I cannot make it work, I'll start developing something like a Rust (since I've started to learn it) or Python program.
Offline
Ok, I've finally done it. A script to do this. The only thing to be done now is to refine the ffmpeg flags, which is not part of the main problem.
Usage: call it once, it starts recording. Call it again, it stops. (you will obviously have to adjust to your system)
Best idea is to bind this to a key combination with your WM/DE.
#!/bin/bash
if [ -e $HOME/.cache/ffmpeg-pid ]; then
kill -15 $(cat $HOME/.cache/ffmpeg-pid)
notify-send \
--urgency=low \
--icon=/usr/share/icons/Adwaita/512x512/mimetypes/video-x-generic.png \
'Stopping the recording...'
rm -f $HOME/.cache/ffmpeg-pid
else
notify-send \
--urgency=low \
--icon=/usr/share/icons/Adwaita/512x512/mimetypes/video-x-generic.png \
'Starting the recording...'
mkdir -p $HOME/Vídeos/ffmpeg
echo $$ > $HOME/.cache/ffmpeg-pid
exec ffmpeg -vaapi_device /dev/dri/renderD128 \
-f x11grab \
-video_size 1920x1080 -r 60 \
-i :0 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24 \
-fs 1000000000 \
$HOME/Vídeos/ffmpeg/recording-`date '+%d-%m-%Y_%H:%M:%S'`.mp4
fi
Last edited by icar (2021-01-02 21:40:59)
Offline