2012-04-15 2 views
3

Я экспериментировал с записывающими видеороликами, используя модуль X11grab FFmpeg, который до сих пор работал более или менее хорошо. Я понимаю, что кодирование a/v представляет собой сложный процесс со множеством мелких деталей, но я стараюсь учиться.Запись FFmpeg screencast: какие кодеки использовать?

Я бы хотел сделать «легкую» запись видеопотока, что при минимальном напряжении в системе, когда записывается поток. Я записываю два аудиопотока отдельно с pacat и sox. Позже все это фильтруется, нормализуется, кодируется и объединяется в контейнер Matroska.

Прямо сейчас у меня есть запись ffmpeg потока rawvideo, который будет передаваться в x264-юукс-дьюксер. Я экспериментировал с ffv1 и прямой записью x264 раньше. Моя система не может обрабатывать кодирование в реальном времени с помощью x264 в настройках, которые я хочу для конечного потока, поэтому мне нужно повторно сжать один раз, как только запись будет выполнена. Я обнаружил, что ffv1 дает мне ужасное падение кадра, и yuv4 тоже, но тем более. Я подозреваю, что это из-за скорости жесткого диска, даже если я сижу в SATA3 Caviar Black, который используется исключительно для хранения записанных данных.

Вопрос в том, какую комбинацию видеокодеков я должен смотреть? Запишите прямо в x264 и снова скомпонуйте «лучше» x264? Сырое видео, затем сжимаете? Как я могу найти такие проблемы, как кадры, которые я испытывал?

EDIT: Это линия ffmpeg, которую я использую в настоящее время.

ffmpeg -v warning -f x11grab -s 1920x1080 -r 30000/1001 -i :0.0\ 
-vcodec rawvideo -pix_fmt yuv420p -s 1280x720\ 
-threads 0\ 
recvideo.y4m 
+0

Какова резолюция вашего скринкаста? –

+0

Я записываю весь экран на 1080p и масштабируюсь до 720p на лету. – mkaito

+0

https://trac.ffmpeg.org/wiki/StreamingGuide упоминает некоторые хорошие кодеки для использования – rogerdpack

ответ

3

Вы попробовали http://en.wikipedia.org/wiki/Huffyuv?

Знаете ли вы, действительно ли ваша проблема связана с пропускной способностью процессора или диска? Какова скорость передачи данных, которую вы пытаетесь записать на диск? Сколько процессор нуждается в ffmpeg для вашего кодека при настройке битрейта и настроек? Я предполагаю, что вы не записываете, что компьютер простаивает - сколько ресурсов осталось для записи?

Для тестирования диска write perf, просто выделите 100 МБ, прочитайте в нем 100 МБ от /dev/urandom и напишите буфер на файл на этом диске, пока диск не работает. Измерить, сколько времени займет запись (чтение из уранда займет время). Linux имеет обратную запись, то есть он сбрасывает грязные страницы на диск каждые 5 секунд, а не сразу после записи. Использование fdatasync (или полное fsync) даст вам реальное время, пока данные не будут на диске.

Почему вы не видите использование процессора ffmpeg? Как насчет записи минуты окна терминала, показывающего top? Если нет, то как насчет perf record -a sleep 60 в терминале, а затем переключение на то, что вы делаете, запись минуты, за которой следует perf report?

EDIT: Я использовал avconv -v warning -f x11grab -s 1680x1050 -r 30000/1001 -i :0.0 -vcodec ffvhuff -s 1280x720 -threads 0 capture.mkv, и он отлично поработал для записи в RGB. Затем вы можете перекодировать в автономном режиме на H.264 в YUV, с двойным проходом для максимального качества и т. Д. Я получил около 24 МБ/с, но он, похоже, однопоточный. Мой Core2 @ 2.3Ghz в порядке с ним.

+0

Да, я пробовал huffyuv. Я сохраняю два из четырех ядер, предназначенных для ffmpeg во время записи. Кроме того, часть моего вопроса заключалась в том, чтобы определить проблемы, которые у меня есть, что подразумевает, что я понятия не имею, связано ли это с процессором или жестким диском. Я также не уверен в том, что скорость записи данных используется для записи на диск. – mkaito

+1

Вы конвертируете RGB (собственные пиксели) в YUV. Попробуйте записать в RGB.Использование процессора должно быть таким же простым, как запуск 'top' (или' htop', или 'perf record -a sleep 60' из инструментов linux) во время записи. Скорость записи на диск в байтах в секунду - это размер файла, который вы записываете, в минуту, деленный на 60. Диск должен иметь возможность записывать со скоростью 100 Мбайт/сек (последовательно, если он используется только для этого и не выполняет никакой другой работы, включая чтение , что заставляет его искать). –

+0

YUV4 не нравится (A) формат изображения RGB. x264 не будет ничего есть, кроме сырого потока y4m, и ffmpeg автоматически выбирает yuv420p, когда говорит ему использовать x264. Размер видеофайла составляет примерно 2.30Gb в минуту. Это означает, что он пишет около 40 Мбит/с. htop сообщает, что ядра, назначенные ffmpeg, составляют около 30% нагрузки каждый. – mkaito