Artefakte (grünliches Bild, Klötzchenbildung) nach Schneiden

Started by olli14, May 13, 2020, 08:33:26 PM

Previous topic - Next topic

olli14

Ich nutze auf meinem Linux Mint 19.2 PC Avidemux 2.7.4 zum Schneiden aufgenommener DVB-S2 Sendungen (z.B. von Sat.1 HD, Kabel eins HD usw.), also Sendungen mit h.264 Codec und 1080 Auflösung. Das Problem: an den Stellen, wo ich die Werbung herausgeschnitten habe, hat das Video für mindestens 20 Sekunden lang ein grünliches Bild mit Klötzchenbildung (Artefakte) und der eigentliche Film ist nur noch andeutungsweise zu erkennen. Nach 20 - 30 Sekunden "fängt" sich das Problem wieder und der Film läuft normal weiter. Interessant ist: Wenn ich den Film mit diesen Artefakten für vielleicht ein paar Sekunden laufen lasse, dann 10 Sekunden vorwärts springe und dann gleich wieder 10 Sekunden zurückspringe, läuft der Film normal weiter an der Stelle, wo er zuvor noch diese Artefakte angezeigt hat.
Wenn ich diesen Film auf meinem Android Handy abspiele, werden KEINE Artefakte angezeigt. Spiele ich den Film unter Windows ab, ebenfalls keine Artefakte. Die Artefakte werden angezeigt auf meinem PC mit Linux Mint 19.2 und auch auf meinem LCD TV mit Android TV Betriebssystem. Hier Artefakte sowohl unter der Kodi App wie auch unter der VLC App.

Beim Schneiden bekomme ich übrigens diese Meldung angezeigt: Dieses Video verwendet Nicht-IDR-Frames für den Direktzugriff. Der Zähler für die Anzeigereihenfolge der Frames (POC) wird an solchen Keyframes nicht zurückgesetzt. Die gewählten Schnittpunkte führen zum unerwartet zurückgehenden Zähler und möglicherweise zur stockenden Wiedergabe des im Kopiermodus gespeicherten editierten Videos an dieser Stelle.

eumagga0x2a

QuoteBeim Schneiden bekomme ich übrigens diese Meldung angezeigt [...]

Eben. Es geschieht genau das, was in der Warnung drin steht, weswegen man sie auch nicht ignorieren sollte.

Was dort nicht steht: das Problem ist die Art und Weise wie libavcodec (FFmpeg) Diskontinuitäten bei POC handhabt (oder, genauer gesagt, gar nicht handhabt). Da aber sehr viele Player, mit VLC angefangen, auf allen Plattformen (wohl auch auf Smart-TVs) auf FFmpeg aufbauen, kann man es nicht einfach ignorieren. Andere Implementierung erkennen wohl, dass die Bilderreihenfolge am Schnittpunkt ungültig ist und versuchen nicht, die darauffolgenden Frames in den Kontext der vorherigen Zählerwerte zu zwingen.

Wie es aus dem Text der Warnung hoffentlich klar genug hervorgeht, das grundlegende Problem ist der Struktur der H.264-Videostreams geschuldet (den Encoder-Einstellungen, mit denen das Video kodiert wurde).

Übrigens, unter Linux ist es trivial das aktuelle Avidemux aus git master selber zu kompilieren. 2.7.4 ist mittlerweile arg veraltet.

olli14

Danke für die schnelle Antwort.
Ich habe unter Windows das Programm Videoredo TV Suite. Dieses Programm schneidet auch H264 kodierte Filme. Wenn ich einen Film mit Videoredo TV Suite schneide, entstehen beim Abspielen des geschnittenen Films unter Linux Mint und auf meinem Android LCD TV KEINE Artefakte. Nur eben beim Schneiden mit Avidemux.

Ist denn denkbar, das eine neuere Avidemux Version als die veraltete 2.7.4 diese Artefakte nicht mehr hat?

Ich könnte ja auch so vorgehen: sobald diese Artefakte erscheinen, 10 Sekunden vorwärts springen und dann gleich wieder 10 Sekunden zurückspringen und schon sind die Artefakte weg. Aber dieses Prozedere ist beim Anschauen eines Films unschön.

eumagga0x2a

Quote from: olli14 on May 14, 2020, 10:24:00 AM
Ich habe unter Windows das Programm Videoredo TV Suite. Dieses Programm schneidet auch H264 kodierte Filme. Wenn ich einen Film mit Videoredo TV Suite schneide, entstehen beim Abspielen des geschnittenen Films unter Linux Mint und auf meinem Android LCD TV KEINE Artefakte. Nur eben beim Schneiden mit Avidemux.

