Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does ffprobe determine duration?

I'm using ffprobe to analyze media files stored on a remote server. This seems to work well, but for some files the duration is missing or incorrect (usually longer than it should be). Other times it returns this information accurately, and it doesn't seem to be related to the media type (codec, etc.).

Here's an example of a command that works:

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
}
}

Here's an example of one that doesn't:

ffprobe -v quiet -print_format json -show_streams -show_format "http://host.com/file.wav"

Which generates this result:

{
"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
}
}

These two examples are different formats, but I've seen it work and not work when the format is the same, I just don't have an example handy.

What I'd like to know is if there is something I can change about the parameters I'm using with ffprobe to allow the duration to be determined consistently and accurate, or any information I can find as to how ffprobe works so I figure out how I might change the input files, etc. so they work correctly.

Alternatively, if there is a different tool that works more reliably (it would need to be an open-source Linux tool) any suggestions or recommendations are welcome.

like image 393
jasongullickson Avatar asked Jun 01 '15 20:06

jasongullickson


People also ask

What does ffprobe do?

ffprobe gathers information from multimedia streams and prints it in human- and machine-readable fashion. For example it can be used to check the format of the container used by a multimedia stream and the format and type of each media stream contained in it.

Does FFMpeg include Ffprobe?

It is widely used for format transcoding, basic editing (trimming and concatenation), video scaling, video post-production effects and standards compliance (SMPTE, ITU). FFmpeg also includes other tools: ffplay , a simple media player and ffprobe , a command-line tool to display media information.


1 Answers

One simple solution is to use -show_packets option

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

Now open a.txt and go to the last packet and see dts_time value that would be the accurate duration of file. If dts_time is not defined check for the pts_time value.

like image 170
Satyam Naolekar Avatar answered Sep 27 '22 21:09

Satyam Naolekar