Wie kann ich mit ffmpeg ein h.264-Profil einstellen?

50855
Sam

Ich habe einen Film (m4v / h.264 / AAC), der auf meinem Mac einwandfrei abgespielt wird. Ich habe jedoch kürzlich herausgefunden, dass er auf meinem Apple TV3 nicht abgespielt werden kann. Nachdem ich mir die Eigenschaften dieser Filmdatei angesehen habe, sehe ich, dass sie ein Profil High@4.1 hat, aber Apple TV3 wird nur bis zu High@4.0 unterstützt. Ich denke, die einzige Eigenschaft, die dieses Video inkompatibel macht, ist die maximale Video-Bitrate. Alle anderen Eigenschaften sehen so aus, als würden sie in High@4.0 unterstützt.

Wie kann ich mit ffmpeg ein Downgrade auf High@4.0 durchführen?

Oder muss ich stattdessen die tatsächliche Eigenschaft (maximale Bitrate) ändern, die dieses Video 4.1 statt 4.0 macht? Ich mache mir Sorgen, wenn ich nur die Bitrate ändere, obwohl die Datei dann mit High@4.0 kompatibel wäre, würde sie immer noch als High@4.1 "getaggt" und daher auf meinem Apple TV3 immer noch nicht abgespielt.

13

2 Antworten auf die Frage

19
slhck

When encoding with libx264, you can set the H.264 profile and level with:

  • -profile:v – one of high, main, or baseline (and others, but this is irrelevant here)
  • -level:v – as defined in Annex A of the H.264 standard, e.g., 4.0.

For example:

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

Here we've just copied the audio stream since it won't be affected.

The output will have the correct profile and level set in its metadata. You can check this while encoding, where x264 says something like:

[libx264 @ 0x7fb26103a000] profile High, level 4.0 

MediaInfo can also help you analyze container and codec details.

Of course, reencoding the video will degrade its quality to some extent, given that you're applying a lossy conversion again. Try setting the -crf option to influence the constant quality parameter. The default value here is 23, while values between 18 and 28 are considered sane. Lower means better quality. If your input has a bit rate of up to 65,000 kBit/s, chances are it'll still look pretty good after conversion though.

Das hat gut funktioniert. Leider hat es einige Metadaten verloren, aber das eigentliche Video hatte keine merklichen Qualitätsänderungen. Hätte der folgende Befehl aus Interesse dasselbe erreicht? `ffmpeg -i input.mp4 -vcodec x264 -vprofile high -level 4.0 -acodec copy output.mp4` Sam vor 11 Jahren 1
Ja, die `-v`-Optionen sind Aliase der`: v`-Optionen. Welche Metadaten hast du verloren? slhck vor 11 Jahren 0
Ich denke, es war vielleicht nur das Kunstwerk, das verloren ging. Ich weiß nicht, ob das technisch gesehen Metadaten sind ... Ist das Artwork tatsächlich in der Datei enthalten? Ich habe nicht alles überprüft, bevor ich das Ganze noch einmal hinzugefügt habe. Sam vor 11 Jahren 0
Ich habe jetzt eine andere Datei mit einem ähnlichen Problem. Es ist das falsche Profilniveau, aber der Rest der Spezifikationen scheint mit meinem erforderlichen Niveau (4.0) kompatibel zu sein. Wenn ich die oben angegebenen Befehle verwende, bleiben die Daten erhalten, es sei denn, sie sind mit dem eingegebenen Profil nicht kompatibel. Grundsätzlich möchte ich, dass ffmpeg keine anderen Daten berührt als den Tag, der das Profil und den Level angibt. Ist das möglich oder werden alle Werte (Nitrat, Framerate usw.) auf voreingestellte Werte gesetzt? Sam vor 11 Jahren 0
Wenn Sie die obigen Befehle verwenden, wird das Video neu codiert. Wenn Sie nur die Pegelinformationen ändern möchten, müssen Sie den Bitstream ändern, den kein Programm, das ich kenne, ausführen kann, es sei denn, Sie schreiben es selbst. Die Ebene wird als rohe Bytes im Sequenzparametersatz des Bitstroms gespeichert (Informationen hierzu finden Sie in der ISO / IEC 14496-10-Norm, Abschnitt 7.3.2.1 und Anhang A). slhck vor 11 Jahren 0
Ich bin gerade auf einen Weg gestoßen, um dies zu erreichen. Subler hat tatsächlich eine Option, wenn Sie den Videostream auswählen, um das Profil und die Ebene zu ändern, damit er mit bestimmten Geräten kompatibel ist. Sie müssen sicherstellen, dass das Video mit dem von Ihnen eingestellten Profil kompatibel ist. Ich denke nicht, dass es eine Neucodierung durchführt, es muss lediglich die Metadaten geändert werden. Sam vor 11 Jahren 2
Oh, das ist sehr gut zu wissen, danke @Sam! slhck vor 11 Jahren 0
Fügen Sie `-map 0` hinzu, um den Verlust von Metadaten zu vermeiden (und außerdem die anderen Spuren, Audio- oder Untertitel nicht zu verlieren). cdlvcdlv vor 6 Jahren 0
Dies funktioniert gut für libx264. Wie wäre es mit h264_omx encoder? Das funktioniert nicht (liefert einen Fehler). Ryan Griggs vor 6 Jahren 0
@RyanGriggs Der OMX-Encoder sollte dies unterstützen. Könnten Sie bitte eine neue Frage posten und den vollständigen Befehl und die Befehlszeilenausgabe einfügen? Vielen Dank slhck vor 6 Jahren 0
Es war nur eine alte Version. Ein Upgrade auf 3.3+ behebt dies. Ryan Griggs vor 6 Jahren 0
0
Riccardo Volpe

Versuchen Sie diesen Befehl in Bezug auf Ihren Kommentar :

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 

Prost