m0_61770108 2024-06-06 09:48 采纳率: 13.5%
浏览 4
已结题

QT+FFmpeg转存rtsp中的视频流,写入头文件失败

QT+FFmpeg转存rtsp中的视频流,写入头文件失败
源码如下:


//打开输出文件并填充格式数据
    if(avformat_alloc_output_context2(&outFmtCtx,NULL,NULL,outFileName)<0){
        printf("Cannot alloc output file context.\n");
        return;
    }
    //打开输出文件并填充数据
    if(avio_open(&outFmtCtx->pb,outFileName,AVIO_FLAG_READ_WRITE)<0){
        printf("output file open failed.\n");
        return;
    }
    //在输出的mp3文件中创建一条视频流
    AVStream *outAStream = avformat_new_stream(outFmtCtx,NULL);//记录视频流通道数目。存储视频流通道。
    if(!outAStream){
        printf("Failed allocating output stream.\n");
        return ;
    }
    outAStream->time_base.den=25;//AVRational这个结构标识一个分数,num为分数,den为分母(时间的刻度)
    outAStream->time_base.num=1;
    outAStreamIndex=outAStream->index;

    //查找编码器
    AVCodec *outCodec =  const_cast<AVCodec*> (avcodec_find_decoder(codecPara->codec_id));
    if(outCodec==NULL){
        printf("Cannot find any encoder.\n");
        return;
    }

    //从输入的h264编码器数据复制一份到输出文件的编码器中
    AVCodecContext *outCodecCtx=avcodec_alloc_context3(outCodec); //申请AVCodecContext空间。需要传递一个编码器,也可以不传,但不会包含编码器。
    //AVCodecParameters与AVCodecContext里的参数有很多相同的
    AVCodecParameters *outCodecPara = outFmtCtx->streams[outAStream->index]->codecpar;

    if(avcodec_parameters_copy(outCodecPara,codecPara)<0){
        printf("Cannot copy codec para.\n");
        return;
    }
    if(avcodec_parameters_to_context(outCodecCtx,outCodecPara)<0){
        printf("Cannot alloc codec ctx from para.\n");
        return ;
    }
    outCodecCtx->bit_rate =0;//目标的码率,即采样的码率;显然,采样码率越大,视频大小越大  比特率
    outCodecCtx->time_base.num=1;//下面两行:一秒钟25帧
    outCodecCtx->time_base.den=15;
    outCodecCtx->frame_number=1;//每包一个视频帧

    //打开输出文件需要的编码器
    if(avcodec_open2(outCodecCtx,outCodec,NULL)<0){
        printf("Cannot open output codec.\n");
        return ;
    }
    printf("============Output Information=============>\n");
    av_dump_format(outFmtCtx,0,outFileName,1);//输出视频信息
    printf("============Output Information=============<\n");

    //写入文件头
    if(avformat_write_header(outFmtCtx,NULL)<0){
        printf("Cannot write header to file.\n");
        return ;
    }

报错如下:

img

  • 写回答

2条回答 默认 最新

  • IT工程师_二师兄 2024-06-06 09:52
    关注

    嗯,你失败的那个报错代码,还有那个报错的代码,行,你都复制出来发给我

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月20日
  • 创建了问题 6月6日

悬赏问题

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