Utilisation de tubes pour canaliser le fichier i / o vers un autre processus

Je viens tout juste d’apprendre / d’utiliser des tubes et je me demandais comment router le fichier de sortie d’une application dans un tube afin qu’une autre application puisse l’utiliser.

Pour être exact, je veux diriger la sortie de ffmpeg (données vidéo transcodées) dans mon application pour l’utiliser. Si je crée un tube nommé tel que /tmp/out.mp4 et le donne à ffmpeg en tant que nom de fichier de sortie, ffmpeg va essayer de créer ce fichier à nouveau, en remplaçant probablement mon tube (ou quelque chose comme ça). Comment faire face à ce genre de situation?

Existe-t-il un moyen général de détourner le fichier d’E / S d’une application de manière transparente?

(J’essaye d’écrire un serveur de streaming vidéo (juste pour apprendre et s’amuser) qui transcode les formats comme avi en format convivial comme mpeg4 lors de la diffusion en continu, j’ai trouvé ffmpeg trop lent pour cela, il fallait environ 2 secondes pour le transcoder 1 sec vidéo 🙁

Est-ce le problème avec mon setup / PC ou ffmpeg est connu pour sa lenteur? )

PS: J’écris ceci en C au fait.

ffmpeg peut être persuadé de générer un tuyau:

 ffmpeg -i whatever.avi -f mp4 - 

Le “-” lui indique de sortir sur stdout au lieu d’un fichier, et le “-f” lui indique quelle sortie le fichier de sortie devrait être.

Vous pouvez bien sûr redirect cela vers un canal nommé, mais l’appel avec popen pour obtenir directement le résultat sous forme de descripteur de fichier me semble être la meilleure solution.

ffmpeg peut aussi lire depuis stdin et écrire sur stdout comme ceci:

 ffmpeg -i pipe:0 -f wav pipe:1 

où 0 et 1 sont les descripteurs de fichier POSIX standard.