Comment puis-je définir un niveau de profil h.264 avec ffmpeg?

16

J'ai un film (m4v / h.264 / AAC) qui fonctionne bien sur mon Mac mais j'ai récemment découvert qu'il ne jouera pas sur mon Apple TV3. Après avoir regardé les propriétés de ce fichier vidéo, je vois qu'il a un profil [email protected] mais le seul support d'Apple TV3 jusqu'à [email protected]. Je pense que la seule propriété qui rend cette vidéo incompatible est le débit binaire vidéo maximal, toutes les autres propriétés semblent être prises en charge dans [email protected].

Comment puis-je utiliser ffmpeg pour rétrograder cette vidéo vers [email protected]?

Ou dois-je plutôt modifier la propriété réelle (débit binaire max) qui rend cette vidéo 4.1 au lieu de 4.0? Je crains que si je modifie simplement le débit binaire, bien que le fichier soit alors compatible avec [email protected], il soit toujours `` étiqueté '' comme [email protected] et ne sera donc toujours pas lu sur mon Apple TV3.

Sam
la source

Réponses:

22

Lors de l'encodage avec libx264, vous pouvez définir le profil et le niveau H.264 avec:

  • -profile:v- l'un de high,, mainou baseline(et d'autres, mais cela n'est pas pertinent ici)
  • -level:v- tel que défini à l'annexe A de la norme H.264, par exemple 4.0.

Par exemple:

ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy output.mp4

Ici, nous venons de copier le flux audio car il ne sera pas affecté.

La sortie aura le profil et le niveau correct définis dans ses métadonnées. Vous pouvez vérifier cela lors de l'encodage, où x264dit quelque chose comme:

[libx264 @ 0x7fb26103a000] profile High, level 4.0

MediaInfo peut également vous aider à analyser les détails du conteneur et du codec.

Bien sûr, le réencodage de la vidéo dégradera sa qualité dans une certaine mesure, étant donné que vous appliquez à nouveau une conversion avec perte. Essayez de définir l' -crfoption pour influencer le paramètre de qualité constante. La valeur par défaut ici est 23, tandis que les valeurs entre 18 et 28 sont considérées comme saines. Plus bas signifie une meilleure qualité. Si votre entrée a un débit allant jusqu'à 65 000 kBit / s, il est probable que cela restera assez bon après la conversion.

slhck
la source
1
Cela a bien fonctionné. Malheureusement, il a perdu une partie des métadonnées, mais la vidéo réelle n'a pas subi de changement de qualité notable. Par intérêt, la commande suivante aurait-elle réalisé la même chose? ffmpeg -i input.mp4 -vcodec x264 -vprofile high -vlevel 4.0 -acodec copy output.mp4
Sam
Oui, les -voptions sont des alias de :vcelles-ci. Quelles métadonnées avez-vous perdues?
slhck
Je pense que c'est peut-être juste l'œuvre d'art qui a été perdue. Je ne sais pas si cela est techniquement considéré comme des métadonnées ... L'illustration est-elle réellement contenue dans le fichier? Je n'ai pas vérifié tout le reste avant d'y ajouter à nouveau le tout.
Sam
J'ai maintenant un fichier différent avec un problème similaire. Ce n'est pas le bon niveau de profil mais les autres spécifications semblent compatibles avec mon niveau requis (4.0). Si j'utilise les commandes que vous avez données ci-dessus, les données resteront-elles intactes à moins qu'elles ne soient incompatibles avec le niveau de profil entré? Fondamentalement, je ne veux pas que ffmpeg touche à d'autres données que la balise qui indique de quel profil et de quel niveau il s'agit. Est-ce possible ou va-t-il régler toutes les valeurs (nitrate, framerate, etc.) sur des valeurs prédéfinies?
Sam
2
Je suis juste tombé sur un moyen d'y parvenir. Subler a en fait une option, lorsque vous sélectionnez le flux vidéo, pour modifier le profil et le niveau pour le rendre compatible avec certains appareils. Il vous dit de vous assurer que la vidéo est compatible avec le profil que vous définissez, donc je ne pense pas qu'elle fasse de ré-encodage, elle doit simplement changer les métadonnées.
Sam
1

En référence à votre commentaire , essayez cette commande:

ffmpeg -i input.mp4 -map 1 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy \
# copies all global metadata from input.mp4 to output.mp4
-map_metadata 0 \
# copies video stream metadata from input.mp4 to output.mp4
-map_metadata:s:v 0:s:v \
# copies audio stream metadata from input.mp4 to output.mp4
-map_metadata:s:a 0:s:a \
output.mp4

À votre santé

Riccardo Volpe
la source