h264 profile level

  • Hallo,


    ich hab hier ein Problem, das hat nix direkt mit LetsPlay zu tun, aber mit einem Video File, was ich auf meinem Fernseher abspielen möchte . Der sagt mir immer, dass der Inhalt nicht unterstützt ist, spielt die Datei aber trotzdem, nur die Fehlermeldung bleibt da stehen (Es handelt sich um einen Sony KDL-60W605B, tut aber nichts zur Sache, das Problem haben viele Sony Fernseher). Ich kann die zwar durch Provozieren einer anderen Fehlermeldung wegbekommen, bin aber trotzdem neugierig geworden. :)


    Einige meinte, dass es am eingestellten Profile Level liegt und dass man das schon wegbekommt, wenn man den einfach editiert. Dazu habe ich mit den CoolSoft h264 Level Editor runtergeladen. Der zeigt mir als aktuelles Level [email protected] an. Eine Änderung hat nix gebracht. Dann hab ich mal mit ffprobe geschaut, das zeigt mir profile=high und level=51 an. Genauso wie MediaInfo.


    Wo kommen die unterschiedlichen Werte her? Hab mal probiert rauszufinden, wie ffprobe die Werte ermittelt, bin aber nicht fündig geworden. h264 level Editor sucht wohl nach irgendwelchen Hex Patterns...


    Hab auch keinen Weg mit gefunden, mit ffmpeg die Werte einfach zu editieren, das geht wohl nur mit einem konformen Recode. Berechnet ffprobe die Werte evtl. direkt aus dem Stream udn zeigt das errechnet Level und nicht das aus dem Header?

  • Ich denke nicht das du damit Erfolg haben wirst. Korrekt ist das der Level das h.264 gewisse Kriterien für Hardwaredecoder eingrenzt. Das funktioniert aber andersherum als wie du es oben geschildert hast:


    Bei Enkodieren wählst du mit dem Level quasi die Zielgerätgruppe aus. Wenn dein Fernseher nur 4.1 unterstützt musst du das schon beim Kodiervorgang berücksichtigen.


    Einen Level im Videofile einfach zu ändern klappt nicht zwangsweise. Die Level beschreiben auch die max. unterstützte Bitrate und Auflösung. Der Hardware-Dekoder Chip unterstützt dies dann einfach nicht.

  • Einen Level im Videofile einfach zu ändern klappt nicht zwangsweise.

    Dito.


    Man kann in einem Video das mit High 5.1 kodiert wurde trotzdem alle Kriterien erfüllen die auch z.B. bei ein High 4.1 gehen würden.
    Eine Playstation 4 kann mit Level 5.1 glaube ich nix anfangen, aber wenn man hier das Level auf 4.2 ändert, frisst er es. Wie gesagt, sofern die Kriterien übereinstimmen.



    Dazu habe ich mit den CoolSoft h264 Level Editor runtergeladen.

    Das ist so ein Editor der genau das macht was wie eben gesagt.



    @Vouk hat da absolut recht. Um sicher zu gehen das der Fehler nicht mehr erscheint, das Video entsprechend neu kodieren mit den jeweiligen Profil und Level das das Endgerät wo es abgespielt werden soll auch unterstützt.


    Das Profil sagt z.B. aus, was das Video alles für Enkodierungs Mechanismen nutzt (Ist auch später für den Dekoder wichtig). Für Standardgeräte fallen meist High10, High422 und High444 raus, da diese sich z.B. schon mit 9 - 12Bit Kodierung beschäftigen, Lossless Kodierung, usw. Die sind zurzeit noch nur dem PC vorbehalten.
    Sehr selten findet man noch Geräte die auch zwischen Main und High faxen machen.


    Das Level kontrolliert die max. Werte für Auflösung, Bitrate und FPS. Wobei sich die Bitrate je nach Profil abweicht.


    Um z.B. bei der PS4 ein Video anzuschauen das eine Auflösung 1920x1080 und 60 FPS hat wird min. das Level 4.2 vorausgesetzt. Da die PS4 keine höheren Auflösungen unterstützt und auch keine höheren FPS kann, ist das auch schon das maximale Level. Max. Bitrate sind dann 62,5 Mbit/s. Also das was man auch bei BluRays vorfindet. Wobei BluRays auch oftmals noch mit dem Main Profil arbeiten.


    Profil und Level sind sozusagen Sicherheitsriegel die für einen Reibungslosen Ablauf auf dem jeweiligen Gerät später sorgen.
    Gleiches findest du auch für Handys und andere Systeme.

  • Mir ist klar was das Profil aussagt und dass man es vor dem Koieren festlegt und dann entsprechnd codiert wird. Ich hab rein aus Neugier ein bißchen rumgespielt. Mich wundert nur, dass es ein Tool gibt, was den Level ändern kann, der ja wohl irgendwo im Videostream oder im Containformat niedergeschrieben ist (scheint ja auch bei einigen zu funktionieren), das mir dieser Level aber nicht von ffprobe und MediaInfo angezeigt wird.


    Edit: Und meine PS4 hat da nix mit zu tun, ich habe das Video auf einem USB Stick und schließe den direkt an den Fernseher an...

  • Also FFmpeg benötigt den Header. Ohne ihn kann er die Streams auch nicht ermitteln.


    Bei FFprobe kann man das Level und das Profil mittels folgenden Parameter ausgeben lassen:
    ffprobe.exe -loglevel error -show_streams video.mkv


    Bei Mediainfo sollte das über die Textansicht auch zu sehen sein.


    Es gibt auch Videos wo diese Stream Tags fehlen. Je nachdem mit was das Video zuvor kodiert oder gemuxt wurde, werden entsprechende Tags im Header hinterlegt.


    Die Angabe von Profil und Level sind aber nicht zwingend notwendig um das Video auf dem PC zu dekodieren, weil es am PC oftmals keine Einschränkung der Hard- und Software gibt.
    In der Regel kann man aber das Video entsprechend zuordnen anhand der anderen Informationen die das Profil und Level beschreiben.


    Das Profil muss z.B. nicht angegeben werden, da die Infos für die Mechanismen anderswo aus dem Video entnommen wird.
    Ebenso das Level.


    Allerdings gibt es Software die auf diesen Eintrag drängen. Ohne ihn gib es Fehlermeldungen. In dem Falle haben sich meist die Entwickler solcher Software recht einfach gemacht. ^^
    Dann sollte man das Video am besten recodieren um somit diesen Eintrag wieder herzustellen.



    Mich wundert nur, dass es ein Tool gibt, was den Level ändern kann, der ja wohl irgendwo im Videostream oder im Containformat

    Immer im Stream. Solch ein Eintrag ist im Container Header oftmals Sinnbefreit. Es gibt Container Header die gewisse Infos haben dafür, aber meist hat der Stream Header alle nötigen Infos die zur Dekodierung nötig sind.

  • Kommt drauf an mit was und wie du kodiert hast.


    Ein h264 Stream Header sieht ungefähr so aus:


    links der einzelne extrahierte Video Stream
    rechts der Video Stream in einem MKV Container


    00 00 00 01 ist z.B. die NAL Unit (AnnexB header) gefolgt von einer 0x67 (SPS) oder 0x68 (PPS). Also ob das ein Bitstream ist oder nicht.


    In einem Container kann das Ganze anders beginnen. Hier in der MKV beginnt es mit 00 00 00 19


    Für mehr Infos: https://cardinalpeak.com/blog/…4-sequence-parameter-set/


    Für die Daten wäre ein Parser nicht schlecht, denn das Ganze Zeug ist in Bits unterteilt. Das heißt das was man im Hexeditor sieht, entspricht nicht dem was man sofort lesen könnte. Vielmehr ist der erste und zweite Byte miteinander verwoben und nur die einzelnen Flags der Bits ergeben Aufschluss.


    8Bit für das Profil
    Profil Daten für AVC1 und AVC2 Kodierung:
    Dezimal - Beschreibung
    0 - Kein Profil
    66 - Baseline
    77 - Main
    88 - Extended
    100 - High
    110 - High 10
    122 - High 4:2:2
    244 - High 4:4:4
    44 - CAVLC 4:4:4


    Dann gibt es noch für SVC1 Kodierung:
    83 - Scalable Baseline
    86 - Scalable High


    Und für MVC1 und MVC2 Kodierung:
    80 - Stereo High
    76 - Multiview High
    138 - Multiview Depth High



    8Bit für das Level:
    Angaben werden meist wie folgt gemacht:
    10 -> Level 1
    50 -> Level 5.0



    So, ohne das in Bits aufzuschlüsseln ist das mit nem normalen Hexeditor ohne zu wissen wo was ist, nicht möglich eine Editierung durch zu führen.

  • Boah super, danke für die Infos und Links @Sagaras! Das werde ich mir mal gegen Wochenende genauer anschauen. Wenn ich mit dem Hex Editor nicht weiter komme, kann ich mir auch was in C# programmieren um den Bitstream zu analysieren, das ist nicht das Thema.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!