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

FFmpeg7中使用avcodec_send_frame()失败,返回值为-22

FFmpeg7中使用avcodec_send_frame()失败,返回值为-22
报错输出:

avcodec_send_frame失败 -22

源码:

againCodec = avcodec_find_decoder(InputFrame->codecpar->codec_id);
    if(!againCodec){
        qDebug()<<"查找二次编码解码器失败";
        return;
    }
    againCodecContext = avcodec_alloc_context3(againCodec);
    if(!againCodecContext){
        qDebug()<<"保存二次编码解码器信息失败";
        return;
    }

    if(avcodec_parameters_to_context(againCodecContext,InputFrame->codecpar)){
        qDebug()<<"保存编码器失败";
        return;
    }
    if(avcodec_open2(againCodecContext,againCodec,NULL)<0){
        qDebug()<<"打开编码器失败";
        return;
    }

while (av_read_frame(InputFormatContext,InputPacket) >= 0) {
        if(InputPacket->stream_index == InputVideoStream){
            //自定义时间戳
            // InputPacket->pts = 0;
            // InputPacket->dts = InputPacket->pts;

            //重新编解码
            int ret = avcodec_send_packet(OutputCodecContext,InputPacket);
            if(ret < 0){
                qDebug()<<"发送数据包失败";
                return;
            }
            while (ret >= 0) {
                AVFrame *frame;
                frame = av_frame_alloc();
                AVPacket *out_pkt = av_packet_alloc();
                ret = avcodec_receive_frame(OutputCodecContext,frame);
                if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){
                    break;
                }else if (ret < 0) {
                    qDebug()<<"结束解码后的数据包失败";
                    return;
                }
                frame->pts = timeStamp;
                //时间戳递增
                timeStamp++;
                qDebug()<<"时间戳"<<timeStamp;

                //再次编码
                ret = avcodec_send_frame(againCodecContext,frame);
                if(ret<0){
                    qDebug()<<"avcodec_send_frame失败"<<ret;
                    return;
                }
                while (ret>0) {
                    ret = avcodec_receive_packet(againCodecContext, out_pkt);
                    if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){
                        break;
                    }else if (ret < 0) {
                        qDebug()<<"编码失败";
                        return;
                    }
                    ret = av_interleaved_write_frame(OutputFormatContext, out_pkt);
                    if (ret < 0) {
                        qDebug()<<"写入视频帧失败";
                        return;
                    }
                }
            }

        }
    }


调试查看againCodecContext和frame

img

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-15 16:22
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    错误代码 -22 对应于 FFmpeg 中的 AVERROR_UNKNOWN,这通常表示一个未知的错误。在您提供的代码和截图信息中,我们可以进行一些基本的分析和建议,帮助您解决这个问题。

    1. 检查帧的完整性和有效性

      • 根据提供的截图,framedata 指针指向了具体的数据,但是没有足够的信息来判断数据是否完整或有效。确保帧数据没有损坏,并且大小合适。
    2. 检查编码器和解码器的配置

      • 确保 againCodecContext 被正确配置,并且与 frame 兼容。检查 avcodec_parameters_to_contextavcodec_open2 是否成功执行,并且没有返回错误。
    3. 检查时间戳的处理

      • 您的代码中对时间戳的处理看起来是正确的,但是要确保 timeStamp 被正确设置并且递增,以便帧能够按照正确的顺序进行编码。
    4. 检查错误处理逻辑

      • 您的代码中有错误处理逻辑,但是可能需要更详细的错误信息来帮助诊断问题。例如,您可以使用 av_strerror 函数来获取错误代码对应的更详细的文本描述。
    5. 优化编码和解码流程

      • 审查整个编码和解码流程,确保逻辑正确,没有遗漏或错误。例如,确保在发送帧之前,编码器已经准备好接收帧。
    6. 查阅FFmpeg社区和文档

      • 访问 FFmpeg 的邮件列表、论坛或文档,查找是否有其他人遇到类似问题以及他们是如何解决的。
    7. 更新FFmpeg版本

      • 如果您使用的是较旧的 FFmpeg 版本,考虑更新到最新版本,因为新版本可能修复了旧版本中的bug。
    8. 编写单元测试

      • 编写单元测试可以帮助您验证 avcodec_send_frame() 在不同情况下的行为,确保您的代码在各种输入下都能正常工作。
    9. 寻求专业帮助

      • 如果您尝试了上述所有步骤仍然无法解决问题,可能需要寻求 FFmpeg 社区或专业开发者的帮助。

    此外,您提供的截图信息显示了帧的一些属性,但是没有显示完整的帧数据。如果可能的话,检查帧的 nb_sampleslinesize[0] 等属性,确保它们是您期望的值。如果这些属性不正确,可能会导致 avcodec_send_frame() 失败。

    最后,您的代码中使用了 qDebug() 来输出错误信息,这是一个很好的做法,但是请确保这些调试信息能够被正确捕获和查看,以便进行问题诊断。

    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

  • ¥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报错