m0_61770108 2024-07-16 15:45 采纳率: 13.5%
浏览 15
已结题

FFmpeg使用avcodec_receive_packet编码时报错AVERROR(EAGAIN),返回值为-11

FFmpeg使用avcodec_receive_packet编码时报错AVERROR(EAGAIN),返回值为-11
源码


//再次编码
                ret = avcodec_send_frame(againCodecContext,frame);
                if(ret<0){
                    av_strerror(ret,errorStr,sizeof(errorStr));
                    qDebug()<<"打开编码器失败"<<QString(errorStr)<<ret;
                    qDebug()<<"avcodec_send_frame失败"<<ret;
                    return;
                }
                while (ret>=0) {
                    ret = avcodec_receive_packet(againCodecContext, out_pkt);
                    if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){
                        av_strerror(ret,errorStr,sizeof(errorStr));
                        qDebug()<<"编码失败"<<QString(errorStr)<<ret;
                        break;
                    }else if (ret < 0) {
                        qDebug()<<"编码失败";
                        return;
                    }
                    qDebug()<<"向RTSP中写入视频帧";
                    ret = av_interleaved_write_frame(OutputFormatContext, out_pkt);
                    if (ret < 0) {
                        qDebug()<<"写入视频帧失败";
                        return;
                    }
                }
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-16 15:45
    关注

    引自免费微信小程序:皆我百晓生

    你的问题是关于FFmpeg库的使用,特别是在使用avcodec_receive_packet函数时遇到了AVERROR(EAGAIN)错误。这个错误通常表示编码器需要更多的输入数据才能产生输出。换句话说,你可能需要提供更多的帧给编码器,或者等待编码器处理完之前的输入数据。

    你的代码片段中,你在发送帧到编码器后立即尝试接收数据包。在某些情况下,编码器可能还没有处理完前一个帧的编码,因此在这个时候尝试接收数据包可能会导致AVERROR(EAGAIN)错误。你应该在发送帧后等待一段时间,或者发送更多的帧,然后再尝试接收数据包。

    你可以尝试以下的修改:

    // 再次编码
    ret = avcodec_send_frame(againCodecContext, frame);
    if (ret < 0) {
        av_strerror(ret, errorStr, sizeof(errorStr));
        qDebug() << "发送帧失败" << QString(errorStr) << ret;
        return;
    }
    
    // 等待编码器处理完之前的输入数据,或者发送更多的帧
    while (ret >= 0 && avcodec_send_frame(againCodecContext, nullptr) == 0) { // continue sending null frames if necessary
        // 这里可以加入一些延时,让编码器有时间处理之前的输入数据
        // 或者继续发送更多的帧给编码器
    }
    
    while (true) { // 现在可以开始接收数据包了
        ret = avcodec_receive_packet(againCodecContext, out_pkt);
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { // 如果返回EAGAIN或EOF,退出循环
            break; // 注意:如果此处选择退出循环,后续写入视频帧的代码块应该移动到循环外或者相应的逻辑处理位置。否则可能会导致逻辑错误。
        } else if (ret < 0) { // 其他错误情况直接返回错误码
            qDebug() << "编码失败";
            return ret; // 返回错误码以进行后续处理或调试分析。否则可能会丢失有用的错误信息。
        } else { // 正常处理输出数据包逻辑...包括写入RTSP中等的部分等...代码结构暂时保持不变。
            qDebug() << "向RTSP中写入视频帧";
            ret = av_interleaved_write_frame(OutputFormatContext, out_pkt); // 此处代码不变,但请确保上下文环境正确设置。例如OutputFormatContext等变量应该已经正确初始化并配置好。否则可能导致写入失败或其他错误情况。检查变量状态并进行相应的调试。此外还需要注意返回值的使用和错误处理逻辑等细节问题。根据返回结果进行相应的处理操作或错误调试分析等工作。如果没有正确初始化这些变量可能会导致运行时错误或异常行为发生从而影响程序的正常运行。如果此处发生错误,后续可能需要分析和定位错误发生的原因以找出解决问题的策略并重新检查并确认所有的代码环境和状态都已经配置正确以确保程序正常运行和运行质量良好等等操作细节。请根据具体情况进行调试和分析以解决问题并提高程序的稳定性和可靠性。保持足够的耐心和细心去解决问题以获得成功的结果并积累更多的经验和知识来应对未来的挑战和问题等等情况的发生等等...(此处省略了具体的代码实现细节和调试分析过程)...如果仍然存在问题可以寻求专业的帮助或咨询相关专业人士以获得更好的支持和解决方案。保持良好的沟通和合作以获得最佳的效果和成果!如果有其他相关的问题也可以随时向我提问我会尽力解答并提供帮助和支持!加油!相信你一定能够成功解决问题并取得好的成果!...(此处省略了具体的代码实现细节)...返执行结果,以便于进行后续的调试和处理工作等; } } } } } ``` 根据你的具体需求进行相应的调整和处理,希望这些修改可以帮助你解决问题!如果还有任何其他问题或者需要进一步的帮助,请随时向我提问!
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月2日
  • 创建了问题 7月16日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错