Die ganz groben Probleme vermeidet man, indem man die neueste Version verwendet, nur an Keyframes schneidet, die Warnung beachtet und in diesem Fall die Schnittpunkte anders setzt. Kleine Artefakte (einige wenige Frames mit Klötzchen direkt vor dem Schnittpunkt) sind der Verwendung von Open GOP geschuldet und sind nicht behebbar ohne Neukodierung des Streams. In solchen Streams sind Keyframes eben keine IDR-Frames, sprich, nachfolgende Frames dürfen Bilder aus den nun amputierten Teilen des Streams als Referenzbilder verwenden, und das tun sie auch. Besonders bei Streams wie zum Beispiel bei britischen Sendern üblich, findet man locker 7-9 solche "early B-frames" vor, die bis auf eins oder zwei nicht weggelassen werden dürfen, weil spätere Bilder sie wiederum als Referenzen benötigen.

Um komplett ohne beschädigte Frames in Streams ohne IDR zu schneiden, muss das Video neu kodiert werden. Theoretisch könnte man in manchen Fällen tatsächlich nur Slice Header mit poc_lsb, frame_num und Referenzlisten angepasst an den vorhergehenden Stream neu kodieren und unveränderten Bilddaten voranstellen, aber das wäre eine immens komplizierte Aufgabe, die Artefakte bei den "early B-frames" nicht beheben kann (die Informationen sind nun mal weggeschnitten).

QuoteIst denn denkbar, das eine neuere Avidemux Version als die veraltete 2.7.4 diese Artefakte nicht mehr hat?

Etliche Bugfixes hinsichtlich die Berechnung von POC, der Vermeidung von Zeitstempel-Kollisionen an Schnittpunkten und die begrenzte Fähigkeit, mit Streams umzugehen, in denen Dekoder-Parameter sich ändern, sind im aktuellen Code drin, neben vielen anderen Verbesserungen. Aber Naturgesetze und die Regeln der Mathematik kann auch die neue Version nicht außer Kraft setzen.

QuoteIch könnte ja auch so vorgehen: sobald diese Artefakte erscheinen, 10 Sekunden vorwärts springen und dann gleich wieder 10 Sekunden zurückspringen und schon sind die Artefakte weg. Aber dieses Prozedere ist beim Anschauen eines Films unschön.

Sowas tut Avidemux intern automatisch, wenn das Programm solche Streams abspielen oder neu kodieren muss  :)

eumagga0x2a

Was VideoReDo TV Suite angeht, wäre es bitte möglich, eine wenige Minuten lange DVB-S2 Aufnahme und dazu diese Datei mit einem kurzen (sagen wir mal, 5 Keyframes langen) Abschnitt irgendwo in der Mitte gelöscht durch dieses Programm als Samples zur Verfügung zu stellen?

WeTransfer (keine Email-Adresse nötig, selbst wenn die Webseite dies auf den ersten Blick suggeriert!), Mega, Dropbox oder Google Drive haben sich dafür bewährt.

olli14

Ich habe vorhin mal 40 Sekunden von Pro7 HD aufgenommen. Dann habe ich mit Avidemux 3 Schnitte in diesem kurzen Video gemacht. Alle Schnitte sind sauber. Keine Artefakte. Warum klappt das Schneiden in größeren Dateien nicht?

Jemand eine Idee?

eumagga0x2a

Gab es denn beim Schnitt eine (ignorierte) Warnung wegen zurückgehender POC? Wenn es keine gab, dann dürften sich die Probleme je nach Beschaffenheit des Streams sehr in Grenzen halten.

40 Sekunden sind außerdem ein wenig knapp, zwei Minuten wären eher geeignet.

Ansonsten gilt meine Bitte von vorhin.

olli14

In anhängender Textdatei ist der Link zu den beiden Dateien.

olli14

Hi eumagga0x2a
du schreibst oben :"...Die ganz groben Probleme vermeidet man, indem man die neueste Version verwendet, nur an Keyframes schneidet, die Warnung beachtet und in diesem Fall die Schnittpunkte anders setzt."
Meine HD Videos haben I Frames, B Frames und P Frames. Ich springe mit den Cursor aufwärts und Cursor abwärts Tasten von I Frame zu I Frame und versuche dort, meine Schnitte zu setzen. Dauernd kommt aber diese Warnung wegen zurückgehender POC. Muß ich jetzt durch ständiges Probieren so lange den Anfangsschnittpunkt und Endschnittpunkt versetzen, bis irgendwann die POC Warnung nicht kommt? Oder gibt es eine Methode, woran kann ich erkennen kann, wo ich schneiden kann und wo nicht?

Danke für deine Unterstützung.

eumagga0x2a

