我正在尝试通过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 '>'
任何机构都知道为什么?
答案 0 :(得分:2)
在shell中键入原始命令时,ffmpeg输出到stdout。 shell解释>
重定向运算符,因此输出发送到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,这都适用)。
答案 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重定向。