【问题标题】:fixing (with ffmpeg) the chrominance position on a video after capturing捕获后修复(使用ffmpeg)视频上的色度位置
【发布时间】:2016-05-21 22:28:05
【问题描述】:

我正在尝试使用(旧)视频采集卡(显然是旧 VHS 播放器)将一些视频从 VHS 转换为数字视频。由于视频采集卡的输入和 VHS 的输出,我别无选择,只能使用 S-Video 电缆连接到计算机进行采集。

除了在电视上不会发生的色度和亮度之间的一点不同步之外,几乎所有东西都可以正常工作。

例如,在原始视频中,我有这样的内容:

拍摄后的视频如下所示:

如您所见,色度与亮度通道有点不同步(我会说大约 10 行错误)。

我正在使用以下命令在 Linux 系统上使用 ffmpeg 进行捕获:

$ v4lctl setnorm PAL-BG

$ v4lctl setinput S-video

$ ffmpeg -y -f alsa -ac 2 -i pulse -f video4linux2 -i /dev/video0 -c:a pcm_s16le -vcodec rawvideo -t $duration -r 25 -loglevel error -stats ~/tmp/tmp .mkv

我在 v4l 中尝试了其他输入规范,尝试了其他 VHS 播放器,尝试了从 SCART 到 S-Video 的其他转换电缆,但它没有改变任何东西,

我的问题很简单:有没有办法通过 ffmpeg 中的后处理视频过滤器来解决这个问题?

我已经查看了 ffmpeg 中可用的一长串视频过滤器,但我没有找到任何东西。

另外,请注意我不能在捕获命令(旧捕获卡、旧 cpu 等)期间应用过滤器,这就是我在 rawvideo 和原生音频中捕获的原因。捕获完成后,我将视频/音频转换为 h264/vorbis,在此步骤中,我可以应用所需的音频/视频过滤(即使它包括将色度和亮度提取到新文件,再次修复和合并)。

谢谢!

【问题讨论】:

  • 你能上传一个 1-2 秒的原始视频样本吗?
  • @Mulvya,确定我已经在这里上传了一个 5 秒的样本:aplu.fr/files/chroma-luma-raw.mkv.xz
  • 好的,U 似乎降档了 6 像素,V 降了 8 像素。见sample。来晚了,明天再贴方法。

标签: video ffmpeg capture luminance


【解决方案1】:

完成此操作的基本工作流程是首先从源视频中提取亮度和色度平面。然后从每个孤立的平面中提取一个对应的帧,将它们导入图像编辑器并找出色度平面相对于亮度平面的位移。然后根据该信息剪掉色度平面的头部。合并修改后的平面,形成校正后的复合视频。

除了 FFmpeg,您还需要像 dd 这样的工具(用于从色度平面修剪字节)。

第 1 步从原始视频流中提取平面

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 之类的工具来修剪色度流。

由于色度平面是半高,因此在上一步中找到的偏移量必须减半并四舍五入为整数。

假设 U 的偏移量为 6,V 的偏移量为 8 所以,

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

由于色度平面上的某些行被截断,最后一帧将不会被编码,因为色度分量将被截断。

【讨论】:

  • 非常感谢,这非常有效。为了避免管理大量大文件,我做了一些事情,我在捕获期间将视频拆分为 y,u,v + wav 文件(希望 CPU 能够做到这一点),然后我使用 bash 技巧... -i <(dd if=in.u bs=360 skip=4)...将色度流直接修剪为 ffmpeg。
猜你喜欢
  • 2011-05-19
  • 2013-03-02
  • 2020-05-23
  • 2023-03-07
  • 2019-11-11
  • 1970-01-01
  • 2018-03-14
  • 2017-08-10
  • 2018-04-17
相关资源
最近更新 更多