一,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)