我真的非常感激能得到一些帮助...
我从网上下载了一个 .ts 文件,当我在 Quicktime 中播放时,视频逐渐落后于音频。几分钟后,这种情况变得明显,大约十分钟后,视频落后了几秒钟。它在 VLC 中播放得很好,但我希望能够在我的 AppleTV 上播放,它的功能与 Quicktime 相同。
我已经尝试了所有能想到的方法来解决...
- 使用 VLC 进行转换,确实有效,但每隔几秒钟音频就会跳过。
- 使用 Handbrake 进行转换,它再次起作用,但每隔几秒钟音频就会像使用 VLC 一样跳过。
- 使用 -async 通过 FFMpeg 进行转换,但我再次得到了相同的结果,音频跳过。
- 将音频和视频提取到两个单独的文件中,并用 FFMpeg 重新创建一个新文件,这没有什么区别,与播放原始文件相同。
- 尝试使用“aresample=async=1000”通过 FFMpeg 来“拉伸”音频,虽然同步,但音频却失真了。
我认为 -async 选项导致音频跳过的原因在于音频被修剪以与视频同步。我想要做的是调整视频以适应音频,同时保持音频不变。
我尝试使用 -vsync 执行此操作,但结果与原始文件相同。FFMpeg 用户指南说明如下:
使用 -map 您可以选择从哪个流中获取时间戳。您可以保持视频或音频不变,并将其余流同步到未改变的流。
但我无法弄清楚语法。这就是我正在尝试的,但输出与原始输出相同......
ffmpeg -vsync 1 -I 测试.ts -map 0:1 -map 0:0 -y 测试.mp4
我已尝试使用 vsync 0、1 和 2 进行上述操作,但结果仍然相同。
有人能帮我找到将视频流与音频流同步且音频保持不变的语法吗?或者建议我可以使用其他方法吗?
任何帮助我都会非常非常感激。谢谢。
这是 test.ts 的 ffprobe...
ffprobe version 4.4 Copyright (c) 2007-2021 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.29)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mpegts, from 'TEst.ts':
Duration: 02:13:05.51, start: 1.406000, bitrate: 4579 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 1920x1080, 23.98 tbr, 90k tbn, 1411200000.00 tbc
Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 195 kb/s
答案1
看看“atempo”过滤器。对我来说,解释它的最佳方式是与我的项目相关。
我将 23.976fps 的视频重铸为 24fps。我没有改变帧,只是将帧速率从 24/1.001fps 强制为 24fps,从而将视频速度提高了 1.001 倍。在相同的转码中,我通过“atempo=1.001”将音频速度提高了 1.001 倍。结果运行速度略快 - 播放时间实际上与在影院中看到的时间相同 - 并且视频和音频完美同步,即使是 2 小时的电影,
就我而言,
ffmpeg -i SOURCEVIDEO -filter_complex "[0:v]settb=expr=1/24,setpts=expr=N[v];[0:a]atempo=1.001[a]" -map "[v]" -map "[a]" -codec:v h264 -codec:a aac -r 24 TARGETVIDEO
就你的情况而言,你不需要转码视频,只需要转码音频,所以
ffmpeg -i test.ts -filter_complex "[0:a]atempo=?????[a]" -map 0:v -map "[a]" -codec:v copy -codec:a aac TARGET
我假设你知道这一切意味着什么。如果你不知道,或者你有任何疑问,请提出,我会进一步帮助你。
您需要根据自己的情况确定具体?????
值。如果音频运行速度太慢,请选择?????
大于 1.0 的值。如果音频运行速度太快,请选择?????
小于 1.0 的值。
转到视频末尾,找到最后一个明显不连贯的音频。尽你所能,确定音频时间的不连贯程度(以秒为单位),加上此时的总播放时间。 的值?????
将是一个提前或延后因子,
(总计+/-关闭)/总计
需要使它们同步。