FFmpeg и qt, Невозможно найти подходящий формат вывода для '>' - PullRequest
1 голос
/ 29 апреля 2010

Я пытаюсь выполнить операцию ffmpeg через Qt

Я хотел бы выполнить эту строку:

./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 ]

2 голосов
/ 29 апреля 2010

Вот еще один пример:

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 голосов
/ 29 апреля 2010

Когда вы вводите исходную команду в оболочке, ffmpeg выводит в стандартный вывод. Оболочка интерпретирует оператор перенаправления >, поэтому выходные данные отправляются в temp2. Последнее, что видит ffmpeg - это.

Когда вы так используете QProcess, оболочка отсутствует, поэтому ffmpeg видит > и temp2 в качестве аргументов, которые он не интерпретирует, как вы ожидаете. В этом случае есть простое решение. Просто выведите ffmpeg в temp2 вместо stdout:

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

В других случаях вам может понадобиться выполнить оболочку явно, например:

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

Обратите внимание, что QProcess :: execute является статическим, поэтому экземпляр не требуется (это применяется независимо от того, как вы вызываете execute).

1 голос
/ 29 апреля 2010

Еще одно замечание: также неплохо всегда использовать вариант QStringList для передачи аргументов вместо простой строки - в противном случае вы столкнетесь с проблемами цитирования довольно скоро, особенно в Windows, где пути с пробелами являются общими. Варианты QStringList делают правильные вещи (TM).

0 голосов
/ 29 апреля 2010

Когда вы запускаете это из оболочки, оболочка интерпретирует '> temp 2' как перенаправление и никогда не передает это процессу ffmpeg. Когда вы запускаете process->execute(), эта функция передает все после ./ffmpeg в качестве параметров командной строки. Если вы действительно хотите перенаправление оболочки, вам нужно запустить новую оболочку и заставить эту оболочку выполнить вашу командную строку. Это может работать:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...