Как я могу создать полную копию декодера? - PullRequest
15 голосов
/ 02 августа 2011

Я пишу видеодекодер (используя 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 недостаточно ... Есть предложения? Как я могу продублировать контекст и полный статус декодера? Или есть ли другой способ декодировать мой поток, используя ссылки? Спасибо!

1 Ответ

3 голосов
/ 28 апреля 2015

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

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

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

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

...