2011-08-02 5 views
16

저는 mpeg4 비디오 스트림의 사용자 정의 구현을 위해 비디오 디코더 (FFMPEG/AVCodec 사용)를 작성하고 있습니다. 이 비디오 스트림의 특성은 동일한 "부모"를 기반으로 많은 P 프레임을 만드는 많은 "아들"스트림으로 나눌 수 있다는 것입니다. 디코딩하려고하는 비디오 스트림은 사실 일종의 "비디오 트리"입니다. 이런 식으로 뭔가 : 나는 비디오 트리에서 하나 개 이상의 경로를 따라갈 때디코더의 전체 복사본을 만들려면 어떻게해야합니까?

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

가 이미 나는 하나 개의 경로를 따라하기로 결정 때 잘 작동 기본 디코더를 작성했습니다는 문제입니다. 이 시점에서 두 개의 다른 비디오 스트림을 따라 가려면 디코더를 "fork"해야합니다. 분할은 키 프레임 후에 만 ​​발생할 수 있지만 P 프레임 이후에도 AVCodecContext를 복사해야합니다 (내가 avcodec_copy_context을 사용합니다). 그러나 새로운 상태의 디코더를 만드는 것처럼 보입니다. 이전 비디오를 무시하는 것 같습니다. 상태이므로 디코딩 된 P 프레임은 빈 비디오 프레임에 "적용"됩니다. 아마도 avcodec_copy_context을 사용하여 컨텍스트를 복사하는 것으로 충분하지 않습니다 ... 어떤 제안이 있습니까? 어떻게 컨텍스트와 디코더의 전체 상태를 복제 할 수 있습니까? 또는 참조를 사용하여 스트림을 디코딩 할 다른 방법이 있습니까? 감사합니다.

+0

AVCodecContext의 전체 복사본을 만드는 방법을 찾지 못하셨습니까? – zahirdhada

답변

3

documentation에 따르면 : "결과 대상 코덱 컨텍스트는 열지 않습니다. 즉,이 AVCodecContext를 사용하여 비디오/오디오 데이터를 디코딩/인코딩 할 수 있으려면 먼저 avcodec_open()을 호출해야합니다."

그래서 다른 디코더에있는 지점으로 가려면 스트림을 열고 같은 위치 (av_seek_frame)를 찾아야 할 것입니다.

또는 나중에 포크해야하는 경우 처음부터 여러 개의 디코더를 병렬로 유지 관리 할 수 ​​있습니다. 병렬로 몇 개의 경로 만 있으면이 옵션을 사용할 수 있습니다.

또는 하나의 디코더 만 사용하고 예를 들어 주위를 탐색하십시오. 언제든지 단일 경로 만 표시해야하는 경우 DVD 메뉴 구조를 사용하십시오.

+0

원시 라이브 스트림을 디코딩 중이므로'AVFormatContext'가 없으므로'av_seek_frame()'이 작동하지 않습니다. 나도 병렬로 여러 개의 디코더를 생각했지만 비효율적이었다. 다른 아이디어가 있습니까? 감사합니다. – zahirdhada

+0

[이 사용 사례] (https://www.mail-archive.com/[email protected]/msg08024.html)를 말하고 있습니까? 나는 전체 흐름을 저장하고 처음부터 모든 경로에 대해 작업 할 것입니다. 또는 스트림을 좀 더 친숙하고 검색 가능한 형식으로 다시 인코딩하려고하면 – azt

+0

네, 그게 내 사용 사례입니다. – zahirdhada

관련 문제