AVC raw-stream schneiden - fast ohne Neukodierung

  • Hallo Zusammen.

    Ich habe einen AVC raw-streamvon dem ich am Anfang und Ende ein Stück abschneiden möchte. Um möglichst "Qualitätsschonend" zu arbeiten, habe ich mir folgendes überlegt:

    Zunächst mal den gesamten Stream mit DGAVCIndex gemapped.
    Und da liegt auch schon der Hund begraben da ich den Inhalt des .dga nicht so 100% deuten kann. Noch dazu wird die Framenummer (#1, #2,#3, .... #203488)
    nicht mitgeliefert. Die ist insofern wichtig da ich den Soundfile (AC3) dementsprechend schneiden muß ...

    Meine Idee ist es bis zu einem bestimmten Frame zu springen. Dort zu schneiden (bzw. FadeIn) und nur die Frames bis zum nächsten I-Frame neu zu codieren. Den "rest" schneide ich am besagten I-Frame vorher ab.

    Nun habe ich zwei Elementarstreams. Einen mit neucodierten und den Rest mit den nicht angefassten. Kann ich mit einem "cat" (bzw. copy unter Win) die beiden Elementarstreams einfach wieder zusammenfügen ? Auch wenn jetzt nicht nach ca. 250 Frames das nächste I-frame kommt sondern schon vorher.

    Öffnet man den AVC stream mittels Avisynth + VirtualDubMod so bekomme ich nur Keyframes im VDM angezeigt. D.h. ich weiß nicht wo sich die I-Frames wirklich befinden. Dafür bekomme ich aber die Frame-Nummer angezeicht ...
    Gibt's da nicht ein besseres tool ?

  • Zitat

    Noch dazu wird die Framenummer (#1, #2,#3, .... #203488)
    nicht mitgeliefert.


    zu beachten ist auch, dass die Speicherordnung der Frames nicht der Abspielordnung entsprechen muss. :)

    Zitat

    Meine Idee ist es bis zu einem bestimmten Frame zu springen. Dort zu schneiden (bzw. FadeIn) und nur die Frames bis zum nächsten I-Frame neu zu codieren. Den "rest" schneide ich am besagten I-Frame vorher ab.


    Was ist mit Referenzen die über I-Frame Grenzen gehen oder B-Frames?

    => Du musst schon die ganze GOP (von einem IDR- zum nächsten IDR-Frame) neu encoden oder einiges mehr an Sonderfällen betrachten.

    Zitat

    Gibt's da nicht ein besseres tool ?


    http://www.h264visa.com/ , StreamEye oder andere Stream analyser,...

  • OMG...

    OK, das ich den Bereich zwischen den IDR Frames (das meinte ich mit I-Frames) bearbeiten muß ist klar.
    Kann man denn aus neuron2's dga file erkennen wie die Referenzen auf die anderen Frames verteilt sind ? Und wenn ja wie ?
    Ich habe bis jetzt immer angenommen das keine Referenzen über die "IDR Grenzen" hinaus gemacht werden. Oder anders gesagt, wenn ein IDR Frame neu auftaucht dann gibt's ab da ann auch neue Referenzen.

    H264Vista läuft ständig in "could not allocate memmory" ... und nach 87 Frames stürzt er ab.

  • Referenzen über IDR-Frames sind nicht möglich über I-Frames oder beliebige Schnittpunkte aber schon. ;)
    -> der sauberste Weg so etwas zu machen wäre
    1. IDR-Frames lokalisieren
    2. vom Schnitt betroffene GOPs extrahieren
    3. Neuencoden der GOPs
    4. neuencodete GOPs wieder einfügen
    5. eventuelle Timestamps&Co im Stream anpassen
    k.A. in wieweit man Daten aus den .dga Dateien auslesen kann.

    Cu Selur

  • Seh ich das richtig das IDR Frames = I Frames als Keyframes sind ?

    Sowohl in DGAVCIndex als auch im Elcard Stream Analyser bekomme ich als slice_type =7 .
    Nur steht dem "echten" IDR ein SPS voran.

    Welches Programm würdest du "empfehlen" um besagte GOP's aus dem Raw-Stream zu schneiden bzw. wieder zusammenzusetzen. Wenn nicht DGAVCIndex ...

    Der von Elecard angepriesene AVC HD Editor kann man getrost vergessen ...

  • slice_type=7 sagt nur dass es sich um ein I-Slice handelt.
    Ein SPS indexiert DGAVCIndex nur wenn sich vom vorherigen SPS unterscheidet (meist nicht der Fall).
    Ein IDR Frame wird im DGA File als IDR + dezimale Byteposition angegeben

    z.b
    ..
    PIC 2
    PIC 1
    RPS 9533882
    IDR 9533891
    FRM 7 0
    PIC 2
    ..

    ansonsten suchst du nach der Bytefolge
    00 00 00 01 65
    oder
    00 00 00 01 45
    oder
    00 00 00 01 25 (imho nur bei Sony AVCHD Cams)

    Wie willst du mit DGAVIndex schneiden???

  • Umständlich aber es (hoffentlich) geht :D

    Ich suche mir zuerst das erste GOP raus und notiere das erste bis zum letzten Frame.
    Dann setze ich per DGAVCIndex den Anfang auf das erste Frame des zweiten Gop's und das Ende an den Schluß des streams. Das lasse ich dann in einen neuen File schreiben (Save Project and demux video)

    Jetzt lasse ich den ersten GOP indexieren und bearbeite in per avs. Danach neu encoden per x264 -> raw stream.

    cat teil1.h264 teil2.h264 >> komplett.h264

    So zumindest der Plan :cool:


  • Ich habe einen AVC raw-streamvon dem ich am Anfang und Ende ein Stück abschneiden möchte. Um möglichst "Qualitätsschonend" zu arbeiten, habe ich mir folgendes überlegt:

    Wenn ich Dein Problem nicht mißverstehe, geht das ziemlich einfach, indem Du VirtualDub nimmst und dessen "SmartRendering"-Funktion (ab V. 1.7.) benutzt. Dafür müßtest Du den Stream in einen AVI-Container packen. VD codiert dann den Teil von Schnittpunkt bis zum nächsten I-frame neu und kopiert den Rest einfach.

    Ph.

  • Ok, also DGAVCIndex murkst rum beim auseinandertrennen der Teile. Nicht nur das er beim setzen der Marken I Frames wie IDR's behandelt (man muß schon in's .dga schauen um sicher zu gehen das es sich wirklich um ein IDR handelt - oder StreamEye benutzen), nach dem erzeugen des neuen Files schaue man sich mal das dazugehörige .dga an und bemerke das er anstatt mit IDR/I Frames auf einmal mit B Frames anfängt ...

    Also Hex-Editor ausgepackt und IDR Frame gesucht ... gefunden ... Teilstück(e) geschnitten. Nur fehlt der Header des besagten Teils und so kann weder DGAVCIndex noch sonst ein Programm damit was anfangen.

    Habe also den ersten Teil neu erzeugt sodaß zumindest Header + ein paar sekunden Bildmaterial da wahren, danach den zweiten Teil mit "copy" in einen kompletten Stream wieder zusammengebaut. In mkv gepackt. Abspielen jedoch Fehlanzeige. Kommt nur Müll.
    Frage: Wieso ?
    Der Stream stoppt nicht nach den besagten ersten Sekunden sondern läuft weiter. Nur zu sehen sind nur ein paar Blöckchen ...

    Edit:
    Nur so'ne Idee: Der erste Teil wurde zwar auch mit x264 gecodert, jedoch mit ganz anderen Optionen. Muß ich also ein SPS der ersten IDR des zeiten Teilstücks voranstellen ? und kann ich das vom Original Stream kopieren ?

    Einmal editiert, zuletzt von may24 (26. März 2009 um 00:33)

  • Virtual Dub kann meines Wissens nach kein 'SmartRendering' mit AVC,...

    Bei mir klappt es. Einfach als Codec eine ffdshow-Version nehmen, die auch den h.264 Encoder dabei hat (haben leider nicht alle Versionen) und diesen als Encoder in den ffdshow-Settings einstellen.

    EDIT: BTW, auf diese Weise macht das ja auch der CutAssistant, dort heißen die h.264-codierten avis "HQ"-avi. Man muß dort in den Settings unter "external cut application" nur noch für HQ-Avis VirtualDub auswählen und dann den Codec und die settings des Codecs einstellen.

  • Hi,

    es hat ein wenig gedauert ...

    Tja, das mit VirtualDub währ' einfach zu schön und einfach gewesen ... VD hat zwei große Haken. Erstens: es unterstützt (native) kein Matroska oder mp4 -> Container deren Inhalt größer als 4GB werden kann. Und zweitens kann es auch nicht mit Mpeg-4 Elementarstreams arbeiten (zumindest keine AVC's).

    Da man keine AVI's größe 4GB (4,5 GB in meinem Fall ) erzeugen kann, binn ich soweit wie vorher.
    Avidemux indexiert erst den File und stürzt dan ab. Getestet mit neuster Version. Sowohl mit Matrosaka als auch als RAW-Stream.

    Da Cutassistant mit VD arbeitet, hat er das selbe Problem ...

    Den RAW-Stream kann ich zwar mit avs öffnen, jedoch hebelt das scheinbar das SmartRendering aus, da der Stream ja decodiert wird und dann in YV12 unkomprimiert vorliegt.

    Jemand 'ne Idee ?

  • Den RAW-Stream kann ich zwar mit avs öffnen, jedoch hebelt das scheinbar das SmartRendering aus, da der Stream ja decodiert wird und dann in YV12 unkomprimiert vorliegt.

    Nicht "scheinbar", sondern "grundsätzlich". AviSynth decodiert immer.

    Mal sehen, ob LoRd_MuldeR was zu den Problemen bei Avidemux herausfindet.

  • Natürlich kann man avi files> 4 GB erzeugen,... müssen nur avi 2.0 aka. opendml avi anstatt avi 1.0 avis sein,....

    AviMux_GUI ist der Meinung das geht nicht ... (ja, ich habe ein NTFS Filesystem)
    Aber ich werd's nochmal mit der CLI Variante und Avidemux probieren (mkv -> avi umpacken)

  • 1248 zum Smart-Rendering mit ffdshow und VD:
    Ich hatte das auch mal getestet, aber das ist (zumindest für mich) leider nicht zufriedenstellen.

    may24
    Das was du vorhast funktioniert mit Einschränkungen für einige Arten von H264-Streams auf jeden Fall. Ich hab das schon dutzende Male erfolgreich getestet. Vielleicht kann ich ein paar hilfreiche Hinweise beisteuern:

    Vorgehensweise mal zusammengefasst:

    • Bsp: H264-Stream (Source)
      | SPS0 | PPS0 | IDR PBBBPBBBPBPBBIPBB | IDR PBBBPBBPBBBPBPBBIPBB | IDR... |
    • GOP in die hineingeschnitten wird (rot) lokalisieren (Hex-Editor)
      | SPS0 | PPS0 | IDR PBBBPBBBPBPBBIPBB | IDR PBBBPBBPBBBPBPBBIPBB | IDR... |
    • Den Stream in drei einzelne Streams aufspalten (Reststream links -> blau, einzelne GOP -> rot und Reststream rechts -> grün) Das kann man alles mit nem halbwegs guten Hex-Editor (z.B. HxD) machen. Wichtig: Um die einzelne GOP (rot) mit DGAVCDec indexieren zu können, musst du zuerst noch die letzten, vor dieser GOP vorkommenden, SPS und PPS NALUs davorpacken, damit der Stream wieder "gültig" wird. Die gleichen SPS/PPS NALUs müssen auch vor das 3. Streamstück (grün) gesetzt werden, sonst kannst du das später nicht an die geschnittene GOP hängen.
    • Einzelne präparierte GOP (rot) mit DGAVCDec indexieren und ganz normal per AVISynth und trim() in zwei Teile encoden, ensprechend so, wie der Schnitt eben sein soll. Wichtig: Wenn du nicht exakt die gleichen Settings benutzt, mit der die Source encodet wurde, z.B. wenn du Sie gar nicht kennst, oder evtl. ein anderer H264-Encoder verwendet wurde, muss x264 zusätzlich mit der Option --sps-id "x" aufgerufen werden, wobei "x" nur von 0-31 gesetzt werden kann. Der Wert muss verschieden sein von der vorherigen SPS-ID, die du im Schritt zuvor an die Streams "angeklebt" hast. In der Regel reicht ein Wert verschieden von 0, wenn die Source schon mit x264 encodet wurde. Vorteil: Ab jetzt kannst du ansonsten (fast) beliebige x264 settings für das Reencoding verwenden.
    • Aus
      | SPS0 | PPS0 | IDR PBBBPBBPBBBPBPBBIPBB | 
      wird dann also z.B.
      | SPS1 | PPS1 | IDR PBBBPBB | Cut | SPS1 | PPS1 | IDR PBBBPBPBBIPBB |
    • Streams in der entsprechenden Reihenfolge danach einfach wieder zusammen bauen.
      Teil1:
      | SPS0 | PPS0 | IDR PBBBPBBBPBPBBIPBB | SPS1 | PPS1 | IDR PBBBPBB |
      Teil2:
      | SPS1 | PPS1 | IDR PBBBPBPBBIPBB |  SPS0 | PPS0 | IDR... |

    Hinweis: Die Streams sind danach in der Regel nur noch auf dem PC problemlos abzuspielen.
    ----------------------------


    ...
    Nur fehlt der Header des besagten Teils und so kann weder DGAVCIndex noch sonst ein Programm damit was anfangen
    ...
    Edit:
    Nur so'ne Idee: Der erste Teil wurde zwar auch mit x264 gecodert, jedoch mit ganz anderen Optionen. Muß ich also ein SPS der ersten IDR des zeiten Teilstücks voranstellen ? und kann ich das vom Original Stream kopieren ?

    Exakt! Siehe Punkt 3 und Punkt 4 oben. Deshalb immer mit nem Hexeditor alles schnippeln und zusammenbasteln. Folgend ein paar Hilfen zur Identifizierung einzelner NALUs.

    greets
    LTJ

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!