TS 文件中的音频逐渐不同步

TS 文件中的音频逐渐不同步

我真的非常感激能得到一些帮助...

我从网上下载了一个 .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 的值。

转到视频末尾,找到最后一个明显不连贯的音频。尽你所能,确定音频时间的不连贯程度(以秒为单位),加上此时的总播放时间。 的值?????将是一个提前或延后因子,

(总计+/-关闭)/总计

需要使它们同步。

相关内容