代码之家  ›  专栏  ›  技术社区  ›  Spredzy

ffmpeg和qt,找不到适合“>”的输出格式

  •  1
  • Spredzy  · 技术社区  · 15 年前

    我试图通过qt执行ffmpeg操作

    我想执行这一行:

    ./ffmpeg -t 10 -i temp1 -f mpeg  -  >  temp2
    

    当我通过终端执行时,它工作得非常好。

    当我通过qt这样启动它时:

     QProcess    *process = new QProcess();
    
     QString parameters("./ffmpeg -t 10 -i temp1 -f mpeg  - >  temp2");
     std::cout << process->execute(parameters) << std::endl;
    

    我得到了一个 Unable to find a suitable output format for '>' 有人知道为什么吗?

    4 回复  |  直到 15 年前
        1
  •  2
  •   mosg    15 年前

    下面是另一个例子:

    QProcess p;
    p.start("./ffmpeg", QStringList() << "-t 10" << "-i temp" << "-f mpeg");
    p.waitForFinished();
    qDebug() << p.readAllStandardOutput();
    

    在哪里? p.ReadAllStandardOutput() 是一个 QBYTAR射线 您可以使用从流程的标准输出中读取的所有数据,例如将它们写入文件:

    QFile file("out.txt");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return;
    
    QTextStream out(&file);
    out << p.readAllStandardOutput();
    
    file.close();
    
        2
  •  2
  •   Matthew Flaschen    15 年前

    在shell中键入原始命令时,ffmpeg将输出到stdout。外壳解释 > 重定向操作符,因此输出被发送到temp2。ffmpeg最后看到的是-。

    当您使用这样的qprocess时,没有shell,因此ffmpeg可以看到 > 和temp2作为参数,它并不像你期望的那样解释。在这种情况下,有一个简单的解决方案。只需将ffmpeg输出到temp2而不是stdout:

    QString parameters("./ffmpeg -t 10 -i temp1 -f mpeg temp2");
    std::cout << QProcess::execute(parameters) << std::endl;
    

    在其他情况下,可能需要显式执行shell,例如:

    QStringList paramList;
    paramList << "-c" << "./ffmpeg -t 10 -i temp1 -f mpeg  - >  temp2";
    std::cout << QProcess::execute("sh", paramList) << std::endl;
    

    请注意,qprocess::execute是静态的,因此不需要实例(无论您如何调用execute,这都适用)。

        3
  •  1
  •   Frank Osterfeld    15 年前

    另一句话:最好总是使用qstringlist变量来传递参数,而不是简单的字符串,否则很快就会遇到引用问题,特别是在windows中,路径中带有空格的情况很常见。qstringlist变体做了正确的事情(tm)。

        4
  •  0
  •   kbyrd    15 年前

    从shell运行此命令时,shell将“>temp 2”解释为重定向,从不将其传递给ffmpeg进程。当你奔跑 process->execute() 这个函数在 ./ffmpeg 作为命令行参数。如果真的需要shell重定向,则需要运行一个新的shell并让该shell执行命令行。这可能有效:

    QString parameters("/bin/sh -c '/ffmpeg -t 10 -i temp1 -f mpeg  - >  temp2'");
    std::cout << process->execute(parameters) << std::endl;
    

    我不熟悉qt的引用规则,所以这可能不能完美地工作,但基本上您希望 /bin/sh -c 然后引用实际要运行的命令,包括stdout重定向。