Tuesday, May 14, 2013

Запись скринкаста в Linux при помощи ffmpeg


Чтобы ffmpeg мог записывать происходящее на экране он должен быть собран с опцией `--enable-x11grab`. Как оказалось в моем случае, идущая из репозитария Ubuntu версия пакета ffmpeg было собрана с этой опцией.

Пример захвата потока
#: 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
Или такой же вариант но без записи аудио сигнала, только видео:
#: ffmpeg -f x11grab -r 30 -s 1280x1024 -i :0.0 -vcodec libx264 -vpre lossless_ultrafast -threads 0 output3.mkv
После запуска команды (если не появятся сообщения об ошибках) в консоль будет выводится информация о текущем состоянии записи. Остановить процесс записи скринкаста можно с помощью комбинации [Ctrl+C].

Аудио-поток поступает с сервера pulseaudio и кодируется его в PCM (стерео).
Видео-поток в примере захватывается с частотой 30 кадров в секунду и разрешением 1280x1024 с дисплея :0.0 и кодируем его без потерь в h264 используя libx264. Если использовать, как в примере, "-threads 0", FFmpeg сам определяет количество потоков. Результат помещается в контейнер Matroska (.mkv). FFmpeg определяет тип контейнера автоматически по расширению. Результирующий файл "output.mkv" будет сохранен в текущем каталоге.

 Чтобы в скринкаст попал не весь экран а только его фрагмент можно указать желаемую область и геометрию. Для этого необходимо добавить +X,Y после :0.0, то есть чтобы получилось что-то вроде:
-s 800x600 -i :0.0+200,100
Это значит, что мы будем захватывать прямоугольник размером 800x600 пикселей со смешением по X в 200 и по Y 100 пикселей соответственно.

Примечание: Если вы получите сообщение вида `Unrecognized option ‘preset’` то вам необходимо до установить пакеты связанные с кодеком x264:
  • libavcodec-extra-53
  • libx264-123
  • libx264-dev
как на скриншоте.

Кодирование
Полученный файл скринкаста необходимо сжать.

Высокое качество видео| кодек H.264 Видео среднего качества| кодек Theora
#: 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).
#: ffmpeg -i output.mkv -acodec libvorbis -ab 128k -ac 2 -vcodec libtheora -b 1000k our-final-product.ogg Аудио-поток кодируется используя vorbis, а видео - theora. Для видео указан битрейт 1000k и контейнер .ogg.

Удаление из скринкаста не нужных фрагментов
#: 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 секунды потока.

Кодирование скринкаста в Avi c XVID и mp3
#: 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
Параметр -qscale подобен описанному ранее CRF. То есть, точно так же, чем он ниже, тем выше качество, дольше кодирование, больше файл.