avcodec_send_packet返回值
时间: 2023-10-04 21:13:28 浏览: 108
avcodec_send_packet是FFmpeg中的函数,用于向解码器发送数据包进行解码。它的返回值表示发送操作的结果,具体取决于传入的参数和解码器的状态:
- 0:成功发送数据包,解码器已经消耗了该数据包;
- AVERROR(EAGAIN):解码器当前无法处理该数据包,需要等待更多数据;
- AVERROR_EOF:已经发送了解码器的EOF标志,表示没有更多的数据包需要发送;
- 其他负值:表示发送过程中发生了错误。
需要注意的是,avcodec_send_packet并不会等待解码器完成解码操作,因此无法保证解码器是否成功消耗了该数据包。如果需要等待解码器的响应,可以调用avcodec_receive_frame函数。
相关问题
avcodec_send_packet 返回值
avcodec_send_packet 的返回值表示成功发送的数据包数,如果返回值为负数,则表示出现了错误。具体的返回值如下:
- AVERROR(EINVAL): 当输入的 AVPacket 为 NULL 时返回此错误码
- AVERROR(EAGAIN): 当缓冲区已满,需要等待后续操作时返回此错误码
- AVERROR_EOF: 当输入结束时返回此错误码
- 0: 成功发送一个数据包
avcodec_send_packet()和avcodec_receive_frame()函数的源码
avcodec_send_packet()和avcodec_receive_frame()函数的源码如下:
```
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
{
int ret;
if (!avctx || !avpkt)
return AVERROR(EINVAL);
ret = ff_thread_can_start_frame(avctx->internal);
if (ret < 0)
return ret;
ret = avctx->codec->send_packet(avctx, avpkt);
if (ret == AVERROR_EOF)
avctx->internal->draining = 1;
else if (ret == AVERROR(EAGAIN))
avctx->internal->need_context_update = 1;
if (ret < 0)
av_packet_unref(avpkt);
return ret;
}
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
{
int ret;
if (!avctx || !frame)
return AVERROR(EINVAL);
ret = ff_thread_can_start_frame(avctx->internal);
if (ret < 0)
return ret;
ret = avctx->codec->receive_frame(avctx, frame);
if (ret == AVERROR_EOF)
avctx->internal->draining = 1;
else if (ret == AVERROR(EAGAIN))
avctx->internal->need_context_update = 1;
return ret;
}
```
这两个函数都是调用了avctx->codec(即AVCodec结构体中的AVCodecContext)中对应的解码函数(avcodec_send_packet和avcodec_receive_frame)进行实际的数据处理。其中,avcodec_send_packet()函数将AVPacket发送到解码器中进行解码,avcodec_receive_frame()函数从解码器中接收解码后的AVFrame。两个函数都返回处理后的结果,可以根据返回值判断处理是否成功。
阅读全文