Подтвердить что ты не робот

Как создать полную копию декодера?

Я пишу видеодекодер (используя FFMPEG/AVCodec) для пользовательской реализации видеопотока mpeg4. Особенность этого видеопотока заключается в том, что он может разбиваться на многие потоки "сынов", создавая много P-кадров на основе одного и того же родителя. Видеопоток, который я пытаюсь декодировать, на самом деле является своего рода "видео-деревом". Что-то вроде этого:

I <--P <--P <---------------------P <-------------- P <------------ P
           \ <--P <--P <--P        \ <--P <--P       \ <--P <--P 

Я уже написал базовый декодер, который отлично работает, когда я решаю следовать одному пути, проблема в том, что я пытаюсь следовать нескольким путям в дереве видео. На этом этапе мне нужно "развить" мой декодер, чтобы следовать двум различным видеопотокам. разделение может происходить не только после ключевого кадра, но даже после P-кадра, поэтому мне нужно дублировать AVCodecContext (я использую avcodec_copy_context), но, похоже, он создает новый декодер из чистого состояния.. он, кажется, игнорирует предыдущий статус видео, поэтому декодированные P-кадры "применяются" к пустой видеокадре. Вероятно, копирование контекста с помощью avcodec_copy_context недостаточно... Любое предложение? Как я могу дублировать контекст и полный статус декодера? Или, есть ли другой способ декодирования моего потока, используя ссылки? Спасибо!

4b9b3361

Ответ 1

В соответствии с documentation: "Конечный контекст целевого кодека будет нераскрытым, т.е. вам необходимо позвонить avcodec_open() перед вами может использовать этот AVCodecContext для декодирования/кодирования видео/аудио данных".

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

В качестве альтернативы вы могли бы поддерживать несколько декодеров параллельно с самого начала в случае, если вам понадобится fork позже. Это может быть вариант, если вам нужно только несколько путей параллельно.

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