2016-05-21 33 views
0

我試圖用(舊)視頻捕捉卡(顯然是舊的VHS播放器)將視頻從VHS轉換爲數字。由於我的視頻採集卡的輸入和VHS的輸出,我沒有別的選擇,只能通過S-Video線纜連接到電腦。固定(與ffmpeg)捕獲後的視頻上的色度位置

幾乎所有的工作,除了在電視上沒有發生的色度和亮度之間的一點不同步。

例如,在原始視頻,我有這樣的事情: good position of color

捕獲視頻後看起來是這樣的: bad position of color

正如你可以看到,還有的有點不同步色度與亮度通道(我會說大約10行錯誤)。

我捕獲了Linux系統上的ffmpeg用下面的命令:

$ v4lctl setnorm PAL-BG

$ v4lctl setInput設置S-視頻

$的ffmpeg -y - ˚FALSA -ac 2 -i脈衝-f video4linux2 -i的/ dev/video0的-c:一個pcm_s16le -vcodec rawvideo -t $持續時間-r 25 -loglevel錯誤-stats〜/ TMP/tmp.mkv

我在v4l嘗試了其他輸入規範,嘗試了其他VHS播放器,嘗試了從SCART到S-Video的其他轉換電纜,但它沒有改變任何東西,

我的問題很簡單:是否有解決此問題的方法在ffmpeg中有後期處理視頻過濾器?

我已經看過ffmpeg中可用的視頻過濾器的長列表,但是我沒有找到任何東西。

此外,請注意我不能在捕獲命令(舊捕獲卡,舊CPU,..),過濾器應用過濾器,這就是爲什麼我捕獲rawvideo和本地音頻。捕獲完成後,我將視頻/音頻轉換爲h264/vorbis,在這一步我可以應用盡可能多的音頻/視頻過濾(即使它包括提取新文件的色度&亮度,再次修復和合並)。

謝謝!

+0

你可以上傳1-2秒的原始視頻樣本顯示此行爲? – Mulvya

+0

@Mulvya,肯定我已經在這裏上傳了一個5秒的樣本:https://www.aplu.fr/files/chroma-luma-raw.mkv.xz – APLU

+0

好吧,U似乎是降檔6像素和V 8像素。見[示例](http://sendvid.com/5f3x7lo3)。這裏遲到了,所以我會在明天發佈這個方法。 – Mulvya

回答

1

完成此任務的基本工作流程首先是從源視頻中提取亮度和色度平面。然後從每個孤立的平面中提取單個相應的幀,將它們導入到圖像編輯器中,並找出色度平面相對於亮度平面的位移。然後根據該信息切掉色度平面的頭部。合併修改的平面以形成更正後的複合視頻。

除了FFmpeg,你還需要一個像dd這樣的工具(用於修剪色度平面的字節)。

步驟1從rawvideo流中提取的平面

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 

步驟2進行檢查提取幀

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 

捕獲的視頻是YUV 4:2:0,所以色度平面有尺寸的一半。

步驟3檢查在基於層的圖像編輯器

堆棧底部的亮度圖像,並且在頂部的兩個色度圖像幀。色度圖像必須縮放至兩倍大小。使用混合模式或不透明度,計算將色度平面與亮度對齊所需的偏移量。這兩個色度圖像的值可能不相同。

第4步使用像dd這樣的工具來修剪色度流。

由於色度平面是半高,所以在上一步中找到的偏移必須減半並舍入爲整數。

假設的偏移量爲6 U和8 V SO,

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

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

此步驟假定色度相對於亮度,這應該是VCR捕獲一個安全的假設總是推遲。對於學術興趣而言,相反的情況下需要使用dd從流中提取所需的行數,然後使用諸如cat之類的工具將其附加到該流的頭部。

步驟5合併平面

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 

由於一些系購自色度平面切碎斷時,最後的幀將不被編碼,因爲色度分量將被截斷。

+0

非常感謝,這工作完美。 一些我爲避免管理大量文件而做的事情,我在捕獲過程中將視頻分成y,u,v + wav文件(希望CPU能夠做到這一點),然後我使用bash技巧。 .. -i <(dd if = in.u bs = 360 skip = 4)...'將色度流直接修剪爲ffmpeg。 – APLU