Java/PHP/C#等语言如何调用ffmpeg/ffprobe获取音视频文件的信息并输出为JSON格式

我的这篇博文用FFmpeg获取视频流+音频流的信息(编码格式、分辨率、帧率、播放时长...)描述了用C++的方法调用FFmpeg API获得视音频文件的信息,但是如果你用其他语言:比如Java/PHP/C#等解释性语言开发的,虽然也可以通过一些转换好的库接口(比如JavaCV、Jave)间接调用FFmpeg,但是调用API的形式毕竟不大方便,特别是对FFmpeg API不熟悉的朋友。其实,通过命令行调用ffmpeg已经可以执行很多ffmpeg的功能。ffmpeg可以将视音频文件的信息显示到控制台或者打印输出到一个文本文件,FFmpeg的Bin包里面还带了一个强大的工具ffprobe,这个工具可以获取视音频文件里的详细信息,并将信息输出为JSON格式。我们可以通过解析ffprobe输出的JSON来获得文件的格式信息。

先让我们调用ffprobe工具执行一条命令:

ffprobe -v quiet -print_format json -show_format  SlideShow#001.avi

执行命令结果如下:

{
    "format": {
        "filename": "SlideShow#001.avi",
        "nb_streams": 1,
        "nb_programs": 0,
        "format_name": "avi",
        "format_long_name": "AVI (Audio Video Interleaved)",
        "start_time": "0.000000",
        "duration": "12.100000",
        "size": "759252",
        "bit_rate": "501984",
        "probe_score": 100
    }
}

上述命令的作用是:ffprobe将获得的媒体文件的信息打印到控制台,并将结果封装成JSON格式。上面命令行几个参数的意义:

 -v quiet:   静默工作,不输出版本、工作信息 ;

-print_format  json: 表示输出为JSON格式

-show_format: 表示输出文件的格式信息,比如封装格式、码率、流数目、文件时长,文件大小等;

让我们执行第二条命令:

ffprobe -v quiet -print_format json -show_streams  SlideShow#001.avi

这回输出结果是:

{
    "streams": [
        {
            "index": 0,
            "codec_name": "msmpeg4v2",
            "codec_long_name": "MPEG-4 part 2 Microsoft variant version 2",
            "codec_type": "video",
            "codec_time_base": "1/30",
            "codec_tag_string": "MP42",
            "codec_tag": "0x3234504d",
            "width": 352,
            "height": 222,
            "has_b_frames": 0,
            "sample_aspect_ratio": "0:1",
            "display_aspect_ratio": "0:1",
            "pix_fmt": "yuv420p",
            "level": -99,
            "r_frame_rate": "30/1",
            "avg_frame_rate": "30/1",
            "time_base": "1/30",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 363,
            "duration": "12.100000",
            "bit_rate": "494421",
            "nb_frames": "363",
            "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
            }
        }
    ]
}

-show_streams 参数的意义是输出每一个流的详细信息。

上面命令行的输入文件只有一个流:视频流,输出的视频流的JSON信息里的各个字段的意义:

"codec_name": 编码器短名称;
"codec_long_name": 编码器长名称;
"codec_type": 视频或音频
"codec_time_base": 时钟频率/采样频率;
"width": 图像宽度;
"height": 图像高度;
"has_b_frames": 是否含有B帧;
"avg_frame_rate": 平均帧率;
"bit_rate": 码率;
"nb_frames": 帧的数目;
"duration_ts": 播放长度;

对于音频,还有以下属性:
"sample_rate": 采样频率
"channels": 声道数
"channel_layout": 声道类型,比如"stereo"表示立体声;

如果要获得文件的格式信息和每一个流的信息,可以同时加上-show_format和-show_streams这两个参数。

另外,我们为了便于解析输出的JSON,可以将打印输出重定向到一个文本文件,命令如下:

ffprobe -v quiet -print_format json -show_format -show_streams SlideShow#001.avi > output_json.txt

具体怎么解析Json就不讲了,基本上每个程序员都懂得怎么解析JSON。

如果你觉得本文章对你有用,请点赞或加关注。

 

 

你可能感兴趣的:(ffmpeg)