2010-04-29 5 views
1

Je suis en train d'exécuter une opération de ffmpeg par QtFFmpeg et qt, Impossible de trouver un format de sortie approprié pour « > »

Je voudrais exécuter cette ligne:

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

Quand je exécuter à travers le terminal, cela fonctionne parfaitement bien.

Comment jamais quand je le lance à travers Qt comme ceci:

QProcess *process = new QProcess(); 

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

-je obtenir un Unable to find a suitable output format for '>' tout organisme a l'idée de savoir pourquoi?

Répondre

2

Voici un autre exemple:

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

p.readAllStandardOutput() est un QByteArray et vous pouvez lire avec toutes les données disponibles est de la sortie standard du processus, par exemple les écrire déposer:

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

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

file.close(); 
2

Lorsque vous tapez votre commande d'origine dans le shell, les sorties de ffmpeg à stdout. Le shell interprète l'opérateur de redirection >, donc la sortie est envoyée à temp2. La dernière chose que ffmpeg voit est le -. Lorsque vous utilisez QProcess comme cela, il n'y a pas de shell, donc ffmpeg voit > et temp2 comme des arguments, qu'il n'interprète pas comme prévu. Dans ce cas, il y a une solution facile. Il suffit de sortie ont ffmpeg à TEMP2 au lieu de stdout:

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

Dans d'autres cas, vous pourriez avoir à exécuter un shell explicitement, quelque chose comme:

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

Notez que QProcess :: execute est statique, une instance n'est pas nécessaire (ceci s'applique peu importe comment vous appelez exécuter).

0

Lorsque vous exécutez depuis le shell, le shell interprète le « > Temp 2 » en tant que redirection et ne passe que le processus de ffmpeg. Lorsque vous exécutez process->execute() cette fonction passe tout ce qui suit ./ffmpeg en tant que paramètres de ligne de commande. Si vous voulez vraiment shell-redirection, vous devez exécuter un nouveau shell et avoir cette coquille exécuter votre ligne de commande. Cela pourrait fonctionner:

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

Je ne connais pas les règles Echéances Qt, donc cela pourrait ne pas fonctionner parfaitement, mais, fondamentalement, vous voulez préfixer /bin/sh -c puis citer la commande que vous voulez vraiment courir, y compris le stdout redirection

+0

Il est préférable d'utiliser "/ bin/sh -c" au lieu de "bash -c". Cette approche est plus fiable car bash peut ne pas être installé du tout. – VestniK

1

une autre remarque: Il est aussi une bonne idée d'utiliser toujours la variante QStringList pour passer args au lieu d'une chaîne de caractères - sinon vous tomberez en citant est poursuit très bientôt, surtout sur Windows où les chemins avec des espaces sont communs. Les variantes de QStringList font la bonne chose (TM).

+0

True. Il a été modifié afin d'utiliser QStringList. Je vous remercie – Spredzy