2013-06-03 3 views
0

Вкратце: мне нужно закодировать крошечное количество видеокадров и сшить их перед гораздо большим потоком h.264 без перекодирования указанного потока.Кодировать h264 в соответствии с существующим потоком

Подробности: Я получаю транспортный поток с несколькими GB, содержащий h.264 es и аудио es. В настоящее время потоки h.264 всегда генерируются с использованием x264, и я могу предположить, что это будет иметь место в будущем. Теперь мне нужно добавить несколько видеокадров в этот поток, но мне не разрешено декодировать/кодировать весь поток; который оставляет мне единственный вариант, чтобы узнать точные параметры, которые мне нужно передать x264_encoder_open, так что оба потока совпадают.

В настоящее время, что я делаю это:

  1. демультиплексирования оригинальные TS и извлекать h.264 NAL пакеты.
  2. Когда я нахожу первый «незарегистрированный пользовательский» пакет SEI, я разбираю его и нахожу кучу x264-параметров.
  3. Используйте libavcodec, чтобы начать декодирование видео. Это дает мне размеры изображения и профиля h264 и уровня в структуре AVCodecContext.
  4. Сопоставьте все это как можно лучше в структуре x264_param_t.

Я могу сделать с этим кодировку, и закодированное видео воспроизводится правильно до точки соединения. Когда VLC достигают точки стежки он начинает выбрасывая следующую последовательность сообщений и вскоре после остановки игры:

[h264 @ 0x7fe36cd75be0] decode_slice_header error 
[h264 @ 0x7fe36cd75be0] no frame! 
[h264 @ 0x7fe36ccc9080] Width/height changing with threads is not implemented. Update your Libav version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented. 

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

Итак, очевидный вопрос: есть ли безопасный, формальный способ сделать это?

Thanks in Advance

ответ

0

Наконец-то я решил это сам. Оказывается, вам нужно только соответствовать размеру и формату изображения, поэтому он может быть таким же простым, как:

x264_param_t xparam ; 
x264_param_default(&xparam); 

xparam.i_width   = width ; 
xparam.i_height   = height ; 
xparam.vui.i_sar_height = 1  ; 
xparam.vui.i_sar_width = 1  ; 

x264_t * x264 = x264_encoder_open(&xparam);