Danke für die Samples. Es ist nicht ganz leicht zu verstehen, wo genau der Anfang des Schnittes mit VideoReDo lag, das letzte Keyframe vorm Schnitt ist jedenfalls das Frame 1986, der Schnitt begann also wahrscheinlich am Keyframe 2042 des Originals (in Avidemux: 00:00:41.880), 3 Keyframes lang, bis zum Keyframe 2248 (in Avidemux: 00:00:46.000). Avidemux warnt vor diesem Schnitt:

[checkSegmentStartsOnIntra] 18:50:28-925  Saved video won't be smoothly playable in FFmpeg-based players (POC going back by 50)

Das Schnittergebnis von VRD ist nicht anders als beim Avidemux, wenn man die Warnung ignoriert, denn Avidemux kann das Video mit "VR" im Namen an der Schnittstelle nicht Bild für Bild dekodieren und muss schließlich zum nächsten Keyframe springen. Auch mpv stolpert ebenfalls am Schnittpunkt und meldet einen invaliden Zeitstempel.

Setzt man das Ende ein Keyframe weiter, ist alles in Ordnung.

VideoReDo scheint nichts von Bedeutung am H.264-Datenstrom zu ändern (es korrigiert nur ein überflüssiges Nullbyte-Präfix vor SEI).

Quote from: olli14 on May 17, 2020, 05:19:18 PM
Ich springe mit den Cursor aufwärts und Cursor abwärts Tasten von I Frame zu I Frame und versuche dort, meine Schnitte zu setzen. Dauernd kommt aber diese Warnung wegen zurückgehender POC. Muß ich jetzt durch ständiges Probieren so lange den Anfangsschnittpunkt und Endschnittpunkt versetzen, bis irgendwann die POC Warnung nicht kommt?

Ja, exakt so.

QuoteOder gibt es eine Methode, woran kann ich erkennen kann, wo ich schneiden kann und wo nicht?

Leider nicht bevor man die "Del"-Taste gedrückt hat, denn die möglichen Schnittpunkte sind für jedes Keyframe anders verteilt. Früher erkannte man das Problem erst nachdem die Ausgabedatei gespeichert war, beim Abspielen. Der aktuelle Zustand ist schon mal ein Fortschritt.

olli14

Der Schnitt lag bei ca. 40 Sekunden. Korrekt.

Der Unterschied ist aber: wenn ich das geschnittene Video mit Videoredo abspiele, sehe ich zwar ein kurzes Ruckeln, aber das Video läuft dann sofort normal weiter.
Schneide ich jedoch mit Avidemux und ignoriere die Warnmeldung mit zurückgehender POC, dann läuft das Video zwar auch weiter, aber das ganze Video ist dann für 15 - 20 Sekunden total grün und im Hintergrund ist schehmenhaft der Filminhalt zu erkennen. Dann nach 15 - 20 Sekunden läuft der Film normal weiter.

Ich bin ja froh, daß es auch unter Linux ein SChneidprogramm gibt, daß h264 schneiden kann und das auch noch kostenlos ist. Aber einen Schnitt setzen und dann testen, ob eine Warnmeldung kommt oder nicht, ist mühsam.  Ich setze einen Anfangsschnittpunkt und suche dann per try and error einen Endschnittpunkt, wo keine Wanrmeldung wegen zurückgehender POC kommt. Finde ich nach einigen Versuchen keine passenden Endschnittpunkt, versetze ich den Anfangsschnittpunkt und probiere dann wieder!

Noch eine Frage: Im Netz habe ich eine "Anleitung" gefunden, in der steht sinngemäß:
Für das Werbung Ende suche ich einen I-Frame und markiere den I-Frame mit dem B-Button
Um den Werbung Anfang Schnittpunkt zu setzen, mit den horizontalen Cursortasten den letzen P-Frame oder I-Frame im Filmblock suchen, dann genau einen Frame weiter und den A-Button drücken. Kann man so einen Anfangsschnittpunkt setzen?

eumagga0x2a

Quote from: olli14 on May 18, 2020, 06:50:57 AM
wenn ich das geschnittene Video mit Videoredo abspiele,

Abspielen mit VideoReDo? Oder das mit VideoReDo geschnittene Video in VLC & Co. abspielen? Der Unterschied ist schon wichtig.

Quotesehe ich zwar ein kurzes Ruckeln, aber das Video läuft dann sofort normal weiter.
Schneide ich jedoch mit Avidemux und ignoriere die Warnmeldung mit zurückgehender POC, dann läuft das Video zwar auch weiter, aber das ganze Video ist dann für 15 - 20 Sekunden total grün und im Hintergrund ist schehmenhaft der Filminhalt zu erkennen. Dann nach 15 - 20 Sekunden läuft der Film normal weiter.

