0%

FFmpeg新老API

变化:

  • 不需要要调用注册方法。
  • 简化了流程。
  • 语义更准确。

avcodec_decode_video2

原本的解码函数被拆解为两个函数avcodec_send_packet()avcodec_receive_frame()具体用法如下:

1
2
3
4
5
6
// old:
avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);

// new:
avcodec_send_packet(pCodecCtx, pPacket);
avcodec_receive_frame(pCodecCtx, pFrame);

codec_encode_video2

对应的编码函数也被拆分为两个函数avcodec_send_frame()avcodec_receive_packet()具体用法如下:

1
2
3
4
5
6
// old:
avcodec_encode_video2(pCodecCtx, pPacket, pFrame, &got_picture);

// new:
avcodec_send_frame(pCodecCtx, pFrame);
avcodec_receive_packet(pCodecCtx, pPacket);

avpicture_get_size

现在改为使用av_image_get_size() 具体用法如下:

1
2
3
4
5
6
// old:
avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

// new:
// 最后一个参数align这里是置1的,具体看情况是否需要置1
av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

avpicture_fill

现在改为使用av_image_fill_arrays 具体用法如下:

1
2
3
4
5
6
// old:
avpicture_fill((AVPicture *)pFrame, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

// new:
// 最后一个参数align这里是置1的,具体看情况是否需要置1
av_image_fill_arrays(pFrame->data, pFrame->linesize, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1);

codec

关于codec问题有的可以直接改为codecpar,但有的时候这样这样是不对的,所以我也还在探索,这里记录一个对pCodecCtx和pCodec赋值方式的改变

1
2
3
4
5
6
7
8
9
// old:
pCodecCtx = pFormatCtx->streams[video_index]->codec;
pCodec = avcodec_find_decoder(pFormatCtx->streams[video_index]->codec->codec_id);

// new:
// 把参数从AVCodecParameters拷贝到AVCodecContext
pCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[video_index]->codecpar);
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

欢迎关注我的其它发布渠道