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) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM