嗯,你失败的那个报错代码,还有那个报错的代码,行,你都复制出来发给我
m0_61770108 2024-06-06 10:00
断点调试,在这个地方报错:
//写入文件头
if(avformat_write_header(outFmtCtx,NULL)<0){
printf("Cannot write header to file.\n");
return ;
}
报错代码:
Input #0, rtsp, from 'rtsp://.......... /Streaming/Channels/101?transportmode=unicast&profile=Profile_1':
Metadata:
title : Media Presentation
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: hevc (Main), yuvj420p(pc, bt709), 2560x1440, 25 tbr, 90k tbn, 90k tbc
Stream #0:1: Audio: pcm_alaw, 8000 Hz, 1 channels, s16, 64 kb/s
Output #0, mp4, to '1.mp4':
Stream #0:0: Audio: pcm_alaw, 8000 Hz, 1 channels, s16, 64 kb/s
[mp4 @ 0000024a0624a600] Could not find tag for codec pcm_alaw in stream #0, codec not currently supported in container
上下文代码:
```c++
//打开输出文件并填充格式数据
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_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 ;
}
```
赞
回复