首页 > 解决方案 > 尽管重新采样音频过滤器,但 Ffmpeg 对 ts 和 m3u8 文件的切割不准确

问题描述

我需要准确地寻找和剪切视频。一些在线消息来源说将 -ss 放在源代码的前面或后面。结果对我来说是一样的。在下面的示例中,开始时间是准确的,但持续时间是不准确的。

ffmpeg -y -ss 00:00:05 -t 00:00:05 -i output.ts 5s.wav
ffprobe 5s.wav

Duration: 00:00:04.74

ffmpeg -y -i output.ts -ss 00:00:05 -t 00:00:05 5s.wav
ffprobe 5s.wav

Duration: 00:00:04.74

有时起点不准确,但持续时间是准确的。通过剪切 ts 文件和剪切未压缩的 wav 文件并同时收听两者,可以清楚地听到这一点。

ffmpeg -y -i output.ts -ss 00:00:15 -t 00:00:05 5s.wav

ffmpeg -y -i output.wav -ss 00:00:15 -t 00:00:05 5s-reference.wav

修复开始时间的方法是,如果我使用包含每个关键帧的字节偏移量的 m3u8 文件,并且我将 -ss 选项放在源文件的前面(如果我把它放在源文件之后,开始时间不准确,但持续时间是准确的):

ffmpeg -y -ss 00:00:15 -t 00:00:05 -i output.m3u8 5s.wav

这修复了开始时间,但持续时间在我没有使用 m3u8 文件时会得到的位置(持续时间仅为 4.47 秒)。

似乎涉及不同的时间戳,有时会使用其中一个。

ts 文件是通过捕获 UDP 流并将其与 ffmpeg 和 -codec:v 副本一起存储而生成的。

是ffmpeg坏了,还是ts文件坏了?如何解决此问题或修复 ts 文件?我意识到视频开始比音频晚,可能是因为视频不是以关键帧开始的。我可以让 ffmpeg 在第一个关键帧之后启动 -codec:v 复制吗?我还注意到,使用 ffprobe 报告“开始:1.400000”。我可以强制它从0开始吗?

任何提示将不胜感激。

我尝试了 ffmpeg 4.3.1 和 ffmpeg git-2020-07-24-21442a8。

output.* 文件的生成如下。语句“af aresample=async=1”应根据源视频的持续时间和减去的音频不同来填充丢失的音频。添加此语句在准确性或持续时间方面没有任何区别。这个问题不是重复的。

ffmpeg -i udp://example:port ^
-af aresample=async=1 ^
-codec:v copy ^
-codec:a aac -ac 2 -ar 44100 -b:a 160k ^
-hls_time 4 -hls_flags single_file -hls_list_size 0 -hls_segment_filename output.ts -hls_segment_type mpegts output.m3u8 ^
-codec:a pcm_s16le -bitexact -ar 11025 -ac 1 output.wav

标签: ffmpeg

解决方案


以 HLS 作为输入,使用

ffmpeg -y -ss 00:00:13 -copyts -start_at_zero -i input.m3u8 -af aresample=async=1 -ss 15 -to 20 -map 0:a ts-cut-m3u8.wav

由于 TS 段没有全局索引,因此比实际入点早一点查找,因此解复用器查找将从下一个关键帧开始。由于正在复制时间戳,因此使用输出 ss/to 来设置范围。aresample 将填补时间戳间隙(如果有)。对于此输入,在 15 到 20 范围内没有任何输入。有一个早在 5 秒左右。


推荐阅读