zoukankan      html  css  js  c++  java
  • unable to find a suitable output for 'i'一种情况的解决办法

    问题的可能原因:

    可能是传递给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的问题,查了好久没有所以然,后来想到输入是不是有问题,遂定位到问题。

  • 相关阅读:
    stm32串口通讯
    Java中日期处理
    Java中synchronized同步的理解
    由代理模式到AOP的实例分析
    基数排序(RadixSort)
    桶排序(BucketSort)
    计数排序
    快速排序
    6.5 k个已排好序链表合并为一个排序链表
    优先队列 (堆实现)
  • 原文地址:https://www.cnblogs.com/chyshx/p/13235333.html
Copyright © 2011-2022 走看看