如何使用ffmpeg复制其他帧缓冲区

问题描述

我有一个其他位置的镜框复制问题。

我从h264 / mp4获得了1280 640解码帧(YUV420),我想将4帧合并到2560 1280帧缓冲区。如下。

enter image description here

代码是这样的,但是不起作用。

在此处输入代码

/ * pCodecCtx和pFrame用于解码的帧信息* / int Encoding2JPEG(AVCodecContext * pCodecCtx,AVFrame * pFrame,int FrameNo,int Quality) {

    int gotFrame;

    /* New Context for JPEG encoding */
    AVCodec *jpeg_codec = NULL;
    AVCodecContext *jpeg_ctx =NULL;
    int ret;
    AVPacket *packet;
    packet = av_packet_alloc();
    if(!packet)
    {
            printf("alloc fail!\n");
            return -1;
    }

    if(frame)
            printf("received frame for encoding %3"PRId64"\n",frame->pts);

    pFrame_gather = av_frame_alloc();
    if(!pFrame_gather)
    {
            printf("Could not allocate gater frame!\n");
            return -1;
    }

    pFrame_gather->format = pCodecCtx->pix_fmt;
    pFrame_gather->width = pCodecCtx->width*2;
    pFrame_gather->height = pCodecCtx->height*2;

    if ( av_frame_get_buffer(pFrame_gather,0) < 0)
            printf("Could not allocate the gather frame data!\n");

    /* Buffer Clear */
    ptrdiff_t linesize[4] = { frame->linesize[0],0 };
    if( av_image_fill_black ( pFrame_gather->data,linesize,pCodecCtx->pix_fmt,\
                    AVCOL_RANGE_JPEG,pFrame_gather->width,pFrame_gather->height) != 0 )
            printf("image clear error!\n");

    ret = av_frame_make_writable(pFrame_gather);
    if( ret <0)
                    printf("writeable set fail!\n");

     /* set position of destination */
    int top_band =0;
    int left_band=200;

     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pCodecCtx->pix_fmt);
     int y_shift;
     int x_shift;
     int max_step[4];

     if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
      return -1;

 y_shift = desc->log2_chroma_h;
 x_shift = desc->log2_chroma_w;
 av_image_fill_max_pixsteps(max_step,NULL,desc);
 
 /* Y Data */
 memcpy( pFrame_gather->data[0] + (top_band * pFrame->linesize[0]) + left_band,\
         frame->data[0],pCodecCtx->width*pCodecCtx->height);
 /* U Data */
 memcpy ( pFrame_gather->data[1] + ((top_band >> y_shift) * pFrame->linesize[1]) + \
          (left_band >> x_shift),frame->data[1],pCodecCtx->width/2*pCodecCtx->height/2);
 /* V DAta */
 memcpy ( pFrame_gather->data[2] + ((top_band >> y_shift) * pFrame->linesize[2]) \
          + (left_band >> x_shift),frame->data[2],pCodecCtx->width/2*pCodecCtx->height/2);

 /* unref variable .... */
 ....

}

上部源代码很麻烦。它不起作用。 如何存储带位置的副本?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)