Choppy ffmpeg output bei Bitratenkonvertierung

  • Ich benutze ffmpeg 0.4.6 unter Linux um ein MPEG1 von 4 MBit/s auf 1,5 MBit/s Übertragungsrate zu komprimieren:

    ffmpeg -i <inputfile> -b 1500 -ab 128 <outputfile>

    Wie ich es auch drehe, immer fehlen im resultierendem Teile aus dem Videostream und dem Audiostream, bei verschiedenen Bitraten an verschiedenen Stellen.

    Daten zum Video:

    MPEG1 System File
    Muxrate 4,44 Mbit/s
    Duration 3min42sec
    Size 352x288; 25 fps; 4 Mbit/s
    Audio MPEG1 Layer 2
    384 kBit/s 44,1 kHz
    Stereo

    Hat jemand eine Idee?

    /Helmut

  • :hallo:

    "Wie ich es auch drehe, immer fehlen im resultierendem Teile aus dem Videostream und dem Audiostream, bei verschiedenen Bitraten an verschiedenen Stellen."

    Was fehlt? :confused:

    Lass eventuell mal das File durch vcdgear laufen, eventuell hat das mpeg file ja intern ne Macke,..

    Cu Selur

  • Vielen Dank für die Antwort,

    im Video-Stream scheint immer wieder mal ein GOP zu fehlen. Wenn ich zu einem reinen I-Frame-Stream konvertiere fehlt häufig ein Bild, so etwa alle zwei Sekunden. Wenn GOP größer gewählt wird, werden die Lücken im Stream länger, treten aber auch seltener auf. Das Bild friert einfach für diese Zeit ein.

    Im Audio-Stream fehlt regelmäßig ein Stück, statt dessen wird "Stille" ausgegeben. Diese stillen Abschnitte sind nicht mit den fehlenden Bildinhalten synchron.

    Da die Aussetzer nach verschiedenen Konvertierungen (GOP-Länge bzw. versch. Bitrate) an unterschiedlichen Stellen auftreten, glaube ich nicht an eine defekte MPEG Datei. Ich werde dennoch vcdgear drüber laufen lassen und vom Ergebnis berichten.

    /Helmut

  • So, ich habe da mal ein paar Tests vorgenommen:

    ---------
    1) Ich habe mal das Original-MPEG mit vcdgear untersucht:

    vcdgear16 -mpg2mpg -fix <Original.mpg> testfix.mpg

    VCDGear v1.6e build 111301 coded by Dracore (vcdgear@hotmail.com)

    MPEG file source --> <Original.mpg>
    MPEG destination --> testfix.mpg
    Extraction method --> mpg2mpg
    - Fix MPEG errors enabled.

    100% [00:00:00] -> writing...
    completed. testfix.mpg written.
    initial sequence correction applied.
    0 MPEG block correction(s) applied.

    ----------
    2) Anschließend habe ich die Übertragungsrate konvertiert:

    ffmpeg -i testfix.mpg -b 1500 -ab 128 testffm.mpg
    libavcodec: CPU flags: mmx mmxext sse sse2
    Input #0, mpeg, from 'testfix.mpg':
    Stream #0.0: Video: mpegvideo, 352x288, 25.00 fps, q=0-0, 4000 kb/s
    Stream #0.1: Audio: mp2, 44100 Hz, stereo, 384 kb/s
    Output #0, mpeg, to 'testffm.mpg':
    Stream #0.0: Video: mpeg1video, 352x288, 25.00 fps, q=3-15, 1500 kb/s
    Stream #0.1: Audio: mp2, 44100 Hz, stereo, 128 kb/s
    Stream mapping:
    Stream #0.0 -> #0.0
    Stream #0.1 -> #0.1
    Press [q] to stop encoding
    frame= 5570 q= 3 size= 27314kB time=222.7 bitrate=1004.8kbits/s

    ---------
    3) Um dieses resultierende File nochmals mit vcdgear zu untersuchen.

    vcdgear16 -mpg2mpg -fix testffm.mpg test.mpg

    VCDGear v1.6e build 111301 coded by Dracore (vcdgear@hotmail.com)

    MPEG file source --> testffm.mpg
    MPEG destination --> test.mpg
    Extraction method --> mpg2mpg
    - Fix MPEG errors enabled.


    WARNING: Corruption might occur for non-valid pack sized MPEGs

    Segmentation fault

    ----------
    Die resultierende Datei "test.mpg" hat die Länge 0, also ohne Inhalt. Das schaut mir nach einer Fehlcodierung nach der Bitratenkonversion aus. Übrigends, "testffm.mpg" läßt sich mit den beschiebenen Fehlern abspielen. Hat noch jemand Tipps?

    /Helmut

  • Ich habe folgenden Weg gewählt:

    Zunächst habe ich die Videos mit VirtualDub (Vers. 1.5.4) in .avi gewandelt, ohne irgendwelche Filter oder Bitratenkonvertierung vorzunehmen.

    Anschließend codiere ich die .avi mit avi2mpeg1 (Vers. 1.11) zurück zu MPEG1, diesmal mit Angabe der reduzierten Bitraten für den resultierenden Stream:

    avi2mpg1.exe -s 1700 -d <avi-inputfile> <mpg-outputfile>

    Noch ein paar Randbemerkungen: Die Konvertierungen habe ich auf einem W2k-Rechner vorgenommen. Das ursprüngliche MPEG1 explodiert bei der Wandlung zu .avi von 123 MByte auf 2,5 GByte. Das resultierende MPEG1 schrumpft dann wieder zu 45 MByte. Natürlich sind dabei Abstriche in der Qualität hinzunehmen, aber nun kann ich das Video in Echtzeit über eine bandbreitenlimitierte Leitung übertragen.

    Kennt jemand eine Möglichkeit diese Konvertierung in Echtzeit vorzunehmen? Mit ffmpeg bin ich nun gerade auf die Nase gefallen. Gibt es andere Alternativen?

    /Helmut

  • Du meinst sicher eine Art Rekomprimierung, wie das z.B. ReMPEG2 durchführt... da kenne ich leider nichts dergleichen. Für MPEG2-Video gibt's das, für MPEG1 kenne ich das jedoch nicht.

    "In Echtzeit" von der Verarbeitungszeit her weiss ich das nicht genau; aber "in einem Rutsch" könnte es mit AviSynth möglich sein: MPEG1-Video sollte sich mit "DirectShowSource()" einbinden lassen, sogar inklusive Audio, und das verfüttert man als Pseudo-AVI dann an einen MPEG1-Encoder (z.B. TMPGEnc - die Qualität von AVI2MPG1 ist mir nicht bekannt, aber für VCDs soll TMPGEnc mit guten Presets eigentlich sehr gut geeignet gewesen sein). -- Oder vielleicht kann TMPGEnc ein MPEG1-ProgramStream auch selber per VFAPI lesen?!

  • Was bei dem einen Video funktioniert kann beim nächsten schon schief gehen:

    Wärend das erste Video aus einem Guß zu bestehen scheint, war das zweite aus mehreren Audio-Spuren zusammengesetzt worden. AVI2MPG1 hat noch das AVI mit der ersten Ton-Spur einwandfrei codiert, dann aber einen Fehler ausgegeben: Tonspur endet verfrüht. Mit der Option "-e" kann man zwar fehlende Tonspuren mit "Silence" auffüllen, aber wenn dann die nächste Tonspur beginnt streicht AVI2MPG1 die Segel und bricht die Codierung ab.

    TMPGEnc hat's dagegen ohne Fehler geschafft und das Video vollständig codiert.

    Leider hilft mir das nicht viel, denn das Zielsystem ist Linux, und TMPGEnc hierfür nicht verfügbar. Da die Videos über Medien mit verschiedenen Bitraten transportiert werden sollen wäre eine on-fly Rekomprimierung sinnvoll. So muß ich für jedes Medium in W2k einen eigenen Stream vorcodieren.

    /Helmut

Jetzt mitmachen!

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