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

centos8平台用ffprobe获取视频文件信息(ffmpeg4.2.2)的更多相关文章

  1. JAVA通过URL链接获取视频文件信息(无需下载文件)

    最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...

  2. java调用ffmpeg获取视频文件信息的一些参数

    一.下载ffmpeg http://www.ffmpeg.org/download.html 主要需要bin目录下的ffmpeg可执行文件 二.java代码实现 package com.aw.util ...

  3. java 实现视频转换通用工具类:获取视频元数据信息(一)

    java 做视频转换主要用到开源的ffmpeg或者mencoder,还要有MP4Box. 注:由于平时都没有时间写博客,所以思路我就不写了,有问题问我,不一定马上回复. 详细介绍: ffmpeg:ht ...

  4. 实战FFmpeg--iOS平台使用FFmpeg将视频文件转换为YUV文件

    做播放器的开发这里面涉及的东西太多,我只能一步步往前走,慢慢深入.播放器播放视频采用的是渲染yuv文件.首先,要知道yuv文件是怎么转换得来的,其次,要知道怎么把视频文件保存为yuv文件.雷神的文章1 ...

  5. 使用ffprobe 查询wav文件信息

    使用ffprobe 查询wav文件信息 安装 安装过程和ffmepg相同不在赘述 不带参数查询文件信息 ffprobe ZH_biaobei_标准合成_甜美女声_楠楠_5_5_5_6_1_4047db ...

  6. android 中获取视频文件的缩略图(非原创)

    在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...

  7. C# 获取 mp3文件信息

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  8. android播放器如何获取音乐文件信息

    转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...

  9. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片

    突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...

随机推荐

  1. 浅谈Charles —— 青花瓷

    Charles -- 青花瓷 网络抓包工具 可以拦截 iPhone/Android 手机中 App 的非加密网络请求数据 使用 手机&电脑在同一个局域网 确保电脑能够通过路由器访问互联网 电脑 ...

  2. [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

    题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...

  3. JVM直接内存(Direct Memory)

    直接内存 1.直接内存不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 2.直接内存是Java堆外的.直接向系统申请的内存区间. 3.简单理解: java p ...

  4. 手写spring

    体系结构 Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入.下面的部分对在 Spring 框架中所有可用的 ...

  5. vue v-for渲染数据出现DOMException: Failed to execute 'removeChild' on 'Node': The node .....

    在项目中,使用了vue的v-for渲染数组数据,在一次改变数组的时候出现异常报错,而实际的数组是已经变化过的了,页面卡死 网上找了一下原因,说是vue的DOM渲染的时候,删除之后DOM里面的还没有反应 ...

  6. 一起构建Python生长土壤

    环境 环境安装 1. 解释器 Python https://www.python.org/ 2. IDE Pycharm https://www.jetbrains.com/pycharm/downl ...

  7. 03 ArcPython实战篇一

    1.自增计算 (字段计算器) total = 0 def accumulate(increment):        global total        if total:            ...

  8. c++中的#include "stdafx.h"

    转自:https://blog.csdn.net/lijun5635/article/details/13090341 在网上看到的一篇很详细的文章解释,之前一直不明白这个头文件什么作用,用来学习很好 ...

  9. Matlab中image、imagesc和imshow函数用法解析

    来源:https://blog.csdn.net/zhuiyuanzhongjia/article/details/79621813 1.显示RGB图像 相同点:这三个函数都是把m*n*3的矩阵中的数 ...

  10. 【学习笔记/题解】分层图/[JLOI2011]飞行路线

    题目戳我 \(\text{Solution:}\) 关于分层图: 一般用于处理:给你\(k\)次机会对边权进行修改的最短路问题. 算法流程: 建立出\(k\)层图,对应进行\(k\)次操作后的局面. ...