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 ;
}
报错如下: