Linux -- это интересно

Скринкастинг в Linux (FFmpeg)


Рубрика: Дополнительные материалы -> Изучаем Linux -> Аудио и видео ПО
Метки: | | |
Просмотров: 35507

Скринкастинг в Linux (FFmpeg)

К сожалению, имеющиеся в 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

Комментариев: 4 RSS

Спасибо за толковую статью!

Опечатка

и кодируем его в сырой PCM (два каната, то есть, стерео)
.

Нашёл проблему с перекодированием видео с цифрового фотоаппарата. Помогло добавление изменение "-ab 64k -ac 1" на "-ab 64k -ar 44100 -ac 1".

Звук проще всего добавить, дописал что-то вроде этого:

-f alsa -i pulse

И стандартными средствами в Ubuntu можно выбрать источник записи. Ну, или тот же pavucontrol установить.

Либо, можно использовать alsa напрямую:

-f alsa -ac 2 -i hw:0,0
-f alsa -i plughw:1

цифры можно посмотреть в выводе arecord -l. Пример моего выхлопа:

$ arecord -l
**** Список CAPTURE устройств ****
карта 0: DG [Xonar DG], устройство 0: Multichannel [Multichannel]
  Подустройства: 1/1
  Подустройство №0: subdevice #0
карта 2: Camera [USB Camera], устройство 0: USB Audio [USB Audio]
  Подустройства: 1/1
  Подустройство №0: subdevice #0

Разрешение экрана можно автоматически ставить используя регулярку:

-f x11grab -r 30 -s $(xwininfo -root | awk '/geometry/ {print $2}') -i :0.0

Итого, для примера, вот:

fmpeg -f alsa -i pulse -f x11grab -r 30 -s $(xwininfo -root | awk '/geometry/ {print $2}') -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 -y screencast.mov
Оставьте комментарий!
Используйте нормальные имена.Войти через loginza
Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



 
(обязательно)