我正在使用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工具),则欢迎提出任何建议。

最佳答案

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

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

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

10-04 13:41