2

Почему FFmpeg декодирует необработанное видео в плоском 8-битном пиксельном формате YUV420, а также кодирует видео с использованием того же пиксельного формата YUV420p?

Я провел несколько тестов производительности, кодирующих только необработанное видео YUV420p с использованием кодера MPEG2 на FreeScale PowerPC с использованием следующих настроек:

ffmpeg -f rawvideo -pix_fmt yuv420p -s cif -r 25 -i YUV420p_cif.yuv -vcodec mpeg2video -pix_fmt yuv420p -r 25 -g 25 -s cif -b:v 1024k Output.mp4

Видеопоследовательность длится 15 минут. Я узнал, что весь процесс использует:

  • 3,9% времени чтения файла;
  • 3,7% времени декодирования;
  • 91,2% времени кодирования;
  • 0,7% времени муксинга + написание файла;
  • 0,5% времени инициализирует / закрывает ffmpeg

Весь процесс был выполнен за 382 секунды (58,9 кадров в секунду), поэтому декодирование заняло 14,1 секунды. Это мне кажется много!

Поскольку в процессе кодирования используется пиксельный формат YUV420p, почему FFmpeg требуется 3,7% времени для декодирования необработанного YUV420p в тот же формат?

1 ответ1

2

Чтобы закодировать видео, вам все равно придется получать данные каждого кадра во внутреннем формате, откуда они могут быть переданы в кодировщик.

AVFrame используется для внутреннего представления кадров, и он может принимать любой пиксельный формат, какой вы пожелаете - вам просто нужно правильно распределить его.

И именно поэтому декодирование занимает процессорное время, даже если ваши входные и выходные пиксельные форматы одинаковы: вам нужно выделить память для каждого кадра, прочитать его (даже если это необработанные данные), а затем передать этот кадр кодеру. Пример того, как обрабатываются кодирование и декодирование, можно увидеть здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .