解决:avformat_write_header();打开失败的问题

打开成功  :avio_open(&pFormatCtx_Out->pb, outFileName, AVIO_FLAG_WRITE); 

但是,avformat_write_header(pFormatCtx_Out, NULL); 写头,失败。返回 -22

[mp4 @ 02ae5a00] Using AVStream.codec.time_base as a timebase hint to the muxer is 
deprecated. Set AVStream.time_base instead.
[mp4 @ 02ae5a00] Could not find tag for codec none in stream #0, codec not currently 
supported in container

解决第一个bug:   stream->codec->time_base ,这个形式,已经不行了。直接 stream->time_base,赋值即可。

pVideoStream->time_base.den = pCodecCtx_out->time_base.den;
pVideoStream->time_base.num = pCodecCtx_out->time_base.num;

解决第二个bug: 

不能在container(如MP4、TS等封装格式)的相应流中找到编码器信息,找不到的原因可能会有很多,主要有参数设置不对,音视频流的id错误或是ffmpeg库中不支持此编码方式等。跟踪调试数据发现流中的编码器信息没有具体值,在avcodec_open2 成功之后,利用avcodec_parameters_from_context将编码器的参数赋值给AVStream中的codecpar字段,同时要把编码器复制过去。问题解决,运行成功!

avcodec_parameters_from_context(pVideoStream->codecpar, pCodecCtx_out);
pVideoStream->codec->codec = pCodecCtx_out->codec;

原题重现:

  1. 刚开始,只写了红框内容,且黄色部分是:stream->codec->time_base;
  2. 后来改成了现在黄框内的部分,解决了第一个问题。
  3. 然后添加了绿色部分的第一行,其他都注释带,依然编译不过去,因为找不到stream->codec->codec
  4. 再然后,加上绿框的第二行代码,顺利打开。
  5. 最后好奇心重的我,把下面的部分的注释都去掉了,发现也能编译过去。 

`avformat_write_header()` 函数是用于写入音视频文件头信息的,如果它返回 "Invalid argument" 错误,通常是因为传入的参数有误或不完整。 一些可能的原因和解决办法如下: 1. 检查 AVFormatContext 结构体是否正确初始化。在调用 `avformat_alloc_output_context2()` 创建输出格式上下文后,需要设置 `AVFormatContext` 的一些参数,如 `AVCodec`, `AVStream`, `AVOutputFormat` 等。如果这些参数没有正确设置,就会导致 `avformat_write_header()` 函数报错。你可以通过调用 `av_dump_format()` 打印 `AVFormatContext` 结构体的详细信息,以检查它是否正确初始化。 2. 检查 AVStream 结构体是否正确设置。在输出音视频流之前,需要设置每个 `AVStream` 的一些参数,如编解码器、帧率、分辨率等。如果这些参数没有正确设置,就会导致 `avformat_write_header()` 函数报错。你可以通过调用 `avcodec_parameters_from_context()` 或 `avcodec_parameters_copy()` 将编解码器参数从 `AVCodecContext` 复制到 `AVStream` 中。 3. 检查输出文件是否已经打开。在调用 `avformat_write_header()` 之前,需要通过调用 `avio_open()` 或 `fopen()` 等函数打开输出文件。如果输出文件没有正确打开,就会导致 `avformat_write_header()` 函数报错。 4. 检查输出文件是否已经写入。在调用 `avformat_write_header()` 之前,需要保证输出文件还没有写入任何数据。如果输出文件已经写入了数据,就会导致 `avformat_write_header()` 函数报错。你可以通过调用 `avio_seek()` 将文件指针移动到文件开头,以确保文件没有写入任何数据。 希望这些解决方案能够帮助你解决问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值