Wurde schon auf den neuesten Nightly aktualisiert? Dieses Verhalten, zumal in aktuellen FFmpeg-basierten Playern, ist nur möglich, wenn der Endpunkt des Schnitts nicht auf einem Keyframe liegt. Die POC-Geschichte hat damit nichts zu tun. Wenn POC nach dem Schnitt < POC davor ist, dekodiert FFmpeg sehr wohl das Keyframe, zeigt es und die darauffolgenden Bilder aber nicht an solange POC nicht über den Wert vor dem Anfang des Schnitts gestiegen ist. Das Ergebnis ist ein oft sekundenlanger "Freeze", aber keine grünen Bilder.

Bei dem Sample kommt noch das Problem mit dem Interlacing an (es ist 1080i), die letzten Avidemux-Builds können viel besser damit umgehen.

QuoteIch setze einen Anfangsschnittpunkt und suche dann per try and error einen Endschnittpunkt, wo keine Wanrmeldung wegen zurückgehender POC kommt. Finde ich nach einigen Versuchen keine passenden Endschnittpunkt, versetze ich den Anfangsschnittpunkt und probiere dann wieder!

Richtig. Es ist schon ein Luxus, dass man die Tauglichkeit der Schnittpunkte sofort nach dem Druck auf "Del" angezeigt bekommt.

QuoteIm Netz habe ich eine "Anleitung" gefunden, in der steht sinngemäß:
Für das Werbung Ende suche ich einen I-Frame und markiere den I-Frame mit dem B-Button
Um den Werbung Anfang Schnittpunkt zu setzen, mit den horizontalen Cursortasten den letzen P-Frame oder I-Frame im Filmblock suchen, dann genau einen Frame weiter und den A-Button drücken. Kann man so einen Anfangsschnittpunkt setzen?

Man kann es, allerdings hat man auf die letztzen Bilder vor dem Schnitt keinen wirklichen Einfluss, Avidemux (ich spreche immer ausschließlich vom neuesten Stand) verwirft die Frames, die zu nah an die frühesten von den "early B-frames" nach dem Schnitt kommen.

olli14

Wow, anwortest ja schnell.
Ich habe mich falsch ausgedrückt. Ich spiele nicht mit Videoredo ab. Ich spiele ab mit einem Mediaplayer von Linux.

Ich verstehe dich so, daß dieses Verhalten mit dem grünlichen Bild nur möglich ist, wenn der Endpunkt des Schnitts nicht auf einem Keyframe liegt? Und die POC Warnung hat damit auch nichts zu tun?

Ein Keyframe ist nicht automatisch ein I-Frame, oder?

Auf meinem Laptop habe ich das neueste Avidemux drauf. Auf mein htpc bekomme ich das neueste Avidemux nicht kompiliert wohl wegen fehlender Abhängigkeiten. Müßte auf meinem htpc sicherlich Updates machen, um dort dann auch Avidemux kompiliert zu bekommen in der neuesten Version. Aber mit Updates bin ich vorsichtig bei meinem htpc. "Never change a running system" heißt es so schön.
Auf meinem Laptop mit neuestem Avidemux habe ich auch schon Schnittversuche gemacht und auch dort hatte ich danach das Propblem mit dem grünen Bild über 15 - 20 Sekunden hinweg.

eumagga0x2a

Ein Keyframe ist immer ein I-Frame, aber bei DVB-T/C/S in D sehr selten ein IDR-Frame.

Das neueste Avidemux – selbst aus dem Quellcode von git master kompiliert?

Ich bräuchte bitte genaue Anleitung (genaue Positionen der Marker), wie ich das Problem reproduzieren kann. Wenn es mit dem bereits bereitgestellten Sample nicht möglich ist, dann auch ein neues Sample.

Wenn ich einfach den Schitt von VideoReDo mit dem vorliegenden Sample mit Avidemux nachmache und die Warnung ignoriere, habe ich zwar einen sehr kurzen "Freeze", aber keine sonstigen Probleme, im Gegensatz zum Ergebnis von VideoReDo selbst.

olli14

Ich habe vorhin einen Film auf meinem Android Handy laufen lassen, den ich an 3 Stellen mit avidemux geschnitten habe. An allen 3 Schnittstellen keine grünen Bilder. Ebenso habe ich diesen Film auf einer meiner TV Boxen (Coreelec betriebssystem) laufen lassen. Auch keine grünen Bilder. Probleme nur auf meinem Android TV und auf meinem Linux mint PC.
Also schneidet avidemux wohl korrekt. Muss ein Betriebssystem Problem sein.