К сожалению, имеющиеся в 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
1mishuk18-11-2010 00:02
Спасибо за толковую статью!
Опечатка
.2dimas08-02-2011 21:19
а как бороться с шумом звука?
3Zenitur05-03-2011 13:05
Нашёл проблему с перекодированием видео с цифрового фотоаппарата. Помогло добавление изменение "-ab 64k -ac 1" на "-ab 64k -ar 44100 -ac 1".
4vovans08-12-2011 16:49
Звук проще всего добавить, дописал что-то вроде этого:
И стандартными средствами в Ubuntu можно выбрать источник записи. Ну, или тот же pavucontrol установить.
Либо, можно использовать alsa напрямую:
цифры можно посмотреть в выводе arecord -l. Пример моего выхлопа:
Разрешение экрана можно автоматически ставить используя регулярку:
Итого, для примера, вот: