问题的可能原因:
可能是传递给avformat_alloc_output_context2()函数的filename参数不对,并不是一个正常的字符串。
问题解决办法:
检查avformat_alloc_output_context2()的输入参数是否都合理。
问题历程:
在使用QT+ffmpeg库做录屏软件时,需要打开一个output文件,用来保录制的视频。在打开输出文件时主要是使用avformat_alloc_output_context2()函数,这个函数需要给他传递输出格式名,以及输出文件名称,这些类型都是const char*。
一般而言,我们可能是通过参数化来传递给输出文件名称,所以可能存在需要将QString类型转换层const char*的操作,QT中支持这种操作,一般可以通过 para_filename.toStdString().c_str()来将QString类型的para_filename转换成const char* 类型。
逻辑上似乎都合理,但是偶尔情况下,可能会发生如标题所示的问题。很是奇怪,错误日志提示我们output怎么变成了‘i’,通过输出日志发现para_filename.toStdString().c_str()的转换并非按照我们的逻辑来的,因为.c_str()调用对象是一个由toStdString()生成的临时对象,很有可能在c_str()调用前已经被析构释放了,导致最后转换的结果并非我们所期望的。所以解决办法就是分开成两步:(1).定义std::string类型变量,并先由QString->std::string,(2).定义const char*类型变量,并从std::string->const char*。
通过上述两个步骤就可保证字符串类型的顺利及可靠的转换,传递给avformat_alloc_output_context2()函数的参数不再是错误的了。
一度以为是ffmpeg的问题,查了好久没有所以然,后来想到输入是不是有问题,遂定位到问题。