m0_61770108 2024-07-17 09:54 采纳率: 13.5%
浏览 10
已结题

Qt+FFmpeg编解码之后写入到rtsp流文件中,可以运行。在解析过程中报错。

Qt+FFmpeg编解码之后写入到rtsp流文件中,可以运行。在解析过程中报错。

[h264 @ 000001d50b418340] non-existing PPS 1 referenced
[h264 @ 000001d50b418340] decode_slice_header error
[h264 @ 000001d50b418340] non-existing PPS 3 referenced
[h264 @ 000001d50b418340] decode_slice_header error
[h264 @ 000001d50b418340] reference count overflow
[h264 @ 000001d50b418340] decode_slice_header error
[h264 @ 000001d50b418340] no frame!

源码

while (av_read_frame(InputFormatContext,InputPacket) >= 0) {
        if(InputPacket->stream_index == InputVideoStream){
            //重新编解码
            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;
                frame->time_base = InputFrame->time_base;
                //时间戳递增
                timeStamp++;
                qDebug()<<"时间戳"<<timeStamp;

                //再次编码
                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;
                    }

                    ret = av_interleaved_write_frame(OutputFormatContext, out_pkt);
                    qDebug()<<"向RTSP中写入视频帧"<<ret<<"data的大小"<<out_pkt->size;
                    if (ret < 0) {
                        qDebug()<<"写入视频帧失败"<<ret;
                        return;
                    }
                }
            }



        }
    }

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-17 09:54
    关注

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


    根据您提供的代码和错误日志,问题主要集中在解码和编码过程中。错误日志显示FFmpeg在解码H.264视频流时遇到了一些问题,这可能是由于视频流中缺少必要的参数集(PPS和SPS)或者引用了不存在的参数集。以下是一些可能的解决方案:

    1. 确保视频流完整性:检查您的视频源是否完整,特别是确保参数集(PPS和SPS)是否被正确地包含在视频流中。

    2. 检查编解码器配置:确保您使用的编解码器配置正确。对于H.264编码,您需要确保PPS和SPS是正确的,并且已经被包含在编码后的视频流中。

    3. 调整解码器设置:尝试使用不同的解码器设置或参数,例如使用avcodec_decode_video2代替avcodec_receive_frame来获取解码帧。

    4. 错误处理:在您的代码中添加更多的错误处理逻辑,以便在遇到解码错误时能够更好地诊断问题。

    5. 使用FFmpeg的调试工具:使用FFmpeg的日志系统来获取更详细的错误信息。您可以设置日志级别为AV_LOG_DEBUG或更高,以便在解码过程中获得更多的调试信息。

    6. 检查时间戳:确保时间戳的设置是正确的,并且与输入视频流的时间基(time_base)相匹配。

    7. 检查RTSP流的写入逻辑:确保写入RTSP流的逻辑是正确的,并且考虑到了RTSP协议的要求。

    8. 更新FFmpeg库:如果您使用的是较旧版本的FFmpeg,考虑更新到最新版本,因为新版本可能修复了一些已知的问题。

    9. 社区和文档:查阅FFmpeg的文档和社区论坛,看看是否有其他人遇到了类似的问题,并找到了解决方案。

    10. 单元测试:编写单元测试来模拟不同的视频流情况,确保您的代码能够处理各种异常情况。

    请注意,这些只是一些通用的建议,具体的问题可能需要更详细的分析和调试。如果您能够提供更多的上下文信息或者错误日志,我可能能够提供更具体的帮助。

    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

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