DVB-S2 Streams von der Dreambox encoden (Linux only)

  • Hallo zusammen,


    ich möchte meine Aufnahmen von der Dreambox dm8000 mit x264 neu encodieren und in ein mkv packen um Speicherplatz zu sparen. Die Audio Streams will ich original lassen, bzw. habe mich noch nicht damit beschäftigt ob sich diese schrumpfen lassen ohne Qualität und 5.1 zu verlieren. Die Aufnahmen kommen hauptsächlich von Sky.


    Bitte nur Hinweise die ich unter linux verwenden kann. Ich hab kein Windows und will auch keins!


    Ich habe diverse Tests mit x264 gemacht und habe mich für folgende Einstellungen entschieden:


    Code
    1. -crf 21 -preset slow -profile high -level 41 -tune film


    Bei diesen Einstellungen habe ich keine Probleme das mkv wieder vom Server auf der Dreambox oder meinem Fernseher abzuspielen und mit der Qualität bin ich auch zufrieden.


    Wenn ich mit avconv die TS Streams von der dreambox direkt mit folgendem Befehl encode und in ein mkv muxe ist das Ergebnis A/V synchron, aber avconv scheint bei libx264 kein High profile oder ein level angeben zu können. Dies sorgt dann dafür das die Qualität nicht mehr so gut ist und die Wiedergabe vom Server auf der Dream teilweise stockt wenn man gespult hat.


    Code
    1. time avconv -i 20111204\ 1640\ -\ Sky\ Select\ HD\ -\ Green\ Lantern.ts -filter:v crop=1920:800:0:140 -c:v libx264 -preset slow -profile high -crf 21 -tune film -c:a copy -map 0:1 -map 0:2 -map 0:3 -t 01:49:25.500 -ss 00:05:35.500 Green_Lantern.mkv


    Obwohl ich profile high angegeben habe, ist das Ergebnis immer Profile Main. Nur das baseline Profile lässt sich über avconv angeben bzw. angeben lässt sich alles, aber hier kommt auch ein baseline raus.


    Dann habe ich probiert die Video und Audio Streams aus dem TS Stream zu extrahieren und den Video Stream direkt mit x264 zu encoden. Dies funktioniert auch ohne Probleme und ich bekomme alle Settings wie ich es will, aber nach dem muxen ist A/V async.


    Diese Versuche habe ich mit folgenden Befehlen gemacht:


    * Versuch mit avconv


    Code
    1. avconv -i [COLOR=#000000][FONT=monospace]20111204\ 1640\ -\ Sky\ Select\ HD\ -\ Green\ Lantern.ts[/FONT][/COLOR] -c:v copy -map 0:1 green_lantern.h264x264 --crf 23 --profile high --level 41 --tune film --preset slow -o green_lantern.264 green_lantern.h264avconv -i [COLOR=#000000][FONT=monospace]20111204\ 1640\ -\ Sky\ Select\ HD\ -\ Green\ Lantern.ts[/FONT][/COLOR] -c:a copy -map 0:2 green_lantern.ac3mkvmerge --title "Green Lantern" --default-language ger -o Green_Lantern.mkv green_lantern.264 --track-name 0:german --language 0:ger green_lantern.ac3


    * Versuch mit mencoder


    Code
    1. mencoder 20111204\ 1640\ -\ Sky\ Select\ HD\ -\ Green\ Lantern.ts -o Green_Lantern.264 -nosound -ovc x264 -of rawvideo -x264encopts crf=21:profile=high:level=41:preset=slow:tune=filmmencoder 20111204\ 1640\ -\ Sky\ Select\ HD\ -\ Green\ Lantern.ts -o green_lantern.ac3 -ovc copy -oac copy -of rawaudiomkvmerge --title "Green Lantern" --default-language ger -o Green_Lantern.mkv green_lantern.264 --track-name 0:german --language 0:ger green_lantern.ac3


    Ich weiß das in dem TS Stream PTS timestamps enthalten sind, allerdings habe ich keine Ahnung wie ich diese extrahieren oder sonstwie nutzen kann um mein Endergebnis synchron zu bekommen.


    Hier mal ein mediainfo output von dem Original TS Stream:



    Ich bin für jeden Hinweis dankbar!


    Gruß morlix

  • x264 setzt wenn Du high@4.1 nimmst nur die Header, es werden keine vbv Beschränkungen gemacht, diese müssen explizit gesetzt werden, wenn der Stream wirklich sicher high@4.1 kompatibel sein soll.


    zum Mencoder-Versuch: Wenn Du alles in einem Aufruf machst (video encoden, audio durchreichen und mkv erstellen), sollte es auch synchron sein.
    Wenn Du bei der aktuellen Methode bleiben willst brauchst Du wirklich eine Methode um:
    1. die Timestamps/pts zu extrahieren
    2. sie anzupassen (das sie z.B. bei 0 starten)
    3. sie in das TimeCode format umzuwandeln, was mkvmerge unterstützt
    Hab leider auch k.A. wie 1. zu machen ist, wenn Du rausbekommst wie es geht, sag mir bitte Bescheid.
    (stimmt nicht, weiß schon ne Möglichkeit: 1. ts mit mkvmerge in ein mkv multiplexen 2. mit mkvextract die Timecodes extrahieren)


    -> Gerade noch etwas gegoogelt: tsDemux kann timecodes aus Transportstreams extrahieren. (bei https://code.google.com/p/tsdemuxer/downloads/list gibt es sowohl statische Windows als auch Linux Versionen, falls man nicht selber kompilieren will/kann)


    mit:

    Code
    1. tsdemux -e 3 "Pfad zum Transportstream"


    kriegt man die pts&dts Infos und welcher Stream zu welcher pid gehört, anhand der pid kann man dann die zugehörigen pts aussortieren. Danach müsstest Du diese nur noch in timecodes umwandeln die mkvmerge mag und sie beim Multiplexen mit angeben,...


    Cu Selur

  • Hallo Selur,


    erstmal danke für deine Antwort!


    Ich bin total offen was das umwandeln angeht, solange ich es unter der linux command line machen kann. Ich habe vor später ein Script zu schreiben, das dies automatisiert so bald ich eine komplett funktionierende Methode gefunden habe.


    Ich experimentiere gerade mit tsdemux und melde mich sobald ich hier was neues habe.


    Gruß morlix

  • CLI ist ein muss da ich sehr viele Aufnahmen habe, die ich Script gesteuert auf meinem Server encoden will. Der Server hat kein X11 und läuft 24h daher ist er für diesen Job prädestiniert.


    Das h264enc ist ein cooles Script, noch nicht ganz das was ich wollte aber geht schon in die richtige Richtung. Ich frage mich nur warum ich das in google nicht gefunden habe.


    Trotzdem vielen dank nochmal für den Hinweis.


    Ich spiele gerade noch mit den timecodes rum und melde mich für welche Variante ich mich warum entschieden habe.

  • So jetzt habe ich mal die Variante deines Vorschlags mit ts in mkv muxen und daraus die timecodes exportieren gemacht und muss (sofern ich keinen Fehler gemacht habe) leider sagen das der Ton wieder asynchron ist.


    Code
    1. mkvmerge -o CSI_NY.mkv csi_ny_20110912\ 2105\ -\ VOX\ HD\ -\ CSI_NY.tsmkvmerge -i CSI_NY.mkvmkvextract timecodes_v2 CSI_NY.mkv 1:video.tmc 2:audio.tmcmkvextract tracks CSI_NY.mkv 1:video.h264 2:audio.ac3x264 --crf 23 --profile high --level 41 --tune film --preset slow -o video.x264 video.h264mkvmerge --title "CSI NY" -o CSI_NY.mkv --timecodes 0:video.tmc video.x264 --track-name 0:german --language 0:ger --timecodes 0:audio.tmc audio.ac3


    Der Versuch direkt alles über mencoder zu machen hat leider zu einem über vlc nicht spulbaren und nicht asynchronen Ergebnis geführt.


    Code
    1. mencoder csi_ny_20110912\ 2105\ -\ VOX\ HD\ -\ CSI_NY.ts -o CSI_NY.mkv -ovc x264 -x264encopts crf=23:profile=high:level=41:preset=slow:tune=film -oac copy -of lavf -lavopts format=matroska


    Jetzt mach ich doch mal den Versuch mit tsdemux und werde hier wieder berichten.


    Gruß morlix

  • Hmm also wenn ich bei mencoder ofps 25 angebe, dann läuft das video langsam und hat die doppelte Abspieldauer.


    Die 25 fps habe ich mit mediainfo aus dem Original ts.


    Ich versuch jetzt mal wieder den Weg mit mkvmerge, mkvextract und x264.


    Wenn ich direkt aus dem ts mit avconv ein mkv mache, dann war ja alles ok nur war das Profile nur auf main und level gar nicht gesetzt. Wie ich aber jetzt gelernt habe, haben diesen Parameter keine wirkliche Auswirkung so lange nicht auch vbv Beschränkungen gesetzt werden.
    Sehe ich das richtig? Gibt es eventuell Probleme mit irgendwelchen Playern?


    Ich mach morgen nochmal so einen Versuch mit avconv und poste hier das Ergebnis bzw. die Schritte.

  • Guck mal ob der Stream noch synchron ist, wenn Du ihn einfach mit mkvmerge nach mkv remuxed.


    Zitat

    Sehe ich das richtig? Gibt es eventuell Probleme mit irgendwelchen Playern?


    Die meisten Player checken die flags gar nicht sondern starten den Playback einfach und wenn das Profile@Level halt zu hoch ist, gibt es halt Probleme beim Playback. :)

  • Wenn ich den Stream einfach mit mkvmerge in ein mkv muxe ist alles synchron.


    Hier mal der Mediainfo output von dem TS vor dem remux in mkv.


    Code
    1. GeneralID : 1057 (0x421)Complete name : csi_ny_20110912 2105 - VOX HD - CSI_NY.tsFormat : MPEG-TSFile size : 4.14 GiBDuration : 59mn 59sOverall bit rate mode : VariableOverall bit rate : 9 883 KbpsVideoID : 511 (0x1FF)Menu ID : 61201 (0xEF11)Format : AVCFormat/Info : Advanced Video CodecFormat profile : High@L4.0Format settings, CABAC : YesFormat settings, ReFrames : 4 framesCodec ID : 27Duration : 59mn 59sBit rate : 9 007 KbpsWidth : 1 920 pixelsHeight : 1 080 pixelsDisplay aspect ratio : 16:9Frame rate : 25.000 fpsStandard : ComponentColor space : YUVChroma subsampling : 4:2:0Bit depth : 8 bitsScan type : InterlacedScan order : Top Field FirstBits/(Pixel*Frame) : 0.174Stream size : 3.77 GiB (91%)Color primaries : BT.709Transfer characteristics : BT.709Matrix coefficients : BT.709AudioID : 515 (0x203)Menu ID : 61201 (0xEF11)Format : AC-3Format/Info : Audio Coding 3Mode extension : CM (complete main)Format settings, Endianness : BigCodec ID : 6Duration : 59mn 59sBit rate mode : ConstantBit rate : 384 KbpsChannel(s) : 6 channelsChannel positions : Front: L C R, Side: L R, LFESampling rate : 48.0 KHzBit depth : 16 bitsCompression mode : LossyDelay relative to video : -309msStream size : 165 MiB (4%)Language : GermanLanguage, more info : Clean effectsTextID : 33 (0x21)-100Menu ID : 61201 (0xEF11)Format : TeletextLanguage : GermanMenuID : 97 (0x61)Menu ID : 61201 (0xEF11)Duration : 59mn 59sList : 33 (0x21) () / 511 (0x1FF) (AVC) / 515 (0x203) (AC-3, German) / 517 (0x205) ()Language : / / German


    Und hier der mediainfo output nach dem muxen in ein mkv:



    Meine Aussage das mit avconv alles synchron ist, stimmt mit dieser Aufnahme/ diesem Stream leider nicht.


    Ich bin langsam echt ratlos... Kann mir noch jemand einen Hinweis geben?

  • Ich hab mal wieder ein paar Dinge gefunden die mich wundern bzw. die ich nicht verstehe.


    Wenn ich auf Basis des folgenden Versuch ein paar kleine Anpassungen mache kommt ein synchrones Ergebnis dabei raus.


    Code
    1. mkvmerge -o CSI_NY.mkv csi_ny_20110912\ 2105\ -\ VOX\ HD\ -\ CSI_NY.tsmkvmerge -i CSI_NY.mkvmkvextract timecodes_v2 CSI_NY.mkv 1:video.tmc 2:audio.tmcmkvextract tracks CSI_NY.mkv 1:video.h264 2:audio.ac3x264 --crf 23 --profile high --level 41 --tune film --preset slow -o video.x264 video.h264mkvmerge --title "CSI NY" -o CSI_NY.mkv --timecodes 0:video.tmc video.x264 --track-name 0:german --language 0:ger --timecodes 0:audio.tmc audio.ac3


    Jetzt dachte ich mir, wenn das mit den Timecodes nicht funktionieren will, dann verpass ich doch einfach der Audio Spur beim muxen den entsprechenden Delay manuell.
    Also habe ich den letzten mkvmerge Prozess wie folgt angepasst.


    Code
    1. mkvmerge --title "CSI NY" --default-language ger -o CSI_NY_man_delay.mkv video.x264 --track-name 0:german --language 0:ger -y 0:-309 audio.ac3


    Einerseits bin ich froh, das alles soweit synchron ist. Andererseits wundert es mich, das mediainfo jetzt eine delay von 11ms anzeigt und nicht mehr -309ms.


  • Ich komme einfach mit keinem meiner Versuche weiter ein akzeptables Ergebnis zu erreichen.


    Mir stellt sich schon allein die Frage auf welche Tools ich mich konzentrieren sollte.


    Es wäre echt nett wenn mir jemand sagen kann "versuche mal bei X zu bleiben und lies Y" um das Thema besser zu verstehen.


    Vielen Dank im Vorraus!

  • Das Problem ist, das egal wie ich das reencode das Ergebnis ist nie wirklich synchron.


    Wenn ich aus dem original ts ein mkv mache ist noch alles synchron.


    Wenn ich aus dem mkv die tracks extrahiere und dann wieder ein mkv daraus muxe ist immer noch alles synchron.


    Wenn ich jetzt den video track mit x264 reencode ist das Ergebnis egal wie ich es muxe asynchron (egal ob mit oder ohne timestamps). Einzig wenn ich beim muxen das Audio delay (welches ich mir vorher aus dem TS geholt habe) angebe ist das Ergebnis fast synchron.


    avconv hatte ich gerade schon abgeschrieben, da avconv egal was ich eingebe kein x264 High profile kann und sobald ich vbv maxrate und bufsize angebe ein defektes File dabei herauskommt.


    Mit mencoder spiele ich die letzten Tage/Stunden rum und habe so meine Probleme hier das mkv synchron zu bekommen.


    Ich frage mich halt ob ich die Kombination mkvmerge und x264 behalten soll und schauen soll das ich hier über Angabe des audio delay das File akzeptabel bekomme oder ob ich auf mencoder setzen soll.


    Mit fehlt halt leider einiges an Hintergrundwissen was diesen Encoding/Multimedia Thema angeht, aber ich möchte halt meine ganzen HD Filme die ich aufgenommen habe in sehr guter Qualität aber mit weniger Speicherverbrauch zu archivieren.
    Ich bin bereit alles mögliche auszuprobieren und zu lesen, aber allein mit ausprobieren komme ich leider nicht mehr weiter.


  • Ich bin bereit alles mögliche auszuprobieren und zu lesen, aber allein mit ausprobieren komme ich leider nicht mehr weiter.


    Das Problem wird sein, dass du Audio kopiert haben möchtest. Besorg dir mal Handbrake (GUI) und da sollte auch das Kommandozeilen Tool HandBrakeCLI dabei sein.
    Und dann rechne dein TS mal damit um. Handbrake unterstützt bei einigen Audiocodecs einen passthrough Modus (auch AC3). Da wird nicht wie bei ffmpeg/avconv einfach nur kopiert, sondern auch Fehler korrigiert.



    z.B.
    HandBrakeCLI -i input.ts -o output.mkv -e x264 --x264-preset slow --x264-tune film -x aq-mode=2:nopsnr:nossim -q 21 --cfr -a 1 -E copy --crop 0:0:0:0 --strict-anamorphic --decomb

  • Ohne mich hier einmischen zu wollen, "wir hatten schon immer diese Probleme mit dem Sync bei DVB-S". Mal im Ernst, ich bin nicht up2date, Handbrake kenne ich nicht, aber: wenn dieses Tool macht was uns damals ProjectX brachte, dann ist das vielleicht ein richtiger Weg. Wueilll: DVB ist scheinbar oefter mal outofsync...

  • Mit ein klein wenig Hintergrundwissen im Bereich der Audio- und Video-Codierung und Dateiformaten ist das auch nicht weiter verwunderlich.


    Audio-Blocks sind kürzer als eine Zehntelsekunde, und jeder einzelne davon kann praktisch sofort decodiert werden, sowohl bei MP2 als auch bei AC3, weil alle voneinander unabhängig sind.


    Video-GOPs dagegen haben viele voneinander abhängige Frames und sind bei MPEG2 oft etwa eine halbe Sekunde lang, bei MPEG4-AVC vielleicht noch länger (wenn nicht gewisse DVB-Spezifikationen das ebenso begrenzen, z.B. für leichteres Umschalten zwischen den Sendern). Wenn die digitale Aufzeichnung nicht zufällig an einem I-Frame begonnen hatte, dann müssen Decoder die erste angeschnittene GOP überspringen, um das Video wieder fehlerfrei decodieren zu können. Dabei geht eben die Spieldauer des GOP-Restes verloren, aber das Audio kann währenddessen schon decodiert werden.


    Die einfachste Möglichkeit, Audio und Video synchron zu bekommen, ist das Anschneiden des Materials von vorn, so dass die Tonspur dann so gut wie gleichzeitig mit einer GOP beginnt.


    Nicht umsonst lautet die Empfehlung immer: DVB-Streams niemals unvorbearbeitet konvertieren. Es geht nicht nur um das Säubern von eventuellen Übertragungsfehlern, sondern auch um das Schaffen eines sauberen und synchronen Anfangs — also insgesamt um das Herstellen eines zuverlässig decodierbaren Ausgangszustandes.

  • Nicht umsonst lautet die Empfehlung immer: DVB-Streams niemals unvorbearbeitet konvertieren. Es geht nicht nur um das Säubern von eventuellen Übertragungsfehlern, sondern auch um das Schaffen eines sauberen und synchronen Anfangs — also insgesamt um das Herstellen eines zuverlässig decodierbaren Ausgangszustandes.


    Ok, d.h. ich muss mich erstmal damit beschäftigen.


    Kannst du mir eventuell noch weitere Hinweise oder ein Beispiel wie dies geht zeigen?


    Handbrake kenne ich und werde ich mal auf meinem Laptop (mit GUI) testen.