变化:
- 不需要要调用注册方法。
- 简化了流程。
- 语义更准确。
avcodec_decode_video2
原本的解码函数被拆解为两个函数avcodec_send_packet()
和avcodec_receive_frame()
具体用法如下:
1 2 3 4 5 6
| avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);
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
| avcodec_encode_video2(pCodecCtx, pPacket, pFrame, &got_picture);
avcodec_send_frame(pCodecCtx, pFrame); avcodec_receive_packet(pCodecCtx, pPacket);
|
avpicture_get_size
现在改为使用av_image_get_size() 具体用法如下:
1 2 3 4 5 6
| avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
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
| avpicture_fill((AVPicture *)pFrame, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
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
| pCodecCtx = pFormatCtx->streams[video_index]->codec; pCodec = avcodec_find_decoder(pFormatCtx->streams[video_index]->codec->codec_id);
pCodecCtx = avcodec_alloc_context3(NULL); avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[video_index]->codecpar); pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
|