К сожалению, имеющиеся в 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 \<br> -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 \<br> -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\<br> -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\<br> rd -flags +gmc+qpel+mv4 -trellis 1 -threads 0 our-final-product.avi


В итоге мы получаем типичный AVI с XviD и MP3. Параметр -qscale подобен описанному ранее CRF. То есть, точно так же, чем он ниже, тем выше качество, дольше кодирование, больше файл. Сами выбираем, что нам нужно. Используется avi-контейнер.

Источник: ubuntuforums.org