【发布时间】:2015-08-15 10:35:13
【问题描述】:
我正在使用ffprobe 来分析存储在远程服务器上的媒体文件。这似乎运作良好,但对于某些文件,持续时间丢失或不正确(通常比应有的时间长)。其他时候它会准确地返回此信息,并且似乎与媒体类型(编解码器等)无关。
这是一个有效的命令示例:
ffprobe -v quiet -print_format json -show_streams -show_format http://host.com/file.aiff
{
"streams": [
{
"index": 0,
"codec_name": "pcm_s16be",
"codec_long_name": "PCM signed 16-bit big-endian",
"codec_type": "audio",
"codec_time_base": "1/44100",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"sample_fmt": "s16",
"sample_rate": "44100",
"channels": 2,
"bits_per_sample": 16,
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/44100",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 8494248,
"duration": "192.613333",
"bit_rate": "1411200",
"nb_frames": "8494248",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0
}
}
],
"format": {
"filename": "http://host.com/file.aiff",
"nb_streams": 1,
"nb_programs": 0,
"format_name": "aiff",
"format_long_name": "Audio IFF",
"start_time": "0.000000",
"duration": "192.613333",
"probe_score": 100
}
}
下面是一个没有的例子:
ffprobe -v quiet -print_format json -show_streams -show_format "http://host.com/file.wav"
这会产生这个结果:
{
"streams": [
{
"index": 0,
"codec_name": "pcm_s16le",
"codec_long_name": "PCM signed 16-bit little-endian",
"codec_type": "audio",
"codec_time_base": "1/44100",
"codec_tag_string": "[1][0][0][0]",
"codec_tag": "0x0001",
"sample_fmt": "s16",
"sample_rate": "44100",
"channels": 2,
"bits_per_sample": 16,
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/44100",
"bit_rate": "1411200",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0
}
}
],
"format": {
"filename": "http://host.com/file.wav",
"nb_streams": 1,
"nb_programs": 0,
"format_name": "wav",
"format_long_name": "WAV / WAVE (Waveform Audio)",
"bit_rate": "1411200",
"probe_score": 99
}
}
这两个例子是不同的格式,但是我看到它在格式相同的情况下工作和不工作,我只是没有一个方便的例子。
我想知道的是,我是否可以更改与 ffprobe 一起使用的参数,以便一致且准确地确定持续时间,或者我可以找到有关 ffprobe 的任何信息工作,所以我弄清楚如何更改输入文件等,以便它们正常工作。
或者,如果有其他更可靠的工具(它需要是开源 Linux 工具),欢迎提出任何建议或建议。
【问题讨论】:
-
最准确的方法可能是完全解码文件,然后查看控制台输出:
ffmpeg -i input -f null -。不幸的是,这可能需要一些时间,具体取决于您的输入。 -
我认为 FFmpeg 使用容器来计算持续时间(基本上是通过信任容器中的任何元数据...)?
-
@LordNeckbeard ffmpeg 确实在转码过程完成后提供了准确的持续时间,但是对于我的应用程序,我无法在开始将结果返回给客户端之前存储结果(或者,时间运行两次转码操作)。
-
@rogerdpack 我怀疑这一点,但确认它会很有趣;你知道这些信息的来源吗?
-
我在尝试使用 ffprobe 获取 mp3 的持续时间时遇到了类似的问题。在 Windows 7 中,有三个示例 mp3,第一个和第二个与 ffprobe 配合得很好,但是对于第三个(Bob Acri 的 Sleep Away.mp3),ffprobe 显示了 150 秒的持续时间,但实际上是 200 秒长(Windows 资源管理器显示正确的持续时间)但 ffmpeg 也显示错误的结果('ffprobe.exe -v quiet -print_format json -show_streams -show_format "C:\Users\Public\Music\Sample Music\Sleep Away.mp3"' vs 'ffmpeg.exe - i "C:\Users\Public\Music\Sample Music\Sleep Away.mp3"') - 两者都是错误的:/
标签: linux audio ffmpeg ffprobe