zoukankan      html  css  js  c++  java
  • centos8平台用ffprobe获取视频文件信息(ffmpeg4.2.2)

    一,ffprobe的作用

    ffprobe是强大的视频分析工具,

    用于从多媒体流中获取相关信息或查看文件格式信息,

    并以可读的方式打印

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/

    说明:作者:刘宏缔 邮箱: 371125307@qq.com

    二,查看ffprobe版本和帮助

    1,查看版本

    [root@blog 1]# ffprobe --version

    说明:ffprobe和ffmpeg属于同一个包,打印出的版本号也是相同的

    [root@blog 1]# whereis ffprobe
    ffprobe: /usr/bin/ffprobe /usr/share/man/man1/ffprobe.1.gz
    
    [root@blog 1]# rpm -qf /usr/bin/ffprobe
    ffmpeg-4.2.2-5.el8.x86_64

    2,查看帮助

    [root@blog 1]# ffprobe --help  

                                                                                                                                      

    3,查看手册 

    [root@blog 1]# man ffprobe

    三,ffprobe的应用例子:

    1,得到视频的宽/高/时长等信息

     #-v quiet: 不做版本参数等log的输出,避免影响数据的输出

    #-print_format:    就是-of参数,输出格式,可以指定json或xml(常用),也可用csv,ini等

    #-show_format: 显示输入多媒体流的格式信息

    # -show_streams: 显示输入多媒体流中流的信息:包括视频和音频

    [root@blog 1]# ffprobe -v quiet -print_format json -show_streams 8_9f6fa300bacded7b.mp4 
    {
        "streams": [
            {
                "index": 0,
                "codec_name": "h264",
                "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
                "profile": "Main",
                "codec_type": "video",
                "codec_time_base": "1001/60000",
                "codec_tag_string": "avc1",
                "codec_tag": "0x31637661",
                "width": 640,
                "height": 360,
                "coded_width": 640,
                "coded_height": 368,
                "has_b_frames": 1,
                "sample_aspect_ratio": "1:1",
                "display_aspect_ratio": "16:9",
                "pix_fmt": "yuv420p",
                "level": 31,
                "color_range": "tv",
                "color_space": "smpte170m",
                "color_transfer": "bt709",
                "color_primaries": "smpte170m",
                "chroma_location": "left",
                "refs": 1,
                "is_avc": "true",
                "nal_length_size": "4",
                "r_frame_rate": "30000/1001",
                "avg_frame_rate": "30000/1001",
                "time_base": "1/30000",
                "start_pts": 0,
                "start_time": "0.000000",
                "duration_ts": 6458452,
                "duration": "215.281733", 
    ...

    说明:以json格式输出,更方便解析

    输出信息的说明:

    r_frame_rate     实际帧率

    avg_frame_rate 平均帧率

    nb_frames         总的帧数

    pix_fmt             像素格式

    2,得到指定的视频信息:用python直接取出相应的字段:

    获取宽度

    [root@blog 1]# ffprobe -v quiet -print_format json -show_format -show_streams 5_d3958808f0a5da07.mp4 | 
    python3.6 -c 'import json;import sys;obj=json.load(sys.stdin);print(obj["streams"][0]["width"])';
    640

    获取高度

    [root@blog 1]# ffprobe -v quiet -print_format json -show_format -show_streams 5_d3958808f0a5da07.mp4 | 
    python3.6 -c 'import json;import sys;obj=json.load(sys.stdin);print(obj["streams"][0]["height"])';
    360

    获取时长

    [root@blog 1]# ffprobe -v quiet -print_format json -show_format -show_streams 5_d3958808f0a5da07.mp4 | 
    python3.6 -c 'import json;import sys;obj=json.load(sys.stdin);print(obj["streams"][0]["duration"])';
    215.281733

    说明:注意centos8上没有python命令,

    使用前可以先用whereis进行查询

    [root@blog 1]# whereis python
    python: /usr/bin/python3.6m /usr/bin/python3.6 /usr/bin/python2.7 

    3,得到指定的视频信息:用-show_entries查看指定信息:

    这样我们不需要再用管道把数据传递给python解析json

    看一个例子:我们要得到视频的fps

    #-show_entries: 显示指定的项

    [root@blog 1]# ffprobe -v error -select_streams v -show_entries stream=r_frame_rate 8_9f6fa300bacded7b.mp4
    [STREAM]
    r_frame_rate=30000/1001
    [/STREAM]

    说明:上面的除了STREAM这个组名,还有r_frame_rate这个字段名,

    我们也可以把它关闭

    #-of : 指定输出格式

    #noprint_wrappers=1:不显示wrapper

    #nokey=1: 不显示key

    [root@blog 1]# ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate 8_9f6fa300bacded7b.mp4
    30000/1001

    相关知识:什么是fps?

    视频帧率(Frame rate)是用于测量显示帧数的量度。

    测量单位为每秒显示帧数(Frames per Second,简:FPS)

    fps的几个值:

    人类的眼睛所看画面的帧率高于16的时候,就会认为是连贯的,此现象称之为视觉停留

    高的帧率可以得到更流畅、更逼真的动画。

    30fps就是可以接受的,

    如果提升至60fps则可以明显提升交互感和逼真感

    2,查看streams中指定的内容:

    # -select_streams: 参数可以是a、v、s分别表示只查看音频、视频、字幕

    只看音频信息

    [root@blog 1]# ffprobe -v quiet -print_format json -show_streams -select_streams a 8_9f6fa300bacded7b.mp4

    只看视频信息

    [root@blog 1]# ffprobe -v quiet -print_format json -show_streams -select_streams v 8_9f6fa300bacded7b.mp4

    只看字幕信息

    [root@blog 1]# ffprobe -v quiet -print_format json -show_streams -select_streams s 8_9f6fa300bacded7b.mp4

    3,查看视频的帧信息

    #-show_frames:视频帧信息

    [root@blog 1]# ffprobe -v quiet -print_format json -show_frames 8_9f6fa300bacded7b.mp4
     {
                "media_type": "video",
                "stream_index": 0,
                "key_frame": 0,
                "pkt_pts": 3601598,
                "pkt_pts_time": "120.053267",
                "best_effort_timestamp": 3601598,
                "best_effort_timestamp_time": "120.053267",
                "pkt_duration": 1001,
                "pkt_duration_time": "0.033367",
                "pkt_pos": "7684111",
                "pkt_size": "192",
                "width": 640,
                "height": 360,
                "pix_fmt": "yuv420p",
                "sample_aspect_ratio": "1:1",
                "pict_type": "P",
                "coded_picture_number": 3598,
                "display_picture_number": 0,
                "interlaced_frame": 0,
                "top_field_first": 0,
                "repeat_pict": 0,
                "color_range": "tv",
                "color_space": "smpte170m",
                "color_primaries": "smpte170m",
                "color_transfer": "bt709",
                "chroma_location": "left"
            }

    media_type: 标明是video还是audio

    key_frame: 是否关键帧

    "pix_fmt":  像素格式

    coded_picture_number:编码图片序号

    pict_type:帧类型(I、B、P)

    相关知识:

    三种帧类型
    I:关键帧。关键帧是构成一个帧组(GOP,Group of Picture)的第一个帧。IF保留了一个场景的所有信息。压缩比为1:7。
    P:未来单向预测帧,只储存与之前一个已解压画面的差值。压缩比为1:20。
    B:   双向预测帧,除了参考之前解压过了的画面外,亦会参考后面一帧中的画面信息。压缩比为1:50

    说明:双向预测帧做压缩效果最好

    4,查看视频的包信息

    # -show_packets 参数查看包信息

    [root@blog 1]# ffprobe -v quiet -print_format json -show_packets 8_9f6fa300bacded7b.mp4 

    内容:

     {
                "codec_type": "video",
                "stream_index": 0,
                "pts": 108108,
                "pts_time": "3.603600",
                "dts": 106106,
                "dts_time": "3.536867",
                "duration": 1001,
                "duration_time": "0.033367",
                "size": "202",
                "pos": "377767",
                "flags": "__"
            },

    内容的说明:

    codec_type: 多媒体类型,例如视频包,音频包等;
    stream_index:  多媒体的stream索引;
    pts: 多媒体的显示时间值
    pts_time: 根据不同格式计算过后的多媒体的显示时间
    dts: 多媒体解码时间值
    dts_time: 根据不同格式计算过后的多媒体解码时间
    duration: 多媒体包占用的时间值
    duration_time: 根据不同格式计算过后的多媒体包占用的时间值
    size: 多媒体包的大小
    pos: 多媒体包所在的文件偏移位置
    flags: 多媒体包标记,关键包与非关键包的标记

    相关知识:

    DTS(Decoding Time Stamp)

    解码时间戳,作用:告诉播放器该在什么时候解码这一帧的数据。

    PTS(Presentation Time Stamp)

    显示时间戳,作用:告诉播放器该在什么时候显示这一帧的数据

    如果视频流中没有 B 帧,则 DTS 和 PTS 的顺序是一致的。

    如果有 B 帧时,则会导致解码顺序和播放顺序的不一致

    5,显示视频的封装格式信息

    [root@blog 1]# ffprobe -v quiet -print_format json -show_format 8_9f6fa300bacded7b.mp4
    {
        "format": {
            "filename": "8_9f6fa300bacded7b.mp4",
            "nb_streams": 2,
            "nb_programs": 0,
            "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
            "format_long_name": "QuickTime / MOV",
            "start_time": "0.000000",
            "duration": "120.128000",
            "size": "7700383",
            "bit_rate": "512811",
            "probe_score": 100,
            "tags": {
                "major_brand": "mp42",
                "minor_version": "0",
                "compatible_brands": "mp42mp41",
                "creation_time": "2020-03-27T06:25:04.000000Z"
            }
        }
    }

    说明:

    "nb_streams": 2 :流的个数

    format_name: 格式的名字

    start_time:播放开始时间

    duration:播放时长

    size:文件大小

    bit_rate :平均码率

    四,查看centos平台的版本

    [root@blog 1]# cat /etc/redhat-release
    CentOS Linux release 8.0.1905 (Core) 
  • 相关阅读:
    python 0.1
    写博
    ubuntu 下tomcat配置
    ubuntu Ulipad 配置
    git windows中文乱码 以及关键字加亮
    ubuntu windows mysql 中文乱码解决
    struts2 tomcat下生成文件保存指定的目录
    [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类
    [你必须知道的.NET] 第三回:历史纠葛:特性和属性
    [你必须知道的.NET] 第一回:恩怨情仇:is和as
  • 原文地址:https://www.cnblogs.com/architectforest/p/12814763.html
Copyright © 2011-2022 走看看