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

  • 相关阅读:
    SpringBoot入门1
    git
    Linux 常用命令
    Linux虚拟机上安装redis
    用户登录(Material Design + Data-Binding + MVP架构模式)实现
    【方法总结】创建、读取、删除文件相关操作
    从源码角度入手实现RecyclerView的Item点击事件
    App启动页倒计时功能
    App内切换语言
    GreenDao与ReactiveX的完美搭配
  • 原文地址:https://www.cnblogs.com/chyshx/p/13235333.html
Copyright © 2011-2022 走看看