FFmepg avcodec_receive_frame函数分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmepg avcodec_receive_frame函数分析相关的知识,希望对你有一定的参考价值。

int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
/*
brief:从解码器中获取解码的输出数据
*/
@参数 avctx 编码上下文
@参数 frame 这将会指向从解码器分配的一个引用计数的视频或者音频帧(取决于解码类型)
@注意该函数在处理其他事情之前会调用av_frame_unref(frame)

@返回值
0:成功,返回一帧数据
AVERROR(EAGAIN):当前输出无效,用户必须发送新的输入
AVERROR_EOF:解码器已经完全刷新,当前没有多余的帧可以输出
AVERROR(EINVAL):解码器没有被打开,或者它是一个编码器
其他负值:对应其他的解码错误

代码例子
avcodec_send_packet和avcodec_receive_frame调用关系并不一定是一对一的,比如一些音频数据一个AVPacket中包含了1秒钟的音频,调用一次avcodec_send_packet之后,可能需要调用25次 avcodec_receive_frame才能获取全部的解码音频数据,所以要做如下处理:

int re = avcodec_send_packet(codec, pkt);
if (re != 0)
{
    return;
}

while( avcodec_receive_frame(codec, frame) == 0)
{
    //读取到一帧音频或者视频
    //处理解码后音视频 frame
}


根据上面的评论,下面的代码是否有问题,当前只是处理视频帧数据
while(1)
{
     int nRet = avcodec_send_packet(pAVCodecContext, packet);
     if (0 != nRet)    continue;

     if (avcodec_receive_frame(pVideoc->m_pAVCodecContext, pFrame) != 0) continue;
}



参考
http://www.bubuko.com/infodetail-2106896.html

以上是关于FFmepg avcodec_receive_frame函数分析的主要内容,如果未能解决你的问题,请参考以下文章

ffmepg avcodec版本查询

2023-02-19:请用go语言调用ffmepg,输出视频文件信息。

FFmepg avcodec_receive_frame函数分析

使用ffmepg下载m3u8流媒体

Ubuntu下编译Android版本的ffmepg so库及源码

FFmepg AV_CODEC_FLAG_GLOBAL_HEADER问题描述