TS Dateien mit H.264 Videostream verarbeiten

  • vielleicht auch mal einfach ffmpeg/mencoder versuchen


    mencoder hab' ich mal vor einem halben Jahr probiert. Mir gefällt das ganz Programm nicht. Man weiß einfach nicht was es tut.

    ffmpeg hab' ich jetzt nicht direkt probiert, aber nochmal einen Versuch mit ffdshow-tryouts beta 4a rev1723 restartet. Funktioniert auch soweit ganz gut. Ähnlich wie CoreAVC. Allerdings versagen beide dramatisch bei PremiereHD Sport Übertragungen bei echten 50fps (25Hz interlaced). Beide würfeln Szenen wild durcheinander. Witzigerweise beide nur, wenn ich den AviSynth Frameserver mittels DirectShowSource() bemühe, jedoch nicht wenn ich diese im WMP wiedergebe.

    Ich möchte aber ohnehin weg von DirectShow u.a. wegen Portabilität: Auf jedem Rechner sind unterschiedliche Codecs mit unterschiedlichen Merits und Features installiert. Ein portables Konvertertool wie Xvid4PSP bekommt man auf Basis von DirectShowSource nicht gescheint hin.

    @EDIT: seit 6. Februar 2008 gibt's eine Command Line Version von DGAVCDec 1.0.0 Alpha 15
    http://forum.doom9.org/showthread.php?p=1096739#post1096739

    Meine Skripts habe ich sofort angepasst und es läuft prächtig. Ohne Audio/Video Versatz und ohne DirectShow Filter Abhängigkeiten. Hier mal aktualisierte Skripts von mir, der ein oder andere mag' sich da vielleicht was abgucken. z.B. wie man xport automatisiert:

    convert_720p.bat:

    Code
    @ECHO OFF:: keep system interactive, by assigning low task priority:START /BELOWNORMAL convert.bat %1 scripts\template_dx_video720p.bat

    convert.bat:

    Code
    @ECHO OFFset filepath=%~dp1set ext=%~x1set base=%~n1set tooldir=%CD%cd /D %filepath%if NOT "%ext%"==".ts" goto usage:: demux with xport:"%tooldir%\xport\xport" -p "%base%".ts 0 0 0 >_xport.outFOR /F "tokens=4" %%a IN ('FINDSTR /C:"Program Number" _xport.out') DO (  echo Program Number %%a found in %base%.ts. Demuxing ...  "%tooldir%\xport\xport" "%base%".ts %%a 1 1 >_xport.out2)REN bits0001.mpv "%base%.h264":: create .dga file for AviSynth MPEG4-AVC importFOR /F "delims=()x tokens=3" %%a IN ('FINDSTR /C:"Program Number" _xport.out') DO (  "%tooldir%\dgavcdec100a15\DGAVCIndex.exe" -i "%base%.h264" -v %%a -o "%base%.dga" -f 0 -h)DEL /Q _xport.out:: set correct filename extensionFOR /F "tokens=8" %%a IN ('FINDSTR /C:"Audio PID" _xport.out2') DO set audiotype=%%aIF "%audiotype%"=="0x06" (  REN bits0001.mpa "%base%.ac3") ELSE (  REN bits0001.mpa "%base%.mpa")DEL /Q _xport.out2:: extract audio .> .wav:: BeSweet requires correct filename extension to detect audio typeif exist "%base%.ac3" (  set audiosrc="%base%.ac3") else (  if exist "%base%.mp2" (    set audiosrc="%base%.mp2") else (    set audiosrc="%base%.mpa"))"%tooldir%\BeSweetv1.4\BeSweet.exe" -core( -input %audiosrc% -output "%base%.wav" -2ch -logfile "%base%.BeSweet.log" ) -azid(-s stereo -c normal -L -3db )DEL /Q %audiosrc% "%base%.BeSweet.log":: convert .wav -> .aac"%tooldir%\neroAacEnc_v1_1_34_2\neroAacEnc_SSE.exe" -br 128000 -lc -if "%base%".wav -of "%base%".aacDEL /Q "%base%".wav:: put filename in .avsCALL "%tooldir%\%2" ^ "%base%.dga" ^ %tooldir% ^ >"%base%.avs":: convert video"%tooldir%\x264.revision.667.icl\x264.exe" --bitrate 8192 -A all --aud --level 4.1 --ref 3 --mixed-refs --bframes 3 --direct auto --threads auto --thread-input --progress "%base%.avs" -o "%base%264.mp4"DEL /Q "%base%.h264" "%base%.dga" "%base%.avs":: mux audio + video -> .mp4"%tooldir%\MP4Box\MP4Box.exe" -add "%base%264.mp4" -add "%base%.aac" -new "%base%.mp4"DEL /Q "%base%264.mp4" "%base%.aac"goto end:usageecho usage:echo %0 filename.ts:endREM exit

    scripts\template_dx_video720p.bat fehlt noch:

    Code
    @ECHO OFF
    echo LoadPlugin("%2%\dgavcdec100a15\DGAVCDecode.dll")
    echo LoadPlugin("%2%\TIVTCv102\TDeint.dll")
    echo AVCSource(%1%)
    echo CropBottom(8)
    echo BilinearResize(1280, height)
    echo TDeint()
    echo BilinearResize(width, 720)

    Vorteile:
    . vollautomatisch
    . transcoding mit niedriger Taskpriorität
    . volle Kontrolle über 720p, 1080p, Deinterlacer (hier braucht man nur einzeilige zusätzliche convert_1080p, convert_720p_deinterlace, die jeweils convert.bat parametrisiert aufrufen)
    . MultiCore Support
    . keine DirectShow Filter Abhängigkeit

    Nachteile / ToDos:
    . Einige Operationen wie [ts -> .mpv/.mpa demux] sowie [.mpv -> PS3 MPEG4-AVC] geschehen im gleichen Verzeichnis / gleiche Platte. Hier wäre es besser beide Kopieroperationen mit source/target auf unterschiedlichen Platten zu haben. Also: Support für ein TEMP Verzeichnis auf einer anderen Platte.

    bg,
    7oby

  • Ich verstehe die Zeile im Script nicht ganz:

    ..
    CALL "%tooldir%\%2" ^ "%base%.dga" ^ %tooldir% ^ >"%base%.avs"
    ..

    Was möchtest Du damit erreichen?

    Habe den Script versucht zu verwenden, der passt aber noch nicht ganz.
    Ich habe ein HD-.ts File verwendet, aber das wollte nicht:
    Ich hatte Probleme, da darin mehrere PID's enthalten sind und somit die For-Schleifen die Daten wieder überschrieben haben. Hier habe ich den PID selbst gewählt.

    x264.exe ist dann ausgestiegen mit: " Rawyuv input requires a resolution." Somit habe ich noch ein [1920x1080] hinter das Input-File geschrieben.

    ..bis zum Ende bin ich noch nicht gekommen..


  • CALL "%tooldir%\%2" ^ "%base%.dga" ^ %tooldir% ^ >"%base%.avs"
    Was möchtest Du damit erreichen?

    Sagen wir das Skript liegt in C:\hdtv. Dadurch, dass convert.bat mit den Parametern "meinStream.ts scripts\template_dx_video720p.bat" aufgerufen wird, expandiert sich obige Zeile zu

    CALL C:\hdtv\scripts\template_dx_video720p.bat meinStream.dga C:\hdtv >meinStream.avs

    template_dx_video720p.bat generiert also die Datei meinStream.avs mit etwa folgendem Inhalt und das müsstest Du überprüfen:

    Code
    LoadPlugin("C:\hdtv\dgavcdec100a15\DGAVCDecode.dll")
    LoadPlugin("C:\hdtv\TIVTCv102\TDeint.dll")
    AVCSource(meinStream.dga)
    CropBottom(8)
    BilinearResize(1280, height)
    TDeint()
    BilinearResize(width, 720)

    Die .dga Datei hat zuvor übrigens DGAVCIndex.exe erzeugt.

    --

    Wenn's mehrere uneindeutige PIDs gibt, dann hat man natürlich ein Problem. Ziel des Skripts war vollautomatisierte Konvertierung - ohne Benutzerinteraktion. In dem Fall wie Du schon gemacht hast: Zuerst die PIDs manuell vorgeben und wenn man die Struktur seiner .ts Files erkannt hat, dann ggf. das Skript anpassen.

    x264.exe ist dann ausgestiegen mit: " Rawyuv input requires a resolution." Somit habe ich noch ein [1920x1080] hinter das Input-File geschrieben


    Das ist ganz sicher nicht so wie's sein soll. Denn der Import der MPEG4-AVC Daten erfolgt mit AviSynth (und nicht raw YUV!). Avisynth gibt dann auch die korrekte Auflösung an x264 weiter. Bei Dir hat irgendetwas mit Avisynth nicht geklappt (hast das überhaupt installiert?).

    --

    Es ist empfehlenswert die gesamte Toolkette manuell zuerst zu probieren, da das "Debuggen" so einfacher ist. Mit manuell meine ich die Tools einzeln anstoßen und Ergebnisse kontrollieren. Nachdem alles geprüft ist, kann es in einem Rutsch als Skript laufen. Ggf. das Löschen der temporären Zwischendateien auskommentieren, um so wieder leichter debuggen zu können.

    Das Skript ist generell nur empfehlenswert, wenn man wirklich vollautomatisieren möchte. Möglicherweise gibt es heute schon Tools, die dies leisten. Zum Zeitpunkt als dieses Skript entstanden ist, gab es diese Tools nicht.

    Ein weiter Punkt, den man sich überlegen sollte: Muss ich wirklich zeitaufwändig transcoden? Das Skript hat Dateien für die PS3 aufbereitet und dessen MPEG4-AVC Dekoder hat eben gewisse Einschränkungen. Zur Archivierung von HDTV per DVB-S2 auf dem PC spricht auch nichts dagegen lediglich den Transport-Stream aufzutrennen und die wichtigen Video + Audio spuren in MP4 oder .MKV zu muxen. Denn der PC kann alles abspielen. Transcoden kann aber auch hier (DVB-S2) sehr nützlich sein. Beispielsweise hatte ich 720p50 Streams, die 50Hz Bilder enthielten. Da die zugrunde liegende Videoquelle jedoch 25Hz (bzw. hoch gepitches 23,976fps) Material war, waren jeweils zwei aufeinander folgende Bilder jeweils gleich (und trotzdem neu kodiert). In diesem Fall habe ich einfach jedes zweite Bild verworfen um nur das "echte" Video zu speichern und konnte so die benötigte Bandbreite deutlich reduzieren.

    Will man trotzdem transcoden sei noch auf den DXVA nVidia Decoder für H.264 von neuron2 verwiesen:
    http://forum.doom9.org/showthread.php?t=141104
    Damit kann man das Transcoden noch deutlich beschleunigen sofern man eine moderne nVidia Grafikkarte besitzt und außerdem das Quellmaterial mit dem DXVA H.264 GPU Decoder von nVidia kompatibel ist.

  • ich habe jetzt nach Selurs Anleitung 3 MKV-Datein erstellt, alle enthalten einen H.264 Stream + AC3-Audiodateien. Und sind scheinbar auch synchron. Bloß wie kriege ich die 3 Dateien zu jetzt einer Datei? AVI-Mux Gui stürzt mit einer Standard-Fehlermeldung ab und erstmal eine Datei die nur 448MB groß ist. Alle Dateien zusammen sind 1,11GB groß.
    Danke für eine Antwort!

  • redone_times: Aus Deiner Frage geht nicht eindeutig hervor, ob Du

    Fall 1) einfach drei video und drei audio Spuren in einem .mkv zusammenklatschen willst. Also z.B. 4:3 Format; 16:9 Format und 16:9 anamorph sowie deutsch, englisch, spanisch.

    Fall 2) Du meinst, dass aus 3x 1h Film insgesamt ein 3h Film werden soll.

    Wenn man bei .mkv ist, bleibt man aus guten Gründen bei .mkv (.mkv wurde gerade erfunden um viele Schwachstellen von .avi zu überbrücken). Ansonsten ginge aus Kompatibilitätsgründen zu bestimmten Hardwareplayern auch .m2ts oder .mp4. Also Fall 1) kannst mit mkvmerge (GUI) behandeln.

    Fall 2) geht aber auch mit mkvmerge - da muss dann ein "+" vor das zweite .mkv:
    mkvmerge -o output.mkv part1.mkv +part2.mkv
    http://www.bunkus.org/videotools/mkv…c/mkvmerge.html

    Wenn die TrackIDs nicht zusammen passen, müssen sie mti "−−append−to" angepasst werden. Vielleicht geht das auch mit der mkvmerge GUI.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!