К сожалению, имеющиеся в Linux инструменты для screencasting'а ( recordmydesktop, xvidcap, istanbul, wink ) делают свою работу не лучшим образом. Качество видео и аудио потоков оставляет желать лучшего. К тому же, нередко имеет место рассинхронизация видео и звука.
Подготовка
Чтобы сделать скринкаст хорошего качества, можно воспользоваться FFmpeg. Единственное только что, FFmpeg придётся самим собирать. На самом деле, это очень просто. Пересборка нужна затем чтобы включить опцию "--enable-x11grab" и ряд кодеков. К тому же, у вас в системе будет самая свежая версия кодеков, что уже очень хорошо. Ведь, как известно, FFmpeg - это вечная альфа.
Screencasting:
Мы будем делать screencasting в два этапа:
- Захват видео и звука без потерь.
- Кодирование в более приемлемый для хранения формат, ибо результирующий файл из предыдущего пункта будет достаточно объёмный.
Зачем нужно разбивать процесс на два этапа? Дело в том что процесс сжатия видео потребляет много ресурсов компьютера. И делать это "на лету" (захватывать видео и тут же сжимать его) способен далеко не любой компьютер. То есть, в противном случае мы и будем иметь рассинхронизацию аудио и видео потоков, частичную потерю видео-потока и т.п. "сладости". Если мы хотим получить качественный скринкаст, придётся это делать в два этапа.
1. Захват потока
Синтаксис использования FFmpeg таков:
ffmpeg [input options] -i [input file] [output options] [output file]
А вот рабочий пример:
ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 30 -s 1280x1024 -i :0.0 -acodec pcm_s16le \ -vcodec libx264 -vpre lossless_ultrafast -threads 0 output.mkv
После введения этой команды начнётся захват видео и аудио потоков на вашем компьютере. Для завершения процесса необходимо нажать клавишу "q".
В приведённом примере мы захватываем аудио-поток поступающий с сервера pulseaudio и кодируем его в сырой PCM (два каната, то есть, стерео). Видео-поток мы захватываем с частотой 30 кадров в секунду и разрешением 1280x1024 с дисплея :0.0 и кодируем его без потерь в h264 используя libx264. Если использовать, как в примере, "-threads 0", FFmpeg сам определяет количество потоков. Результат помещается в контейнер Matroska (.mkv). Результирующий файл "output.mkv" будет сохранен в текущем каталоге. Ничего сложного.
Захватывать можно не весь экран, а какую-то определённую область. Для этого необходимо добавить +X,Y после :0.0, то есть чтобы получилось что-то вроде:
-s 800x600 -i :0.0+200,100
Это значит, что мы будем захватывать прямоугольник размером 800x600 пикселей со смешением по X в 200 и по Y 100 пикселей соответственно.
Так же, можно изменить частоту кадров на желаемую.
2. Кодирование
После того как мы получили огромный файл со скринкастом, нам нужно его сжать. А выбор метода сжатия нужно выбирать в зависимости от нужд.
Пример 1:
ffmpeg -i output.mkv -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre slow -crf 22 \ -threads 0 our-final-product.mp4
В данном примере аудио-поток мы кодируем в AAC с битрейдом 128k на канал. Видео-поток же мы кодируем используя кодек высокого качества H.264 используя параметр "slow" и CRF указали равным 22. Чем меньше CRF, тем выше качество, но больше результирующий файл и время кодирования. Разумный диапазон значений от 18 до 28. Результатом будет файл our-final-product.mp4 помещённый в контейнер MP4. FFmpeg определяет тип контейнера автоматически по расширению. То есть, если указать расширение результирующего файла .mkv, то будет использован контейнер "Матрёшка".
Пример 2:
ffmpeg -i output.mkv -acodec libvorbis -ab 128k -ac 2 -vcodec libtheora -b 1000k our-final-product.ogg
Тем, кто предпочитает полностью свободные форматы, как раз будет по душе этот пример. Аудио-поток кодируется используя vorbis, а видео - theora. Для видео указан битрейд 1000k и контейнер .ogg. Качество звука в данном случае будет на высоте, а вот видео... К сожалению, vorbis во всех отношениях уступает распространённым кодекам.
Пример 3:
ffmpeg -ss 00:00:10 -t 00:07:22 -i output.mkv -acodec libvorbis -ab 128k -ac 2 -vcodec libx264\ -vpre slow -crf 22 -threads 0 our-final-product.mkv
Так как вначале скринкастинка вы некоторое время будете готовиться, да и в конце тоже будет кусочек ненужного видео, эти моменты можно вырезать используя -ss и -t. В примере кодирование начинается спустя 10 секунд и кодируются последующие 7 минут 22 секунды потока.
Так же, в данном примере используются вместе Vorbis/H.264/Matroska - оптимальное сочетание качества!
Пример 4:
ffmpeg -i output.mkv -acodec libmp3lame -ab 128k -ac 2 -vcodec libxvid -qscale 8 -me_method full -mbd\ rd -flags +gmc+qpel+mv4 -trellis 1 -threads 0 our-final-product.avi
В итоге мы получаем типичный AVI с XviD и MP3. Параметр -qscale подобен описанному ранее CRF. То есть, точно так же, чем он ниже, тем выше качество, дольше кодирование, больше файл. Сами выбираем, что нам нужно. Используется avi-контейнер.
Источник: ubuntuforums.org
отсюда
работающие рецепты
https://ru.wikipedia.org/wiki/Разрешение_экрана_монитора
https://help.ubuntu.ru/wiki/ffmpeg#запись_видео_с_экрана_монитора_средствами_ffmpeg
https://www.linux.org.ru/forum/multimedia/8736436
xwininfo | grep -e Width -e Height -e Absolute
xwininfo -root |grep 'geometry' | awk '{print $2;}'
arecord -l
ls /usr/share/ffmpeg/
ffmpeg -formats 2> /dev/null | egrep '(x11grab|qtrle)'
https://ubuntuforums.org/showthread.php?t=1392026
https://geekkies.in.ua/linux/screencasting-v-linux-ispolzuya-ffmpeg-ili-avconv.html
ffmpeg — это само приложение;
-f x11grab — этим мы указываем, что для захвата видеосигнала мы используем вывод графической подсистемы;
-s 1280x1024 — область захвата видео. В данном случае это разрешение моего экрана;
-r 15 — фреймрейт (количество кадров в секунду). Для записи экрана 15 кадров вполне достаточно;
-i :0.0 — монитор;
-vcodec qtrle — используемый видеокодек;
screencast.mov — это имя выходного файла;
варианты
Получить список аудиоустройств:
pactl list short sources
Минимальная команда (быстро и просто)
ffmpeg -f x11grab -i :0.0 -f pulse -i default output.mp4
✅ Экран + системный звук (PulseAudio / PipeWire)
ffmpeg \
-f x11grab -video_size 1920x1080 -framerate 60 -i :0.0 \
-f pulse -i default \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-c:a aac -b:a 192k \
-movflags +faststart \
output.mp4
✅ Экран + микрофон
ffmpeg \
-f x11grab -video_size 1920x1080 -framerate 60 -i :0.0 \
-f pulse -i alsa_input.pci-0000_00_1f.3.analog-stereo \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-c:a aac -b:a 192k \
output.mp4
✅ Запись области экрана
ffmpeg \
-f x11grab -video_size 1280x720 -i :0.0+100,200 \
-c:v libx264 -crf 23 -preset veryfast \
output.mp4
| Параметр | Назначение |
| ---------------------- | --------------------------- |
| `-crf 18` | почти без потерь |
| `-crf 23` | баланс качество/размер |
| `-preset ultrafast` | минимальная нагрузка |
| `-pix_fmt yuv420p` | совместимость с плеерами |
| `-movflags +faststart` | быстрое открытие в браузере |
запись видео с браузера, звук через аудиовыход наушников
xdotool getwindowgeometry --shell $(xdotool search --onlyvisible --name "chromium" | head -n1)
xwininfo -tree -root | grep -i "chromium"
2523x1440+0+0 +37+0
Если просто использовать центр окна:
PLAYER_X = (2523 - 478)/2 ≈ 1072
PLAYER_Y = (1440 - 360)/2 = 540
CAPTURE_X = 37 + 1072 = 1109
CAPTURE_Y = 0 + 540 = 540
ffmpeg -f x11grab \
-framerate 60 \
-video_size 1682x902 \
-i :0.0+37,0 \
-f pulse -i alsa_output.usb-GeneralPlus_USB_Audio_Device-00.analog-stereo.monitor \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p \
-c:a aac -b:a 192k \
video.mp4
-video_size 478x360 → размер плеера
-i :0.0+1109,540 → абсолютные координаты плеера на экране
-f pulse -i ...monitor → захват системного звука (тот, что слышно в браузере)
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p → качество видео
-c:a aac -b:a 192k → аудио
но точнее выделение область записи мышкой
sudo apt install slop
мышкой выделить область
slop
1798x1354+398+86
ffmpeg -f x11grab \
-framerate 60 \
-video_size 1798x1354 \
-i :0.0+398,86 \
-f pulse -i alsa_output.usb-GeneralPlus_USB_Audio_Device-00.analog-stereo.monitor \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p \
-c:a aac -b:a 192k \
video.mp4
✅ Объяснение:
-video_size 1798x1354 → размер выделенного видео
-i :0.0+398,86 → абсолютные координаты верхнего левого угла выделенной рамки
-f pulse -i ...monitor → системный звук браузера
libx264 -crf 18 → качественное видео
Начать запись с определённого времени (-ss)
Формат: -ss <time>
Позволяет пропустить первые N секунд
Пример: начать запись с 30-й секунды и записать 1 минуту:
ffmpeg -f x11grab -framerate 60 -video_size 1798x1354 -i :0.0+398,86 \
-f pulse -i alsa_output.usb-GeneralPlus_USB_Audio_Device-00.analog-stereo.monitor \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p \
-c:a aac -b:a 192k \
-ss 00:00:30 -t 00:01:00 \
video.mp4
1️⃣ Быстрая обрезка без перекодирования (-c copy)
Формат:
ffmpeg -i input.mp4 -ss <start> -to <end> -c copy output.mp4
<start> — момент начала (например, 00:00:10 → 10-я секунда)
<end> — момент окончания (например, 00:02:30 → 2 минуты 30 секунд)
Пример: убрать первые 10 секунд и последние 20 секунд видео длиной 3 минуты:
ffmpeg -i vk_video.mp4 -ss 00:00:10 -to 00:02:40 -c copy vk_video_trimmed.mp4
4️⃣ В постобработке: обрезка нижней части видео
Если панель появляется в фиксированной области снизу, можно обрезать её ffmpeg:
ffmpeg -i vk_video.mp4 -vf "crop=width:height-40:0:0" -c:a copy vk_video_cropped.mp4
height-40 → убираем 40 пикселей снизу
0:0 → верхний левый угол остаётся на месте
1️⃣ Уменьшить видеофайл до 100 МБ
Команда FFmpeg с сохранением качества (H.264 CRF + ограничение битрейта)
Если хочется минимальной потери качества, лучше использовать CRF, но при этом ограничить битрейт, чтобы не превысить 100 МБ.
ffmpeg -i input.mp4 -c:v libx264 -b:v 2895k -maxrate 3000k -bufsize 6000k -preset slow -c:a aac -b:a 192k output.mp4
Альтернатива: CRF без жесткого битрейта (чуть проще)
ffmpeg -i input.mp4 -c:v libx264 -crf 21 -preset slow -c:a aac -b:a 192k output.mp4
хостинг видеофайлов
https://vidplay.io/
http://bbb-solutions.blogspot.com/2017/02/how-to-record-skype-session-in-ubuntu.html
SimpleScreenRecorder
pactl load-module module-loopback