2016-05-21 16 views
0

Ich versuche, einige Videos von VHS zu digitalisieren mit einer (alten) Video-Capture-Karte (und natürlich einem alten VHS-Player). Aufgrund der Eingabe von meiner Video-Capture-Karte und der Ausgabe von der VHS, habe ich keine andere Wahl, als mit einem S-Video-Kabel zu einem Computer zu erfassen.Fixieren (mit ffmpeg) die Chrominanz-Position auf einem Video nach der Aufnahme

Fast alles funktioniert außer ein wenig Fehlsynchronisation zwischen Chroma und Luma, die nicht im Fernsehen passieren.

Zum Beispiel in dem Original-Video, ich habe so etwas wie die: good position of color

Nach der Videoaufnahme wie folgt aussieht: bad position of color

Wie Sie sehen können, gibt es ein wenig Desynchronisation der Chroma mit dem Luma-Kanal (ich werde ungefähr 10 Linienfehler sagen).

Ich bin mit ffmpeg auf einem Linux-System mit den folgenden Befehlen erfassen:

$ v4lctl setnorm PAL-BG

$ v4lctl setinput S-Video

$ ffmpeg -y - f alsa -ac 2 -i Impuls -f video4linux2 -i/dev/video0 -c: a pcm_s16le -vcodec rawvideo reiner -t $ Dauer -r 25 -logLevel Fehler -stats ~/tmp/tmp.mkv

Ich versuchte andere Eingabe Norm in v4l, versuchte einen anderen VHS-Player, versuchte ein anderes Konvertierungskabel von SCART zu S-Video, aber es änderte nichts,

Meine Frage ist einfach: Gibt es eine Möglichkeit, das zu beheben mit einem nachbearbeitenden Videofilter in ffmpeg?

Ich schaute schon auf die lange Liste von Video-Filter in ffmpeg, aber ich habe nichts gefunden.

Auch, bitte beachten Sie, dass ich nicht Filter während der Capture-Befehle anwenden kann (alte Capture-Karten, alte CPU, ..), deshalb nehme ich in RawVideo und native Audio. Wenn die Aufnahme fertig ist, wandle ich das Video/Audio in h264/vorbis, in diesem Schritt kann ich so viel wie Audio/Video-Filterung anwenden (auch wenn es das Extrahieren von Chroma & Luma in neue Dateien, Fixieren und Zusammenführen) beinhaltet.

Danke!

+0

Können Sie ein 1-2 Sekunden langes Beispiel des Rawvideos hochladen, das dieses Verhalten zeigt? – Mulvya

+0

@Mulvya, sicher, ich habe ein 5sek Sample hier hochgeladen: https://www.aplu.fr/files/chroma-luma-raw.mkv.xz – APLU

+0

Ok, das U scheint 6 Pixel und die V 8 heruntergeschaltet werden Pixel. Siehe [Beispiel] (http://sendvid.com/5f3x7lo3). Es ist spät hier, also werde ich die Methode morgen veröffentlichen. – Mulvya

Antwort

1

Der grundlegende Workflow, um dies zu erreichen, ist zunächst, die Luma und Chroma Ebenen aus dem Quellvideo zu extrahieren. Ziehen Sie dann einen einzelnen entsprechenden Rahmen aus jeder der isolierten Ebenen heraus, importieren Sie sie in einen Bildeditor und ermitteln Sie die Verschiebung der Chroma-Ebenen relativ zur Luma-Ebene. Dann hänge den Kopf der Chroma-Ebenen basierend auf dieser Information ab. Fügen Sie die geänderten Ebenen zusammen, um das korrigierte Composite Video zu erstellen.

Neben FFmpeg benötigen Sie ein Tool wie dd (zum Trimmen von Bytes aus Chroma-Ebenen).

Schritt 1 Extract Flugzeuge aus rawvideo reinem Strom

ffmpeg -i in.mkv -filter_complex "[0:v]extractplanes=y+u+v[y][u][v]" \ 
     -map "[y]" in.y -map "[u]" in.u -map "[v]" in.v 

Schritt 2 Extract Rahmen zur Prüfung

ffmpeg -f rawvideo -video_size 720x576 -framerate 25 -pix_fmt gray -i in.y -vframes 1 y.png 


ffmpeg -f rawvideo -video_size 360x288 -framerate 25 -pix_fmt gray -i in.u -vframes 1 u.png 


ffmpeg -f rawvideo -video_size 360x288 -framerate 25 -pix_fmt gray -i in.v -vframes 1 v.png 

Das aufgenommene Video ist YUV 4: 2: 0, so dass die Chrominanzebenen haben die Hälfte der Größe.

Schritt 3 Unterrahmen in einer Schicht-basierten Bildeditor

stapeln die Luma Bild an der Unterseite und den beiden Chrominanz-Bilder auf. Die Chroma-Bilder müssen skaliert werden, um die Größe zu verdoppeln. Wählen Sie die Versatzwerte, die zum Ausrichten der Chroma-Ebenen mit der Luma erforderlich sind. Die Werte sind möglicherweise für die zwei Chrominanzbilder nicht identisch.

Schritt 4 Verwenden Sie ein Werkzeug wie dd, um die Chrominanzströme zu trimmen.

Da Chroma-Ebenen halbhoch sind, müssen die im vorherigen Schritt gefundenen Offsets halbiert und auf eine ganze Zahl gerundet werden.

sagen Lassen Sie die Offsets 6 für U und 8 für V So

waren
dd if=in.u of=in+6.u bs=360 skip=3 

dd if=in.v of=in+8.v bs=360 skip=4 

Dieser Schritt nimmt die Chroma immer in Bezug auf die Luma verzögert wird, die eine sichere Annahme für VCR erfasst werden sollte. Für akademisches Interesse würde der umgekehrte Fall die Verwendung von dd benötigen, um die erforderliche Anzahl von Linien aus einem Strom zu extrahieren, und dann ein Werkzeug wie cat, um es an den Kopf dieses Stroms anzuhängen.

Schritt 5 Merge Ebene

ffmpeg -f rawvideo -framerate 25 -pix_fmt gray -video_size 720x576 -i in.y \ 
     -f rawvideo -framerate 25 -pix_fmt gray -video_size 360x288 -i in+6.u \ 
     -f rawvideo -framerate 25 -pix_fmt gray -video_size 360x288 -i in+8.v \ 
     -i in.mkv 
     -filter_complex "[0][1][2]mergeplanes=0x001020:yuv420p[v]" \ 
     -map "[v]" -map 3:a -c:v rawvideo -c:a copy corrected.mkv 

Da einige Linien wurden aus den Chrominanzebenen abgehackt, wird nicht der allerletzte Rahmen codiert werden, da die Chrominanz-Komponenten werden abgeschnitten.

+0

Vielen Dank, das hat perfekt funktioniert. Einige Sachen, die ich gemacht habe, um zu vermeiden, eine große Datei zu verwalten, teile ich das Video in y, u, v + wav Dateien während der Aufnahme (hoffentlich ist die CPU dazu in der Lage) und dann benutze ich bash tricks '. .. -i <(dd if = in.u bs = 360 Überspringen = 4) ... 'um den Chromastream direkt in ffmpeg zu schneiden. – APLU