使用ffmpeg转换索尼老DV拍摄的VOB文件为mp4

一些背景故事

最近对象想用 CCD 拍照录像,家里刚好有一台快 20 年前的索尼 DV DCR-DVD653E,就是电池老化充不进去电了。

翻出来之后还感慨了一下:当年没有网购,价格不透明;有些地方也没有官方店,只有一两家卖的,人家开多少钱就多少钱。这个 DV 当年家里花了一万二,但是查了下当年的一些博客,官方售价只要五千多,后期甚至才四千多。现在真的是好太多了。

TB 上买一块电池四十多,由于停产多年也不知道还能用多久。但好在我发现有卖 AC-L200 转 USB 的线,只要三十多,这样就能用 5V3A 的充电宝就可以了,而且续航也长了很多。

请添加图片描述

万事俱备,开拍。

VOB转换MP4

拍摄完之后需要在 DV 上“结束写入”,然后才能在电脑光驱中读取。内容如下:

请添加图片描述

这里的视频文件是VOB文件后缀的,并且带有_xx_x后缀的,其他文件是 DVD 播放程序或者给播放程序使用的画面(比如VIDEO_TS.VOB就是播放程序的动画)。

VOB 文件可以直接在 Mac 或 VLC 上查看,但是如果你想做视频的话,就需要转换成 MP4 等格式。转换命令如下(这是最理想的情况,实际中可能会有一些问题,请参考末尾的更新部分):

ffmpeg -i VTS_xxxx.VOB -b:v5000k -vf yadif  out.mp4

其中:

  • -b:v是设置码率。如果是选择 SP 模式拍摄的,那么码率设置为5000k;如果是 HQ 模式,那么设置为18000k。(不同的 DV 码率可能会不同,所以建议使用ffprobe自行查看,不建议使用-c copy这种选项,因为下一个选项就不能用了)
  • -vf yadif:这个选项是用来将隔行图像转换成非隔行的。如果没有这个选项,那么转换的视频在有移动画面的时候会出现下面这样的条纹。使用 Mac 或 VLC 查看视频的时候,播放软件会自动去隔行,不会有这样的条纹出现。(如果你就要这样的画面就不要这个选项)

请添加图片描述

以前不论是网络带宽还是存储设备的带宽都不大。如果你在那个时候上过网一定记得图片加载是从头一行行加载,但是如果网络出现问题那么就只能看到那一部分的。但是如果用了隔行技术,那么久可以看到大概是什么样的,可以脑补一下(下面就是个例子)。但是如果将交错的视频转换成非交错的,也就是实际上将“一半”的画面和后面的画面重叠了。

请添加图片描述

上面那个画面去交错之后就像下面一样(这是裁切过的画面):

请添加图片描述

2024年4月18日更新
今天出去玩,给女朋友用老 DV 拍视频,回家转码的时候发现了新问题:在 DVD 播放程序中显示为多个视频,但是多个视频合成一个视频文件了。用 Mac 预览或 VLC 只显示第一段。并且如果直接转码会出现卡顿,缺失等情况,所以我就研究了半个小时左右,好在研究出来了,不然在对象面前现大眼了。

首先索尼 DV DCR-DVD653E 在每次关机之前拍摄的视频存放在一个视频文件中,哪怕是多段也在一起。

这时候使用上面的方法直接转码也可以转,但是转出来的视频,在每一段之间可能会有卡顿或者卡住几秒,丢失画面。

我一开始猜测是多个视频流导致的,但使用ffprobe查看会发现不是分成多个流,只有一个视频流:

请添加图片描述

虽然一开始的猜测错误,但是发现了疑似问题出现的原因:第一个流是dvd_nav_packet,是给 DVD 播放程序使用的,所以一般的视频播放器无法正确播放。

那么抓取除第一个流之外的第二、三条流不就行了嘛,一个是视频流,一个是音频流。然后我就参考ffmpeg map 官方文档中映射流的方法,从源文件中映射音频和视频两个流,发现生成文件只能播放音频,但是查看流的话两个都有。或者只有视频没有声音。

经过一番尝试,发现最好的解决方案是将视频流和音频流弄成两个文件,然后再转码合成一个视频文件。

视频流可以直接转成mp4,音频需要转成ac3,命令如下:

ffmpeg -i VTS_03_1.VOB -map 0:1 -c copy out.mp4
ffmpeg -i VTS_03_1.VOB -map 0:2 -c copy out.ac3

其中:

  • -map 0:1 表示抓取第一个输入文件的第二个流,也就是视频文件,-map 0:2同理。
  • -c copy是直接拷贝流,而不经过转码。这样不光速度快,而且可以减轻整个流程中视频质量的损耗(最后一步要转码)。

然后将两个文件转码合成为一个文件:

ffmpeg -i out.mp4 -i out.ac3 -map 0:0 -map 1:0 -b:v 6500k -vf yadif VTS_03_1.mp4

其中:

  • -map 0:0 表示抓取第一个输入文件的第一个流,-map 1:0第二个文件第一个流。
  • -b:v 6500k将码率设置为6500k。不转码而使用拷贝,可能会出现一些问题。
  • -vf yadif来去交错。

这时候生成的视频文件,在视频、音频、播放上都没有问题。

为了批量生成多个视频,写个脚本。

先自己在视频存放目录下新建一个out目录,等会生成的视频文件存放在这里即可:

#!/bin/bash
#
for i in *.*; do
ffmpeg -i $i -map 0:1 -c copy out.mp4
ffmpeg -i $i -map 0:2 -c copy out.ac3
ffmpeg -i out.mp4 -i out.ac3 -map 0:0 -map 1:0 -b:v 6500k -vf yadif out/$i.mp4
rm out.mp4 out.ac3
done

rename 's/.VOB//' out/*.mp4

最后一条是为了将生成视频文件的文件名中的.VOB后缀删除掉。

希望能帮到有需要的人~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值