(C)avcodec_receive_frame(ffmpeg)函数总是返回AVERROR(EAGAIN)



我一直在学习本教程:http://dranger.com/ffmpeg/tutorial01.html并试图更改一些不推荐使用的函数,因此我不得不尝试使用avcodec_send_packetavcodec_receive_frame函数。

我遇到的问题是avcodec_receive_frame总是返回AVERROR(EAGAIN)

我的解码功能如下:

static int decode(AVCodecContext *pCodecCtx, AVFrame *pFrame, AVPacket *packet) {

int ret = avcodec_send_packet(pCodecCtx, packet);
if (ret<0) {
fprintf(stderr, "error sending packet for decodingn");
exit(1);
}
while (ret>=0) {        
// avcodec_receive_packet(pCodecCtx, NULL);
ret = avcodec_receive_frame(pCodecCtx, pFrame);
if (ret == AVERROR(EAGAIN)) {
fprintf(stderr, "naverror(eagain) ret = %dn", ret);
return -1;
}
else if (ret == AVERROR_EOF) {
fprintf(stderr, "eofn");
return -100;
}
else if (ret <0) {
fprintf(stderr, "error during decodingn");
exit(1);
}
}
return 0;
}

我读到的每一篇文章都说,这可以通过在下一帧中调用avcodec_send_packet来解决,但这并不能解决我的问题,因为这个函数是在循环中调用的:


while (av_read_frame(pFormatCtx, &packet)>=0) {
// is this a packet from the video stream?
if (packet.stream_index==videoStream) {
frameNotFinished = decode(pCodecCtx, pFrame, &packet);
// did we get a video frame?
if (!frameNotFinished) fprintf(stderr, "it worked!");
}
av_packet_unref(&packet);   
}

我可能还应该补充一点,avcodec_send_packet总是返回0(成功(。

任何帮助都将不胜感激。

当你真正得到一帧(ret==0(时,你永远不会回来

另一方面,如果返回,在获得AVERROR(EAGAIN(之前,您实际上不会"解码"所有帧,这意味着您可能会丢失一些帧。所以,我想你首先必须决定你到底想做什么

(我想你只需要在这段时间内(ret>=0(有你的"过程"功能,如果你有ret==0,你就做你做的任何事情(

过程如下。。。。

  1. 您对数据包进行解复用[av_read_frame]
  2. 如果是X视频流数据包,则将其发送到解码器[avcodec_send_packet]
  3. 您尝试解码并接收所有可用的AVFrames(如果有([avcodec_receive_frame]

3.1(如果没有可用的帧,您将收到AVERROR(EAGAIN(,并且您必须向解码器发送更多数据包(返回步骤1(

3.2(如果有可用的帧,则对其进行avcodec_receive_frame,直到获得AVERROR(EAGAIN(

最新更新