Linux ffprobe如何确定持续时间?

Linux ffprobe如何确定持续时间?,linux,audio,ffmpeg,ffprobe,Linux,Audio,Ffmpeg,Ffprobe,我正在使用ffprobe分析存储在远程服务器上的媒体文件。这似乎工作得很好,但对于某些文件,持续时间缺失或不正确(通常比应该的时间长)。其他时候,它会准确地返回此信息,并且似乎与媒体类型(编解码器等)无关 下面是一个有效的命令示例: ffprobe-v quiet-print\u format json-show\u streams-show\u formathttp://host.com/file.aiff { "streams": [ { "index": 0,

我正在使用
ffprobe
分析存储在远程服务器上的媒体文件。这似乎工作得很好,但对于某些文件,持续时间缺失或不正确(通常比应该的时间长)。其他时候,它会准确地返回此信息,并且似乎与媒体类型(编解码器等)无关

下面是一个有效的命令示例:

ffprobe-v quiet-print\u format json-show\u streams-show\u formathttp://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\u format json-show\u streams-show\u 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工具),欢迎提供任何建议或建议。

一个简单的解决方案是使用-show_packets选项

ffprobe -i input.mp4 -show_packets > a.txt

现在打开a.txt并转到最后一个数据包,查看dts_时间值,该值将是文件的准确持续时间。如果未定义dts\U时间,请检查pts\U时间值。

元数据可能不正确。最正确的方法是解码整个文件:

$ 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

来源:

最准确的方法可能是完全解码文件,然后查看控制台输出:
ffmpeg-i input-f null-
。不幸的是,这可能需要一些时间,具体取决于您的输入。我认为FFmpeg使用容器来计算持续时间(基本上是通过信任容器中的任何元数据…)@LordNeckbeard FFmpeg确实在转码过程完成后提供了准确的持续时间,但对于我的应用程序,在我开始将结果返回给客户端之前,我无法存储结果(或者,运行两次转码操作的时间)。@rogerdpack我怀疑这一点,但确认它会很有趣;你知道这些信息的来源吗?我在尝试使用ffprobe获取MP3的持续时间时遇到了类似的问题。在windows 7中有三个示例mp3,第一个和第二个可以与ffprobe配合使用,但第三个(Sleep Away.mp3 from Bob Acri)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”与'ffmpeg.exe-i“C:\Users\Public\Music\Sample Music\Sleep Away.mp3”')两者都是错误的:/$ffmpeg-i input.webm-f null-2>&1 | grep time