0

こんにちは、 GitHubの OpenMax コンポーネントと hello_video の例を使用してビデオをデコードしようとしています。私は単純に video.c を編集し、AVFormat の「main frame while」を置き換えます。(私はmp4、mov、mkvを読む必要があります....)。したがって、ffmpegで生成したtest.h264ファイルと他のファイルでは、すべて正常に動作し、画面上で映画を見ることができます。

ffmpeg -i file.mp4 -vcodec copy -vbsf h264_mp4toannexb out.h264

しかし、test.mp4 ファイルを開くと、画面に画像が表示されず、コンソールにログインすると、データが正しく読み取られ、ビデオ デコーダの入力バッファに正しく解析されたことが示されます。2回目のテストで画面に何も表示されない理由を説明できますか?

    do{
    printf("###before DO!\n");
status=av_read_frame(pFormatCtx,&packet);
//only for video
if(packet.stream_index==*video_stream_index){
printf("=>Read frame, status: %d, index: %d, stream index: %d, packet duration: %d, size: %d\n",pstatus,index++,packet.stream_index,packet.duration,packet.size);
int psize=packet.size;
int preaded=0;
double pts=packet.duration;
while(psize!=0){
     buf = ilclient_get_input_buffer(video_decode, 130, 1);
      buf->nFlags = 0;
      buf->nOffset = 0;
      uint64_t val = (uint64_t)(pts == DVD_NOPTS_VALUE) ? 0 : pts;
     if(first_frame==true){buf->nFlags = OMX_BUFFERFLAG_STARTTIME;first_frame=false;}else{buf->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;}
buf->nTimeStamp = ToOMXTime(val);
buf->nFilledLen = (psize > buf->nAllocLen) ? buf->nAllocLen : psize;
memcpy(buf->pBuffer, packet.data+preaded,buf->nFilledLen);
psize-=buf->nFilledLen;
preaded+=buf->nFilledLen;
     if(psize == 0){buf->nFlags|=OMX_BUFFERFLAG_ENDOFFRAME;printf("#######################################OMX_BUFFERFLAG_ENDOFFRAME\n");}
printf("=>BUFF size: %d\n",buf->nFilledLen);
OMX_ERRORTYPE r;
if(pstatus==0){if(r=OMX_EmptyThisBuffer(ILC_GET_HANDLE(video_decode), buf) != OMX_ErrorNone){status = -6;printf("Failed, OMX_EmptyThisBuffer, error: 0x%08x , buf allocate: %d, buf lenght: %d \n", r,buf->nAllocLen,buf->nFilledLen);break;}}
}//while psize
av_free_packet(&packet);
   }//if index  
}//do
while(pstatus==0);
4

1 に答える 1

0

コンソールにログインすると、データが正しく読み取られ、ビデオ デコーダの入力バッファに正しく解析されていることがわかります

それはどういう意味ですか?ほとんどの場合、mp4 からデミックスされたパケットは、OMX デコーダーによって予期される .h264 ファイル (ストリーム) 形式の自然な形式である annex-b 形式ではありません。したがって、NALU を読み取った後、ヘッダーを 00000001 (最後の 1 ビットがオンになっている 4 バイト) に置き換えれば、幸運になる可能性があります。

その他の考慮事項: デコーダーは、最初の I フレームで SPS/PPS を予期する場合と予期しない場合があります。

更新: LLVM テスト スイートには、まさにこれを行うC ソース ファイルがあります。逆の変換 (Annex B から NALU へ) を行う参照 AVC/h264実装にも興味があるかもしれません。

于 2013-02-05T21:05:34.077 に答える