为啥 FFMPEG 报告错误的持续时间?

Posted

技术标签:

【中文标题】为啥 FFMPEG 报告错误的持续时间?【英文标题】:Why does FFMPEG report the wrong duration?为什么 FFMPEG 报告错误的持续时间? 【发布时间】:2010-11-03 17:19:34 【问题描述】:

我有一个旧版本的 FFmpeg,我无法轻易更改。

我们使用 FFmpeg 来查找视频和声音文件的持续时间。到目前为止,它一直运行良好。

最近在一个上传的文件上,FFmpeg 报告了一个 30 秒的文件长度为 5 分 30 秒。

会不会是文件有问题而不是 FFmpeg?

如果我使用 FFmpeg 转换为另一个文件,持续时间会恢复。

如果重要,ffmpeg -i 'path to the file' 会产生:

FFmpeg 版本 Sherpya-r15618,版权所有 (c) 2000-2008 Fabrice Bellard 等人。 libavutil 49.11。 0 / 49.11。 0 libavcodec 52.0.0 / 52.0.0 libav 格式 52.22。 1 / 52.22。 1 libavdevice 52. 1. 0 / 52. 1. 0 libswscale 0. 6. 1 / 0. 6. 1 libpostproc 51. 2. 0 / 51. 2. 0 建于 2008 年 10 月 14 日 23:43:47,gcc:4.2.5 20080919(预发布)[Sherpya] 输入 #0, mov,mp4,m4a,3gp,3g2,mj2,来自 'H:\path\to\file.mov': 持续时间:00:05:35.00,开始:0.000000,比特率:1223 kb/s 流 #0.0(eng):音频:aac,44100 Hz,立体声,s16 流 #0.1(eng):视频:h264、yuv420p、720x576、25.00 tb(r) 必须提供至少一个输出文件

这正是我使用 RegEx 提取持续时间的命令。

有没有人有一个很好的应用程序可以做我上面尝试的事情,但 100% 的时间都正确?

【问题讨论】:

如果您还有该文件,请在此处报告:ffmpeg.org/bugreports.html 我也注意到 aac 文件 superuser.com/questions/121298/… 你有没有深究这件事 - 我看到了同样的事情。和你一样,我发现其他应用程序(例如 Quicktime)可以正确读取持续时间。 我有一个相关问题:superuser.com/questions/728687/… FFmpeg 在我的目标文件中添加了不正确的元数据(持续时间和开始时间)。 ***.com/questions/10640088/… 我在这里找到answer .. 因为我也找到了这个.. 【参考方案1】:

用较新版本的 ffmpeg 检查它(您不必替换您的构建),如果它给出相同的持续时间,您可以可能责备该文件。

【讨论】:

好主意,我会试试看的。【参考方案2】:

你不应该依赖标准错误。

stderr 输出不打算进行机器解析:它仅供参考,容易损坏。

解析它

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
30.024000

您也可以使用 ffmpeg 通过完全解码文件来获取持续时间。

ffmpeg -i input.webm -f null -
...
frame=206723 fps=1390 q=-0.0 Lsize=N/A time=00:57:28.87 bitrate=N/A speed=23.2x

详情请参考Format (container) duration

【讨论】:

【参考方案3】:

你可以试试 tcprobe,transcode 包的一部分。

【讨论】:

感谢推荐,我会尽快看看这个。【参考方案4】:

我猜是文件有问题。长度可能错误地写在标题中。不幸的是,没有验证器之类的东西(如网络标准),因此您无法确定文件是否正确。

【讨论】:

嗯嗯嗯嗯,也许吧。不过 VLC 和 Quicktime 报告的长度是正确的。【参考方案5】:

确保您定义了文件已知的频道和频率。还要确保使用 -f 定义格式。检查ffmpeg -formats 以查看所有可用的。

使用-ac 定义频道。使用-ar 定义音频的速率。如果它默认比特率或频率,那么持续时间将与实际不同。

【讨论】:

以上是关于为啥 FFMPEG 报告错误的持续时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 FFMPEG 错误地将 .M4A 猜测为 WAV pcm_s16le 文件?

使用ffmpeg libavcodec将视频流编码为H264,为啥持续时间为零

相同的错误但不同的错误报告。为啥?

为啥 Firebase 报告错误的屏幕数据?

为啥导出的模块错误报告定义的函数“不是函数”

为啥不在 PHP 中使用最高错误报告级别?