2016-01-03 3 views
2

J'ai un morceau de code de traitement vidéo en C qui semble gêné par la vitesse à laquelle je peux lire des octets à partir du tube ffmpeg.Est-il plus rapide d'utiliser libavformat que d'appeler ffmpeg avec popen?

J'ai besoin du décodage en trames rawvideo fournies par ffmpeg ou potentiellement libav *.

Y a-t-il une grande surcharge dans les appels fread à un sous-processus pop-up ffmpeg par rapport à l'utilisation des bibliothèques libav?

Répondre

2

Il y a quelques aspects ici. Tout d'abord, pourquoi semble-t-il que votre application est goulue par l'entrée du tube ffmpeg? La réponse est probablement assez simple: parce que ffmpeg prend beaucoup plus de CPU (et est donc le goulot d'étranglement de la combinaison des deux applications). Si vous exécutez un | b, et a prend beaucoup plus de CPU, alors du point de vue de b, l'entrée de la pipe est lente. C'est logique, car ça prend plus de temps. Il n'y a pas de solution à cela, ffmpeg est supposé pour prendre plus de CPU, car (en fonction de ce codec/résolution etc.), le traitement multimédia est une tâche très gourmande en ressources processeur. Deuxièmement, utiliser l'API C au lieu d'une aide de tuyau? Cela dépend de ce que vous faites. Si vous utilisez ffmpeg pour une tâche assez triviale comme la lecture d'un fichier à partir du disque sans décompression (par exemple vidéo/audio non compressé), alors oui, la surcharge du tuyau est assez importante. Si ffmpeg décompresse la vidéo H264/HEVC ou VP9, ​​il est peu probable que vous voyiez des gains de ce mouvement, ou ils seront au minimum petits (1%), car la plupart du temps est consacré au décodage de la vidéo. La copie/transfert de données est presque négligeable. Donc dans ce cas, la question est: est-ce que 1% vaut la peine? C'est à vous de décider.