Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 捕获后固定(使用ffmpeg)视频上的色度位置_Video_Ffmpeg_Capture_Luminance - Fatal编程技术网

Video 捕获后固定(使用ffmpeg)视频上的色度位置

Video 捕获后固定(使用ffmpeg)视频上的色度位置,video,ffmpeg,capture,luminance,Video,Ffmpeg,Capture,Luminance,我正在尝试使用(旧的)视频采集卡(显然是旧的VHS播放器)将一些视频从VHS转换为数字视频。由于视频采集卡的输入和VHS的输出,我别无选择,只能用S-video电缆将视频采集到计算机上 除了电视上没有出现的色度和亮度之间的一点不同步外,几乎所有的东西都能正常工作 例如,在原始视频中,我有如下内容: 捕获视频后,如下所示: 正如你们可能看到的,色度和亮度通道有点不同步(我会说大约10行错误) 我使用以下命令在Linux系统上使用ffmpeg进行捕获: $v4lctl setnorm PAL-B

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

除了电视上没有出现的色度和亮度之间的一点不同步外,几乎所有的东西都能正常工作

例如,在原始视频中,我有如下内容:

捕获视频后,如下所示:

正如你们可能看到的,色度和亮度通道有点不同步(我会说大约10行错误)

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

$v4lctl setnorm PAL-BG

$v4lctl setinput S-video

$ffmpeg-y-f alsa-ac 2-i脉冲-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等等),这就是我在原始视频和本机音频中捕获的原因。捕获完成后,我将视频/音频转换为h264/vorbis,在这一步,我可以应用所需的音频/视频过滤(即使它包括提取新文件的色度和亮度,再次修复和合并)


谢谢

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

除了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

因为一些线条从色度平面上被截断,最后一帧将不会被编码,因为色度分量将被截断。

你能上传一个显示这种行为的1-2秒原始视频样本吗?@Mulvya,我确实在这里上传了一个5秒的样本:好的,U显示为降档6像素,V为8像素。看见现在已经很晚了,所以我明天会发布这个方法。非常感谢,这个方法非常有效。为了避免管理大量大文件,我做了一些事情,在捕获过程中将视频分割为y、u、v+wav文件(希望CPU能够做到这一点),然后使用bash技巧
-我