Вкратце: мне нужно закодировать крошечное количество видеокадров и сшить их перед гораздо большим потоком h.264 без перекодирования указанного потока.Кодировать h264 в соответствии с существующим потоком
Подробности: Я получаю транспортный поток с несколькими GB, содержащий h.264 es и аудио es. В настоящее время потоки h.264 всегда генерируются с использованием x264, и я могу предположить, что это будет иметь место в будущем. Теперь мне нужно добавить несколько видеокадров в этот поток, но мне не разрешено декодировать/кодировать весь поток; который оставляет мне единственный вариант, чтобы узнать точные параметры, которые мне нужно передать x264_encoder_open, так что оба потока совпадают.
В настоящее время, что я делаю это:
- демультиплексирования оригинальные TS и извлекать h.264 NAL пакеты.
- Когда я нахожу первый «незарегистрированный пользовательский» пакет SEI, я разбираю его и нахожу кучу x264-параметров.
- Используйте libavcodec, чтобы начать декодирование видео. Это дает мне размеры изображения и профиля h264 и уровня в структуре AVCodecContext.
- Сопоставьте все это как можно лучше в структуре 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