3

一連の nal ユニットを ffmpeg (libavcodec) でデコードしようとしましたが、「フレームなし」エラーが発生します。x264 C API を使用して一連の画像を H264 にエンコードするにはどうすればよいですか?のガイドラインに従って最終的なユニットを作成しました。. デコードのために次の戦略を試しました。

avcodec_init();  
avcodec_register_all();  
AVCodec* pCodec;  
pCodec=lpavcodec_find_decoder(CODEC_ID_H264);  
AVCodecContext* pCodecContext;  
pCodecContext=lpavcodec_alloc_context();  
avcodec_open(pCodecContext,pCodec);  
AVFrame *pFrame;  
pFrame=avcodec_alloc_frame();
//for every nal unit:    
    int frameFinished=0;  
    //nalData2 is nalData without the first 4 bytes
    avcodec_decode_video(pCodecContext,pFrame,&frameFinished,(uint8_t*) nalData2,nalLength);

取得したすべてのユニットをこのコードに渡しましたが、frameFinished は 0 のままです。pCodecContext のセットアップに何か問題があるに違いないと思います。誰かが私に実際の例を送ってもらえますか?

ありがとうございました

4

2 に答える 2

4

このチュートリアルをチェックしてください。H.264を含むすべてのビデオタイプをデコードできるはずです。

http://dranger.com/ffmpeg/

av_read_frame何が問題を引き起こしているのか正確にはわかりませんが、フレームに相当するデータを一度に解析するためにfromlibavformatを使用していないという事実と関係があるのではないかと思います。H.264には、フレームを複数のスライスに分割する機能があるため、複数のNALユニットに分割できます。

x264エンコーダーはデフォルトではこれを行わず、フレームごとに1つのNALユニットを生成すると確信しています。ただし、デコーダーに供給する必要のある他のストリーム情報を持つNALユニットがあります。私は過去にこれを実験しましたがav_read_frame、フレームに相当するデータを解析すると、複数のNALユニットが含まれることがあります。チュートリアルを注意深くフォローし、それが機能するかどうかを確認することをお勧めします。

avcodec_decode_videoもう1つは、NALユニットの最初の4バイトを、それが話している開始コードである場合に渡す必要があると思うことです( 0x00000001)。からの出力を調査したav_read_frame後、デコーダーに渡されたとき、開始コードはまだデータに残っています。

于 2010-07-20T03:32:28.977 に答える
1

コーデック コンテキストのインスタンス化コードの後に​​これを試してください。

  if(pCodec->capabilities & CODEC_CAP_TRUNCATED)
      pCodecContext->flags |= CODEC_FLAG_TRUNCATED; /* We may send incomplete frames */
  if(pCodec->capabilities & CODEC_FLAG2_CHUNKS)
      pCodecContext->flags2 |= CODEC_FLAG2_CHUNKS;
于 2013-08-01T05:57:42.200 に答える