mpeg2 schneiden



  • kennt jemand einen Algo wie man mpeg2 schneiden kann?
    Vielleicht sogar mit einem SmartCutting Verfahren. (Framegenau ohne neu codieren)
    I-Frame genau würde mir aber auch erstmal reichen.
    Ideal wäre natürlich gleich was in c++.

    Hat jemand infos dazu?



  • Vielleicht bringt dir folgende library etwas: http://libmpeg2.sourceforge.net/



  • Du hast mehrere möglichkeiten. Es hängt vor allem von den features ab die du habe möchtest + wie gut du dich mit mpeg auskennst.

    Hier mal ein paar ansätze:
    - Input: MPEG Video in nem MPEG Program Stream verpackt, schnitt an sequence start:
    Du durchsuchst den stream nach sequence header start codes. Sequence header stehen immer am anfang in nem PES pack, d.h. du kannst hier direkt am pack start (start code 0x000001BA) cutten.
    Was dann noch zu machen ist, ist eigentlich nur das anpassen der Timestamp. Dazu berechnest du die differenz zwischen dn beiden schnitt-stellen: SCR_diff = SCR_ersted_pack_nach_schnitt SCR_letztes_pack_vor_schnitt. Jetzt hast du ticks der system clock reference die du raus geschnitten hast.
    Diese differenz zeihst du jetzten von SCR's (System clock referene), PTS's (Playback timestamp) und DTS's (decoding timestamp) ab der nachfolgenden packs ab.
    Das wars. Mit MPEG2 doku in ein paar stunden erledigt.
    Eine 'nebenwirkung' hat diese methode aber: Nach dem I-Frame können B-Frames in der decoding-order liegen, die allerdings in der display-order vor dem I-Frame liegen.
    D.h. du hast B-Frames die physikalisch in deinem file nach dem I-Frame kommen, aber ein bild referzieren, das physikalisch vor dem I-Frame liegt und jetzt, nach dem schnitt, ein anderes bild ist als vor schnitt. Das kann ünschöne blidstörungen zur folge habe. Als fleißarbeit kannst du also nachsehen ob nach dem I-Frame B-Frames folgen, und falls ja diese killen.

    - Input: irgend ein mpeg, schnitt an I-Frames:
    I-Frame start codes können auch mitten in PES packeten stehen, d.h. du muss erst mal alles in seine einzeltele zerlegen (video, audio, ...), auch demultiplexen genannt.
    Sobald du die rohen video daten hast, suchst du nach I-Frame start codes, welche dann deinen Schnitt-Punkte darstellen. Hast du ein I-Frame gefunden das dir gefällt, suche rückwärts ob sich eine Sequence header vor dem frame befindet. Falls ja mach den cut for dem Sequence header start code. Falls keine Sequence header direkt vor dem frame liegt, such weiter bis du ein hast, kopiere die vor das frame und mache dann schnitt vor dem Sequence header start code.
    Sobald du alles umkopiert hast musst du deine einzelen streams wieder durch einen multiplexer jagen (demuliplexer anders rum), der die einlzenen elementary streams wieder in einen Program Stream bzw. Transport Stream verpackt. Fertig.
    Nebenwirkung: siehe oben.

    - Input: irgend ein mpeg, schnitt überall:
    Hierzu brauchst einen decoder & encoder. Du seekst den decoder an die possition an der geschnitten wird (kann jeded beliebige frame sein), und startest dann einer encoder mit den daten aus dem Encoder. Sobald der decoder das zweite mal an nem I-Frame vorbei lauft, sag dem encoder er soll die GOP (group of pictures) abschließen und schalte den bypass ein, der dein decoder/encoder gespann überbrückt und die orginal daten raus schreibt (neu encodieren ist jetzt überflüßig).



  • danke für die Infos.
    Bin wieder etwas schauer geworden..
    Hintergrundwissen ist immer gut

    Werde mir den Code von VDR mal ansehen.
    Das macht genau das was ich auch machen will.

    Den libmpeg2 werde ich nicht verwenden.
    Aber ich benutze jetzt schon ffmpeg. Da sollte auch was brauchwares mit bei sein.


Anmelden zum Antworten