合并旧VOB文件为MP4时遭遇FFmpeg多类错误求助
VOB合并为MP4的错误解决指南
问题背景
尝试合并4个旧VOB文件为MP4,已解决pts has no value error问题,使用命令:
.\ffmpeg.exe -fflags +genpts -f concat -i .\files.txt -c copy output.mp4
files.txt内容:
file 'VTS_01_1.VOB' file 'VTS_01_2.VOB' file 'VTS_01_3.VOB' file 'VTS_01_4.VOB'
执行后出现无效帧尺寸、DTS时间戳乱序、输入数据无效等错误,最终转换失败,完整错误输出(翻译后):
ffmpeg版本 2023-03-05-git-912ac82a3c-essentials_build-www.gyan.dev 版权所有 (c) 2000-2023 FFmpeg开发者 基于gcc 12.2.0编译(Rev10,由MSYS2项目构建) 配置参数:--enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband libavutil 58. 3.100 / 58. 3.100 libavcodec 60. 6.100 / 60. 6.100 libavformat 60. 4.100 / 60. 4.100 libavdevice 60. 2.100 / 60. 2.100 libavfilter 9. 4.100 / 9. 4.100 libswscale 7. 2.100 / 7. 2.100 libswresample 4. 11.100 / 4. 11.100 libpostproc 57. 2.100 / 57. 2.100 输入 #0, concat, 来自 '.\files.txt': 时长: N/A, 起始时间: 0.000000, 码率: N/A 流 #0:0: 数据: dvd_nav_packet 流 #0:1: 视频: mpeg2video (Main), yuv420p(tv, top first), 720x480 [采样宽高比 8:9 显示宽高比 4:3], 29.97 帧/秒, 29.97 tbr, 90k tbn 附加数据: cpb: 码率 最大/最小/平均: 7000000/0/0 缓冲区大小: 1835008 vbv_delay: N/A 流 #0:2: 音频: ac3, 48000 Hz, 立体声, fltp, 448 kb/s 文件 'output.mp4' 已存在。是否覆盖?[y/N] y [mp4 @ 00000211b44d0900] 轨道1:未设置编解码器帧大小 输出 #0, mp4, 输出到 'output.mp4': 元数据: 编码器 : Lavf60.4.100 流 #0:0: 视频: mpeg2video (Main) (mp4v / 0x7634706D), yuv420p(tv, top first), 720x480 [采样宽高比 8:9 显示宽高比 4:3], q=2-31, 29.97 帧/秒, 29.97 tbr, 90k tbn 附加数据: cpb: 码率 最大/最小/平均: 7000000/0/0 缓冲区大小: 1835008 vbv_delay: N/A 流 #0:1: 音频: ac3 (ac-3 / 0x332D6361), 48000 Hz, 立体声, fltp, 448 kb/s 流映射: 流 #0:1 -> #0:0 (复制) 流 #0:2 -> #0:1 (复制) 按 [q] 停止, [?] 获取帮助 [mpeg2video @ 00000211b44a5f00] 无效帧尺寸 0x0. 码率=5521.6kbits/s 速度= 643x 最后一条消息重复3次 [concat @ 00000211b449b500] DTS 137507370 < 137525388 顺序错误 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525388, 当前: 137507370;已修改为137525389。这可能导致输出文件时间戳不正确。 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525389, 当前: 137510250;已修改为137525390。这可能导致输出文件时间戳不正确。 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525390, 当前: 137510250;已修改为137525391。这可能导致输出文件时间戳不正确。 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525391, 当前: 137513130;已修改为137525392。这可能导致输出文件时间戳不正确。 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525392, 当前: 137516010;已修改为137525393。这可能导致输出文件时间戳不正确。 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525393, 当前: 137518890;已修改为137525394。这可能导致输出文件时间戳不正确。 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525394, 当前: 137521770;已修改为137525395。这可能导致输出文件时间戳不正确。 [mp4 @ 00000211b44d0900] 输出流0:0中DTS不单调;之前: 137525395, 当前: 137524650;已修改为137525396。这可能导致输出文件时间戳不正确。 av_interleaved_write_frame(): 处理输入时发现无效数据 [out#0/mp4 @ 00000211b44f96c0] 封装数据包时出错 [out#0/mp4 @ 00000211b44f96c0] 写入文件尾时出错:处理输入时发现无效数据 frame=45815 fps=19808 q=-1.0 大小= 1027328kB 时间=00:25:29.51 码率=5502.3kbits/s 速度= 661x video:943791kB audio:83556kB subtitle:0kB 其他流:0kB 全局头:0kB 封装开销: unknown 转换失败!
解决方法
方法1:修复源文件后再合并(推荐)
VOB作为DVD光盘文件,可能存在损坏帧或导航数据干扰,先单独修复每个文件再合并:
- 对每个VOB文件执行转码修复,生成干净的MP4片段:
# 处理第一个文件 .\ffmpeg.exe -i VTS_01_1.VOB -c:v libx264 -c:a aac -movflags +faststart fixed_01.mp4 # 处理第二个文件 .\ffmpeg.exe -i VTS_01_2.VOB -c:v libx264 -c:a aac -movflags +faststart fixed_02.mp4 # 处理第三个文件 .\ffmpeg.exe -i VTS_01_3.VOB -c:v libx264 -c:a aac -movflags +faststart fixed_03.mp4 # 处理第四个文件 .\ffmpeg.exe -i VTS_01_4.VOB -c:v libx264 -c:a aac -movflags +faststart fixed_04.mp4
- 修改
files.txt指向修复后的文件:
file 'fixed_01.mp4' file 'fixed_02.mp4' file 'fixed_03.mp4' file 'fixed_04.mp4'
- 执行合并命令:
.\ffmpeg.exe -f concat -i .\files.txt -c copy final_output.mp4
方法2:调整原命令,过滤干扰流并强制同步
如果不想重新编码,尝试忽略DVD导航流,同时添加时间戳修复参数:
.\ffmpeg.exe -fflags +genpts+igndts -f concat -safe 0 -i .\files.txt -map 0:1 -map 0:2 -c copy output.mp4
-map 0:1 -map 0:2:仅选择视频和音频流,剔除导航数据包(流#0:0)-fflags +igndts:忽略乱序的DTS时间戳,强制生成正确时序-safe 0:允许concat读取本地任意路径的文件
方法3:强制音频同步修复时间戳
若DTS乱序问题仍存在,添加-async 1参数强制音频与视频同步:
.\ffmpeg.exe -fflags +genpts -f concat -safe 0 -i .\files.txt -map 0:1 -map 0:2 -c copy -async 1 output.mp4
内容的提问来源于stack exchange,提问作者Victor Hartman
相关产品推荐
相关产品推荐

