h264 - ohne transcodieren schneiden - mencoder

  • Ich würde gerne hier und da einige meiner Videos beschneiden oder miteinander verbinden, aber ohne diese komplett neu zu kodieren. Damit keine Unklarheiten aufkommen hier die Info wie die Dateien aussehen:

    Code
    GeneralUnique ID                        : 189390199236492262374150506017076190598 (0x8E7B39C027AD9FB4B4BB9960443A9D86)Complete name                    : O:\test.mkvFormat                           : MatroskaFile size                        : 293 MiBDuration                         : 13mn 42sOverall bit rate                 : 2 991 KbpsEncoded date                     : UTC 2011-07-02 18:00:53Writing application              : mkvmerge v4.8.0 ('I Got The...') gebaut am May 24 2011 03:12:58Writing library                  : libebml v1.2.0 + libmatroska v1.1.0VideoID                               : 1Format                           : AVCFormat/Info                      : Advanced Video CodecFormat profile                   : High@L4.1Format settings, CABAC           : YesFormat settings, ReFrames        : 5 framesCodec ID                         : V_MPEG4/ISO/AVCDuration                         : 13mn 42sBit rate mode                    : VariableBit rate                         : 2 800 KbpsMaximum bit rate                 : 15.0 MbpsWidth                            : 720 pixelsHeight                           : 576 pixelsDisplay aspect ratio             : 4:3Original display aspect ratio    : 4:3Frame rate                       : 25.000 fpsStandard                         : PALColor space                      : YUVChroma subsampling               : 4:2:0Bit depth                        : 8 bitsScan type                        : MBAFFBits/(Pixel*Frame)               : 0.270Stream size                      : 269 MiB (92%)Title                            : x264 2800kbps 576iWriting library                  : x264 core 115 r1995 c1e60b9Encoding settings                : cabac=1 / ref=6 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=9 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=6 / sliced_threads=0 / slices=4 / nr=0 / decimate=1 / interlaced=bff / bluray_compat=1 / constrained_intra=0 / bframes=3 / b_pyramid=1 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=1 / weightp=0 / keyint=25 / keyint_min=2 / scenecut=40 / intra_refresh=0 / rc_lookahead=25 / rc=2pass / mbtree=1 / bitrate=2800 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / cplxblur=20.0 / qblur=0.5 / vbv_maxrate=15000 / vbv_bufsize=15000 / nal_hrd=vbr / ip_ratio=1.40 / aq=1:1.00Language                         : GermanColor primaries                  : BT.470-6 System B, BT.470-6 System G, BT.601-6 625, BT.1358 625, BT.1700 625 PAL, BT.1700 625 SECAMTransfer characteristics         : BT.470-6 System B, BT.470-6 System GMatrix coefficients              : BT.470-6 System B, BT.470-6 System G, BT.601-6 625, BT.1358 625, BT.1700 625 PAL, BT.1700 625 SECAM, IEC 61966-2-4 601AudioID                               : 2Format                           : AC-3Format/Info                      : Audio Coding 3Mode extension                   : CM (complete main)Codec ID                         : A_AC3Duration                         : 13mn 42sBit rate mode                    : ConstantBit rate                         : 192 KbpsChannel(s)                       : 1 channelChannel positions                : Front: CSampling rate                    : 48.0 KHzBit depth                        : 16 bitsCompression mode                 : LossyStream size                      : 18.8 MiB (6%)Title                            : 1.0 AC3 192kbpsLanguage                         : German


    Ich habe versucht mich dem Thema über mencoder zu nähern, allerdings ohne Erfolg:

    Code
    mencoder test.mkv -o test.h264 -ovc copy -nosound -ss 00:00:10.00


    Müsste ja eigentlich eine copy des Videotracks ab dem nächsten I-Frame nach der 10ten Sekunde abliefern. Wenn ich nun dieses video aber mit mkv-merge muxe macht die Wiedergabe fast überall probleme (außer bei Mplayer - aber selbst da gibts am Anfang Bildfehler oder es wird zu schnell abgespielt. Ausserdem stimmt der Zeitindex nicht).

    Ich bin nicht festgelegt auf mencoder. AVIDemux habe ich auch schon probiert, aber wieder aufgegeben, weil es anscheinend nicht in der Lage ist die I-Frames in meinem Video zu finden - Daher kommt es bei MKV-Ausgabe immer wieder zur Fehlermeldung: The beginning frame is not a keyframe. Please move the A-Marker.
    Wähle ich dort als Output AVI gehts, aber das Ergebnis ist augenscheinlich das Gleiche wie mit Mencoder. Das Video läßt sich nirgends korrekt abspielen.

  • 1. ist die "Encoding settings" Zeile in der Mencoder ausgabe bei allen identisch?
    2. sicher, dass mencoder auch zum nächsten IDR/Key- und nicht nur zum nächsten I-Frame springt (das sind unterschiedliche Framertypen)
    - bei mencoder sollte man auch noch '-of rawvideo' angeben um sicher zu sein, dass da nicht noch irgendwelche Header um den Stream geschrieben werden die da nicht hingehören
    - alternativ könnte man auch ffmpeg versuchen, dabei sollte man dann aber darauf achten, dass '-vbsf h264_mp4toannexb' gesetzt ist)
    3. "es wird zu schnell abgespielt. Ausserdem stimmt der Zeitindex nicht" hört sich nach einem Fehler beim Muxing an (aber ohne genauen Befehl den Du benutzt ist das nur eine Vermutung)
    4. "The beginning frame is not a keyframe. Please move the A-Marker." was spricht dagegen der Aufforderung zu folgen? (genaueres zu AviDemux kann aber vermutlich jemand sagen, der es auch nutzt)

    Cu Selur

  • Es geht nicht mal nur um I-Frames: Ein AVC-Schnittprogramm muss IDR-Frames finden. Der mencoder ist dafür ziemlich sicher ungeeignet.

    Genauso wie AVI als Ausgabe-Kontainer-Format für AVC-Video in Avidemux.

    Das Schneiden sollte man eigentlich schon vor der Encodierung des Videos erledigen.

    Und über die Schwierigkeiten, mit denen ein Programm mit Smart Rendering für AVC zu kämpfen hätte, wurde hier auch schon mehrfach berichtet.

  • Hab gerade mal zum Test folgendes gemacht:
    1. einen RAW .264 mit mencoder geschnitten (nur eine Sekunde, da mein Testclip nur ein paar Sekunden lang war und nur wenige key-frames hat)

    Code
    mencoder -nosound -vid 0 -ovc copy -ss 1 -of rawvideo -o "test_16_29_33_141_01.264" "rawAVCvideo.264"

    2. den geschnittenen Stream mit mkvmerge in einen mkv container gepackt:

    Code
    mkvmerge --ui-language en -o "test.mkv" -d 0 --default-track 0:yes --default-duration 0:25fps --aspect-ratio-factor 0:1 --fourcc 0:MP4V --no-chapters --forced-track 0:no --no-audio --no-subtitles "test_16_29_33_141_01.264"

    -> Ergebnis: der Videostream ist geschnitten und lässt sich ohne Probleme abspielen.

    Cu Selur

    Ps.: Ich vermute übrigens, dass mencoder, durchaus zum nächsten IDR-frame springt, habe dies aber noch nie getestet,.. :)

  • Ja, ich hätte sie auch lieber vorher geschnitten... nur sind mir leider erst im Nachhinein ein paar unschöne Dinge aufgefallen. Wäre halt nett, wenn man die noch irgendwie rausbekommt.

    Nach Selurs Zeile dachte ich zunächst es läge irgendwie am MKV womit ich Mencoder füttere, aber auch die Variante es über Raw-Video (MKV demuxt) zu versuchen - wie Selur - klappt nicht. Dort meckert Mencoder nun selber über "Invalid Seek to negative position" und das fertige h264 ist nur 724Byte groß.

    Selur
    1. Ja, 100% identisch
    2. Raw probiert, geht auch nicht... das mit ffmpeg werde ich mal versuchen (hoffentlich krieg ich das hin)
    3. Also ich muxe immer über das GUI. Im Fall von RAW achte ich halt auf die korrekten FPS und Seitenverhältnis.
    4. Ja, wenn ich denn das nächste finden könnte... Eigentlich sollte ja bei einem GOP von 25 alle 25 Bilder ein I-Frame sein, oder? Er meckert aber bei allen. 120-170 hab ich schon durch.

    Könnte das evtl. an der Mencoder-Version liegen?
    Ich nutze eine aus dem Tool: multiAVCHD. Würde in dem Zusammenhang gerne wissen, wo man eine neue Variante bekommt. In den Binaries von http://mplayerhq.hu/design7/dload.html ist die irgendwie nicht dabei.

    Schade das hieraus anscheinend nichts weiter hervorgegangen ist:
    http://forum.gleitz.info/archive/index.php/t-41408.html

    Einmal editiert, zuletzt von rodgar (29. Juli 2011 um 17:28)

  • Ein zusätzliche Schwierigkeit ist, daß Du --open-gop beim Enkodieren aktiviert hast. Damit wird das Schneiden noch zusätzlich erschwert, da kaum noch IDR-frames gesetzt werden.

  • Zitat

    Eigentlich sollte ja bei einem GOP von 25 alle 25 Bilder ein I-Frame sein, oder?


    Nein, bei einer GOP von 25 sollte alle 25 Frames ein IDR-Frame sein, es sei den man verwendet OpenGop.

    Zitat

    Schade das hieraus anscheinend nichts weiter hervorgegangen ist:
    http://forum.gleitz.info/archive/index.php/t-41408.html


    Lupurus hatte wohl wenig Zeit, meinte aber letztens, dass er noch mal draufgucken wollte,..

    Zitat

    Könnte das evtl. an der Mencoder-Version liegen?


    Eher unwahrscheinlich, nutze selber die aktuellste Version von: http://sourceforge.net/projects/mplayer-win32/files/

    Zitat

    das mit ffmpeg werde ich mal versuchen (hoffentlich krieg ich das hin)

    Code
    ffmpeg -i h264.mkv -vcodec copy -ss 5 -vbsf h264_mp4toannexb -an out.h264
    Zitat

    "Invalid Seek to negative position"


    hört sich sehr nach kaputten Headern im RawStream an,..
    Womit hast Du den den demuxed?

    ----

    Zitat

    Ich bin nicht festgelegt auf mencoder.


    Wenn Du die Zeit kennst an der Du schneiden willst und IDR genau reicht, dann kannst Du auch einfach mkvmerge verwenden,.. (Global->Aufteilen->Aufteilen aktivieren->...)

    Cu Selur

  • Vielen Dank für die aktive Hilfe :)

    Code
    hört sich sehr nach kaputten Headern im RawStream an,..
    Womit hast Du den den demuxed?


    Ebenfalls mit einem GUI und zwar dem für MKVExtract. Der RawSTream direkt wieder mit MKVMerge gemuxt funktioniert allerdings einwandfrei...

    Schande über mein Haupt, ich muss gestehen, daß ich keine Ahnung davon habe, was ein IDR-Frame ist. Bei I, P und B hörts dann auch schon auf.
    Ideal wäre es natürlich, wenn es Framegenau ginge. Zur Not geht es aber auch, wenn 1-2 Sekunden Versatz besteht.

    Erläuterung:
    -------------
    In erster Linie geht es darum den Anfang von rund 30 Videos zu ersetzen. Das sind 150 Frames weiß auf Schwarz Titeleinblendungen nebst crossfade ins Video. Diese sind aufgrund von Beschriftungen von 1989 entstanden. Und jetzt habe ich bemerkt, daß diese aber manchmal offensichtlich falsch ist.
    Beispiel: April 1989 kann nicht stimmen, wenn auf dem VHS-Band mitten drin irgendwo eine Szene vom Vatertag existiert, der am 04.05.1989 war. Das ergibt sich leider nur aus dem Kontext... ja, und so muss ich nun irgendwie alle Titeleinblendungen der Videos nach diesem Tag gegen neue tauschen. Und ich höre Ligh schon sagen: "Nimms neu auf, geht schneller, ist sicherer!" :)

    Ich werde das mit ffmpeg am Montag mal testen (Danke für die Line, Selur!) ... Hab übers WE leider keinen Zugang zu den Videos.

    Das mit open-Gop klingt einleuchtend... VIeleicht ist das ja auch der Grund, wieso AVIDemux damit Probleme hat.

    Edit
    -------
    Ich habe mir gerade noch was überlegt: Wie gesagt, es geht hier um Titeleinblendungen am Anfang diverser Videos. Diese müssen ersetzt werden. Weder die Länge und Art der Einblendung noch die Länge des gesamten Videos wird dabei aber tatsächlich verändert.
    Prinzipiell müsste also garnichts geschnitten sondern nur der VideoAnfang "überschrieben" werden. Ist so etwas möglich? Also wie eine Art Ebene, die man über den Anfang des Videos legt. Oder ist das zu naiv gedacht und womöglich noch viel schwerer zu realisieren als es einfach irgendwie zu schneiden und den Anfang zu ersetzen?

    Einmal editiert, zuletzt von rodgar (29. Juli 2011 um 21:51)

  • ich muss gestehen, daß ich keine Ahnung davon habe, was ein IDR-Frame ist. Bei I, P und B hörts dann auch schon auf.


    Eine sehr schöne Erklärung:

    http://encodingwissen.de/x264/technik.html#refs


    Prinzipiell müsste also garnichts geschnitten sondern nur der VideoAnfang "überschrieben" werden. Ist so etwas möglich? Also wie eine Art Ebene, die man über den Anfang des Videos legt. Oder ist das zu naiv gedacht und womöglich noch viel schwerer zu realisieren als es einfach irgendwie zu schneiden und den Anfang zu ersetzen?


    Prinzipiell läuft das auf das selbe hinaus, da nach meinem Verständnis jegliche Veränderung am Bildinhalt ein erneutes Encoden der betroffenen Frames (und aller Frames, die darauf referenzieren) nötig macht.

    Who is General Failure and why is he reading my hard drive?

    He was trying to get in touch with Private Data but if it involves a Major Disaster I understand that the fault lies with General Protection.

    Furthermore, if you cannot reboot it may be because of a corrupt Colonel.

  • Zitat

    Wenn Du die Zeit kennst an der Du schneiden willst und IDR genau reicht, dann kannst Du auch einfach mkvmerge verwenden,.. (Global->Aufteilen->Aufteilen aktivieren->...)


    Nachdem das weder mit mencoder noch mit ffmpeg geklappt hat (Bei ffmpeg hat mkvmerge den Track nicht mehr als unterstütztes Videoformat erkannt) habe ich das mal direkt über mkvmerge probiert - wie du gesagt hast. Klappt bestens, auch wennn es doch etwas aufwendig ist :)

    Denn einfach die neue Titeleinblendung als MKV mit dem durch Global->Aufteilen nun 2ten Teil des Videos (ebenfalls MKV) zusammenzufügen scheint nicht zu gehen (MKVmerge merkt an, daß die Tracks nicht das gleiche Format besäßen). Video und Audio demuxt, audio(neu+alt) und video(neu+alt) separat per append verbunden, dann zu einem MKV gemuxt - Geht!

    Das Endvideo scheint augenscheinlich in Ordnung zu sein. Gibt es da auch eine Methode wie ich das auf etwaige Fehler testen kann, oder kann ich beruhigt sein, wenns sauber und synchron abgespielt wird. Nicht, daß dann irgendwann das böse Erwachen kommt, wenn ich das in ein paar Monaten über AVCHD bei Bekannten abspiele... Wäre unschön.

    Tom Keller
    Habe ich schon befürchtet, daß das zu naiv gedacht war. Aber ich glaube mit der Methode über split und append von mkvmerge haut das jetzt auch so hin... Danke für den Link mit der Erklärung zu IDR.

  • Also bislang gabs damit nie Probleme.
    Alle meine Videos liegen als MKV auf Platte und sind von den Datenraten genau so angepasst, daß sie nach dem umwandeln in AVCHD-Struktur entweder auf DVD9 oder DVD5 passen. Will dann mal wer ein Video auf Scheibe haben, ziehe ich das MKV entweder in multiAVCHD oder tsmuxer, wandle es um und brenne das Ergebnis. Klappte nach einigem Hin und her wegen der maximal erlaubten Bitrate von 15mbyte/s, Fake-Interlace bei progressivem Material, korrekter SAR und noch einigem anderen dann irgendwann immer tadellos...

    Aber wie es aussieht wird mein Ansinnen schon durch eine andere Sache durchkreuzt: Die IDR-Frames sind nur bei knapp 20% der Videos genau dort, wo es mit dem Schnitt gut hinhaut, bei allen anderen kann ich das komplett vergessen. Und da der Ansatz von "Lupurus"für mich überhaupt nicht funktioniert, bleibt wohl nur neu aufnehmen und encoden :(
    Kann man wohl nix machen.

    Trozdem, wie immer Danke für die Unterstützung!

Jetzt mitmachen!

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