2016-05-17 1 views
4

[Ce que je l'ai fait]Comment référencer le décodage de la trame par ffmpeg?

Je suis en train de mesurer une performance des différents décodeurs ffmpeg par

  • moment combien de temps l'appel à la fonction avcodec_decode_video2(..) prend en ffmpeg.c et en cours d'exécution binaire ffmpeg la manière suivante

~/bin/ffmpeg -benchmark_all -loglevel debug -threads 0 -i ~/Documents/video-input.h264 -c:v libx265 -x265-params crf=25 video-output.hevc

  • et en chronométrant combien de temps e e même fonction prend en ffplay.c et exécute le binaire ffplay la manière suivante

~/bin/ffplay ~/Documents/video-input.h264

Dans ma compréhension le temps moyen de l'appel à cette fonction devrait être le même si je suis en train de convertir la vidéo ou le jouer, parce que je mesure seulement combien de temps il faut pour décoder le cadre pour cette vidéo. Est-ce une mauvaise façon de le faire? S'il vous plaît laissez-moi savoir si je suis incorrect. Les résultats que je reçois me sont étranges - l'appel à la fonction mentionnée ci-dessus prend deux fois plus de temps dans le binaire ffmpeg que dans le binaire ffplay. J'ai essayé d'exécuter ffmpeg binaire avec -threads 0 et sans elle, mais les résultats sont toujours les mêmes (deux fois plus long que ffplay). Se pourrait-il que ffplay binaire utilise simplement plus de threads? Lorsque je tente avec -threads 1, ffmpeg prend environ 10 fois plus longtemps que ffplay (ce qui me semble logique car avant qu'il utilisait plusieurs threads et maintenant il ne fait qu'utiliser 1)

Avant de poser ma question, je veux que vous savoir que je suis un débutant dans les processus de traitement vidéo et de codage/décodage vidéo.

[Ma question]

Je me demande ce qui serait un moyen précis de mesurer combien de temps il faut pour décoder un cadre (en utilisant 1 fil)? Devrais-je simplement mesurer seulement combien de temps il faut pour appeler la fonction avcodec_decode_video2(..) en utilisant le binaire ffmpeg, et non le binaire ffplay? Les résultats seraient-ils plus précis de cette façon? J'ai également essayé d'activer les options -benchmark_all -loglevel debug, mais il semble que le message suivant bench: 64537 decode_video 0.0 n'est pas très utile si 0.0 est censé signifier l'heure. (Je ne sais pas ce que signifie l'autre chiffre).

Répondre

9

Null muxer

Si vous voulez un moyen simple de décodage de référence utiliser le null muxer:

ffmpeg -i input -f null - 

Timing décodage

utilisateurs Linux et Mac OS peuvent ajouter la commande time:

$ time ffmpeg -i input -f null - 
[...] 
real 0m5.343s 
user 0m20.290s 
sys  0m0.230s 

Voir man time pour plus d'informations.

-benchmark Option

L'option -benchmark peut être ajoutée à temps CPU de sortie et de la consommation de mémoire maximale:

$ time ffmpeg -i input -f null - 
[...] 
bench: utime=7.314s 
bench: maxrss=72280kB 

Choisir les cours d'eau

Si vous voulez décoder juste un flux particulier puis utilisez la map option:

ffmpeg -i input -map 0:a:0 -f null - 

Threads

Vous pouvez décoder avec un fil si vous voulez:

ffmpeg -threads 1 -i input -f null - 

Tous les décodeurs ont des capacités de filetage et certains ont plusieurs. Vous pouvez vérifier les détails du décodeur tels que ffmpeg -h decoder=h264.

Le choix d'un décodeur

Il peut y avoir plusieurs décodeurs disponibles pour un format. Vous pouvez nommer le décodeur si vous ne voulez pas compter sur la valeur par défaut:

ffmpeg -c:v vp8 -i input -f null - 
ffmpeg -c:v libvpx -i input -f null - 
+0

Il est peut-être la peine d'expliquer la différence entre les différents temps - le temps « réel » est probablement pas pour les comparaisons les plus utiles que ce dépend de la charge du système, des coeurs disponibles, etc. – Mick

+0

Un moyen plus facile d'ignorer les flux est '-an' pour ignorer les flux audio, ou' -vn' pour ignorer les flux vidéo. –

+0

@PeterCordes Je préfère '-map' car il est plus flexible et vous pouvez choisir (ou exclure) des flux spécifiques. – LordNeckbeard