FFmpeg和qt,无法为'>'找到合适的输出格式

时间:2010-04-29 12:48:47

标签: qt ffmpeg

我正在尝试通过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 个答案:

答案 0 :(得分:2)

在shell中键入原始命令时,ffmpeg输出到stdout。 shell解释>重定向运算符,因此输出发送到temp2。 ffmpeg看到的最后一件事是 - 。

当您像这样使用QProcess时,没有shell,因此ffm​​peg将>和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,这都适用)。

答案 1 :(得分:2)

这是另一个例子:

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

p.readAllStandardOutput() QByteArray ,您可以阅读过程的标准输出中提供的所有数据,例如将它们写入文件:

QFile file("out.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    return;

QTextStream out(&file);
out << p.readAllStandardOutput();

file.close();

答案 2 :(得分:1)

另一个评论:总是使用QStringList变量传递args而不是普通字符串也是一个好主意 - 否则你很快就会遇到引用问题,尤其是在Windows上,其中带有空格的路径很常见。 QStringList变体做正确的事(TM)。

答案 3 :(得分:0)

当你从shell运行它时,shell会解释'&gt; 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重定向。