ffmpeg - 尽管重新采样音频过滤器,但 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
解决方案
以 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 秒左右。
推荐阅读
- javascript - 为什么这个子事件不更新父级(Vue)中的状态
- python - 比较 n-gram 以分组重复
- mysql - Sequelize 不会跳过锁定的行
- javascript - 使用 JQuery 或 Javascript 从多维 HTML 名称数组中按二级键选择
- javascript - 获取重复 ID 并将所有数据添加到一个 id
- swift - 为使用 Health Kit 的应用打开 Health Kit 权限设置
- java - 引起:org.hibernate.hql.internal.ast.QuerySyntaxException:无法在类上找到适当的构造函数
- php - 雄辩在哪里堆积
- mongodb - 在成功运行 Spring Boot 应用程序时,MongoDB 身份验证开始意外失败
- python - 将 Python 列表逐行写入 csv 文件