0

H264 でエンコードされたビデオをデコードしようとしています。AVPacket のデータとそのサイズをデコーダ コードに送信しています。フレームをデコードしてGUIに表示しようとしています。問題は、フレームをデコードしているときに、パケットのサイズと同じ数のフレームバイトを返すことであり、データを解凍していないことを意味します。何が問題になるか誰でもわかりますか。私のエンコード プログラムは正常に動作しています。

ここにエンコード用のコードがあります

  static struct SwsContext *img_convert_ctx;
  pkt.data = NULL;   
  pkt.size = 0; 


  avpicture_fill((AVPicture *)srcFrame, frame,AV_PIX_FMT_BGR24, 640, 480);
 if(img_convert_ctx == NULL) {
  int w = 640;
  int h = 480;
  img_convert_ctx = sws_getContext(w, h, 
      AV_PIX_FMT_BGR24, c->width, c->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
   if(img_convert_ctx == NULL) {
    fprintf(stderr, "Cannot initialize the conversion context!\n");
  }
}
  sws_scale(img_convert_ctx, srcFrame->data, srcFrame->linesize, 0,480,picture->data, picture->linesize);


  fflush(stdout);

  picture->pts=counter;


  ret = avcodec_encode_video2(c, &pkt, picture, &got_output);
    if (ret < 0) {
        fprintf(stderr, "Error encoding frame\n");
    }

    if (got_output) {

        vdec.decode_frame(pkt.data ,pkt.size);

        av_free_packet(&pkt);
    }

デコーダーコード...

    int len ,got_frame;

avpkt.size = data_length;

avpkt.data = frame_buffer;

if(!frame_buffer){

return "frame buffer empty\n";

}

len = avcodec_decode_video2(avctx ,frame ,&got_frame ,&avpkt);

if( len < 0){

    return "error while decoding\n";

}

if( got_frame ){

static struct SwsContext *img_convert_ctx;  

 if(img_convert_ctx == NULL) {

  img_convert_ctx = sws_getContext(w, h, 
      PIX_FMT_YUV420P, avctx->width,
      avctx->height, PIX_FMT_BGR24, 
      SWS_BICUBIC, NULL, NULL, NULL);

   if(img_convert_ctx == NULL) {

    return  "Cannot initialize the conversion context!\n";

  }

}

j=sws_scale(img_convert_ctx, 
    frame->data , frame->linesize ,
    0, h ,picture->data,
    picture->linesize );

if(j==0){

exit(1);

}

AVCodecContext や Codec などの他のすべてのコードを他のメソッドに初期化しています。

解決策を見つけるのを手伝ってください。

4

1 に答える 1

0

関数は、avcodec_decode_video2結果の画像のバイト数ではなく、処理されたバイト数を返す必要があります。got_frame完全なフレームをいつデコードしたかを確認するには、 の値を確認するだけです。

于 2013-02-05T11:45:39.530 に答える