FFmpeg 音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

【导读】FFmpeg 是一个完整的跨平台音视频解决方案,它可以用于音频和视频的转码、转封装、转推流、录制、流化处理等应用场景。FFmpeg 在音视频领域享有盛誉,号称音视频界的瑞士军刀。同时,FFmpeg 有三大利器是我们应该清楚的,它们分别是 ffmpeg、ffprobe 和 ffplay 三剑客。

正文

三剑客 ffmpeg、ffprobe、ffplay 都有自己的使用场景和特殊技能,在音视频开发过程中,如果能够合理利用这三个工具,将会有事半功倍的效果。接下来,我们就结合实际案例介绍一下它们三个的使用技巧。

ffmpeg

ffmpeg 应该是 FFmpeg 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。在实际开发过程,我们可以直接使用 ffmpeg 可执行程序,也可以通过动态库或者静态库的形式进行引用依赖。但在技术调研时,大多使用可执行程序,因为这样操作更加简单,成本更低。

其实,我们使用的 ffmpeg 版本是可以定制的,大多数公司都有自己的 ffmpeg 私有库版本,根据公司的业务对官方的 ffmpeg 版本进行了裁剪和定制化修改。因为很多公司的产品都是一个闭环,特别是播放器方案,不需要支持所有的编码格式、解码格式和封装格式。

比如我们公司的云点播服务,就是将所有上传的视频文件和音频文件都转码成了标准的视频 H264 和音频 AAC 编码格式,最终存储为 m3u8 格式。我们提供的播放器 SDK 只需要支持 H264 和 AAC 编码格式的解码就可以了,而不需要关心对于其他音视频编码格式的支持,这样的播放器方案就非常的轻量化。同时,也可以兼容市面上大多数的通用播放器。

接下来,我们介绍一下如何判断当前的 ffmpeg 版本支持哪些编码器、解码器、封装格式和滤镜功能。

编码器

如果想要查看当前 ffmpeg 版本支持哪些编码器,可以使用如下命令:

ffmpeg -encoders

运行结果示例:(部分内容)

Encoders:

V..... = Video

A..... = Audio

S..... = Subtitle

.F.... = Frame-level multithreading

..S... = Slice-level multithreading

...X.. = Codec is experimental

....B. = Supports draw_horiz_band

.....D = Supports direct rendering method 1

------

V..... flv FLV / Sorenson Spark / Sorenson H.263 (Flash Video) (codec flv1)

V..... gif GIF (Graphics Interchange Format)

V..... h263 H.263 / H.263-1996

V.S... mpeg2video MPEG-2 video

V.S... mpeg4 MPEG-4 part 2

什么情况下,我们会使用这个命令呢?比如你正在使用 ffmpeg 编码时,结果报错了,你首先需要使用这个命令查看一下当前 ffmpeg 是否支持目标编码器。这里你可能会问,ffmpeg 没有统一的版本吗?为什么支持的编码器还不一样?官网正式的 ffmpeg 版本肯定是统一的,但是实际项目我们不可能使用所有的编码器、解码器、滤镜等组件,一般会进行裁剪。

对 ffmpeg 进行裁剪,可能还有另外一个原因,就是受限于客户端安装包的大小,全量的 ffmpeg 大小在大几十兆,可能会占到整个安装包的一半,所以很多时候需要对 ffmpeg 进行裁剪。

解码器

如果想要查看当前 ffmpeg 版本支持哪些解码器,可以使用如下命令:

ffmpeg -decoders

输出结果最开始会显示当前 ffmpeg 版本不同组件的版本号,其实,ffmpeg 本身就是一个工具集合,内部包含了不同的功能模块。其中,包括 libavutil,libavcodec,libavformat,libavdevice,libavfilter,libswscale,libswresample 七部分,共同构成了功能强大的 ffmpeg 工具。

运行结果示例:(部分内容)

Decoders:

V..... = Video

A..... = Audio

S..... = Subtitle

.F.... = Frame-level multithreading

..S... = Slice-level multithreading

...X.. = Codec is experimental

....B. = Supports draw_horiz_band

.....D = Supports direct rendering method 1

------

V...BD flv FLV / Sorenson Spark / Sorenson H.263 (Flash Video) (codec flv1)

V....D gif GIF (Graphics Interchange Format)

V....D h261 H.261

V...BD h263 H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2

VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10

V..... h264_vda H.264 (VDA acceleration) (codec h264)

VFS..D hevc HEVC (High Efficiency Video Coding)

V.S.BD mpeg1video MPEG-1 video

V.S.BD mpeg2video MPEG-2 video

V.S.BD mpegvideo MPEG-1 video (codec mpeg2video)

VF..BD mpeg4 MPEG-4 part 2

如果你大致浏览器一下编码器和解码器的列表,就会感觉 ffmpeg 支持的解码器要比编码器多?是的,你的感觉没有错。ffmpeg 本身更多的时候是用于解码,编码器是先由一些视频厂家或者第三方机构定义出来的视频编码标准,然后 ffmpeg 团队根据需要再决定是否支持对应的解码功能,比如编码 H264 视频时,更多使用的是 openH264 或者是 x264 编码库。

另外需要说明的是,有一个类似等式:

ffmpeg -codecs = (ffmpeg -encoders)+(ffmpeg -decoders)。

意思就是说也可以使用 ffmpeg -codecs 命令查看总的编码器和解码器的情况。

封装格式

说到封装格式,大家就比较容易理解了,其实就是我们平时看到的视频文件的后缀,比如 mp4,flv,mkv,webm,ts,3gp 等。ffmpeg 在编码的时候需要用到封装格式,比如把 AAC 的音频和 H264 的视频封装成 mp4 文件;解码的时候也需要用到解封装格式,比如把 mp4 文件解封装成 AAC 的音频和 H264 的视频。我们可以使用如下命令查看 ffmpeg 支持的封装格式和解封装格式:

ffmpeg -formats

运行结果示例:(部分内容)

File formats:

D. = Demuxing supported

.E = Muxing supported

--

E 3gp 3GP (3GPP file format)

D aac raw ADTS AAC (Advanced Audio Coding)

DE ac3 raw AC-3

D ape Monkey's Audio

DE avi AVI (Audio Video Interleaved)

DE flv FLV (Flash Video)

DE g722 raw G.722

DE gif GIF Animation

DE h263 raw H.263

DE h264 raw H.264 video

滤镜器

滤镜功能一般是进行一些比较复杂的操作时才会用到的功能,比如给视频增加贴图、混流合并时。

可以使用如下命令查看当前 ffmpeg 版本都支持哪些滤镜:

ffmpeg -filters

运行结果示例:(部分内容)

Filters:

T.. = Timeline support

.S. = Slice threading

..C = Command support

A = Audio input/output

V = Video input/output

N = Dynamic number and/or type of input/output

| = Source or sink filter

... acompressor A->A Audio compressor.

... acrossfade AA->A Cross fade two input audio streams.

滤镜支持多种类型,有时间线、线程切片、命令行、控制音频输入输出、控制视频输入输出、动态控制输入输出的数量和类型、源滤波器,不同的功能可以选择对应类型的过滤器。

ffprobe

ffprobe 在 FFmpeg 三剑客中是一个查看文件多媒体信息的利器,使用方式超级简单,输出信息非常详细。音视频开发过程中,当需要处理某个多媒体文件时,我们首先需要知道它的基本信息,比如它是音频文件,还是视频文件?视频文件的话,是否包含音频流?以及相应的音频和视频参数信息,码率、分辨率、采样率、声道数、采样位、帧率、颜色空间等。

查看音频信息

利用 ffprobe 查看音频信息的方式也非常简单,可以指定很多参数,最简单的使用方式可以参考如下命令:

ffprobe demo.ape

运行结果示例:

Input #0, ape, from 'demo.ape':

Metadata:

TITLE : 煎熬

Copyright : QQ 音乐

ALBUM : 感谢爱人

ARTIST : [www.51ape.com]李佳薇

Duration: 00:04:22.03, start: 0.000000, bitrate: 793 kb/s

Stream #0:0: Audio: ape (APE / 0x20455041), 44100 Hz, stereo, s16p

是不是非常简单?我们简单分析一下上面的输出信息,这是一段音乐文件,标题是“煎熬”,音乐时长是 4 分 22 秒,码率是 793kb/s,音频格式是 ape,采样率是 44100 赫兹,立体声,采样格式是 s16p。

查看视频信息

利用 ffprobe 查看视频信息的方式也非常简单,可以参考如下命令:

ffprobe yingzi.mp4

运行结果示例:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'yingzi.mp4':

Metadata:

major_brand : mp42

minor_version : 1

compatible_brands: mp41mp42isom

creation_time : 2021-02-07 12:48:08

Duration: 00:00:15.05, start: 0.000000, bitrate: 825 kb/s

Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 105 kb/s (default)

Metadata:

creation_time : 2021-02-07 12:48:08

handler_name : Core Media Audio

Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, smpte170m/smpte170m/bt709), 320x568, 713 kb/s, 29.97 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)

Metadata:

creation_time : 2021-02-07 12:48:08

handler_name : Core Media Video

通过上述输出信息,我们可以知道这段视频,既包含音频流,又包含视频流,视频时长 15 秒,音频编码 AAC,视频编码 H264(Main),颜色空间是 yuv420p,分辨率是 320x568,帧率是 29.97。

ffplay

ffplay 在 FFmpeg 三剑客中是一个多功能播放器,ffplay 既可以播放音频,又可以播放视频,是从事音视频相关开发的工作人员常用的基础工具之一。掌握 ffpaly 的使用是非常有必要的。接下来,我们就一起看一下具体怎么使用 ffplay。

播放音频文件

使用 ffplay 播放一首音乐非常简单,具体参考如下命令:

ffplay demo.ape

播放的同时会默认出现一个音频频谱图,如下图所示:

播放图形的显示模式有两种,一种是波形图,showmode=1,一种是频谱图,showmode=2,音乐默认播放的是频谱图。如果想显示波形图,可以使用如下命令:

ffplay -showmode 1 demo.ape

图形显示如下:

如果你不想显示任何播放图形,也是可以的,设置 showmode=0,运行如下命令:

ffplay -showmode 0 demo.ape

这样只会有如下图所示的信息输出。

播放视频文件

使用 ffplay 播放一段视频也非常简单,具体参考如下命令:

ffplay bunny.mp4

播放效果图如下:

不仅如此,当视频文件存在多路音频或者多路视频时,ffplay 还可以指定播放哪路音频或者视频,默认播放 index=0 的音频和视频,比如指定播放第二路音频:

ffplay test.mp4 -ast 1

比如指定播放第二路视频:

ffplay test.mp4 -vst 1

另外,大家都知道音频和视频同时存在时,播放的时候就面临音画同步的问题,那么 ffplay 是怎么处理的呢?其实 ffplay 默认是以音频时间戳为基准的,当然我们也可以指定以视频或者系统时间戳为基准。以视频时间戳为播放基准的命令:

ffplay test.mp4 -sync video

以系统时间戳为播放基准的命令:

ffplay test.mp4 -sync ext

刚才,我们已经知道 ffplay 可以播放音频原始数据 PCM 格式文件,那么 ffplay 可以播放视频原始数据 YUV 格式的视频文件吗?答案也是可以的,命令如下:

ffplay test.yuv -f rawvideo -pixel_format yuv420p -s 544*960

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/601790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea Maven 插件 项目多环境打包配置

背景 不同环境的配置文件不一样,打包方式也有差异 1. 准备配置文件 这里 local 为本地开发环境 可改为 dev 名称自定义 test 为测试环境 prod 为生产环境 根据项目业务自行定义 application.yml 配置: spring:profiles:#对应pom中的配置active: spring.…

二分图(染色法与匈牙利算法)

二分图当且仅当一个图中不含奇数环 1.染色法 简单来说,将顶点分成两类,边只存在于不同类顶点之间,同类顶点之间没有边。 e.g. 如果判断一个图是不是二分图? 开始对任意一未染色的顶点染色。 判断其相邻的顶点中,若未…

打造文旅客运标杆!吐鲁番国宾旅汽携苏州金龙升级国宾级出行体验

新疆,这片神秘的大地,从无垠沙漠到高耸天山,从古老丝路到繁华都市,处处都散发着独特的魅力,吸引着四面八方的游客。据新疆维吾尔自治区文化和旅游厅数据显示,刚刚过去的“五一”小长假,新疆全区…

5月白银现货最新行情走势

美联储5月的议息会议举行在即,但从联邦公开市场委员会(FOMC)近期透露的信息来看,降息似乎并没有迫切性。——美联储理事鲍曼认为通胀存在"上行风险",明尼阿波利斯联邦储备银行行长卡什卡利提出了今年不降息的…

算法学习:数组 vs 链表

🔥 个人主页:空白诗 文章目录 🎯 引言🛠️ 内存基础什么是内存❓内存的工作原理 🎯 📦 数组(Array)📖 什么是数组🌀 数组的存储📝 示例代码&#…

【Spark】 Spark核心概念、名词解释(五)

Spark核心概念 名词解释 1)ClusterManager:在Standalone(上述安装的模式,也就是依托于spark集群本身)模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器ResourceManager(国内s…

编程入门(六)【Linux系统基础操作三】

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 🔥前言🚀LInux的进程管理和磁盘管理top命令显示查看进…

SpringBoot整合Redis(文末送书)

文章目录 Redis介绍使用IDEA构建项目,同时引入对应依赖配置Redis添加Redis序列化方法心跳检测连接情况存取K-V字符串数据(ValueOperations)存取K-V对象数据(ValueOperations)存取hash数据(HashOperations&a…

2024年武汉市工业投资和技术改造及工业智能化改造专项资金申报补贴标准、条件程序和时间

一、申报政策类别 (一)投资和技改补贴。对符合申报条件的工业投资和技术改造项目,依据专项审计报告明确的项目建设有效期(最长不超过两年)内实际完成的生产性设备购置与改造投资的8%,给予最高不超过800万元专项资金支持。 (二)智能化改造补贴。对符合申报条件的智能化改造项目…

互联网产品为什么要搭建会员体系?

李诞曾经说过一句话:每个人都可以讲5分钟脱口秀。这句话换到会员体系里面同样适用,每个人都能聊点会员体系相关的东西。 比如会员体系属于用户运营的范畴,比如怎样用户分层,比如用户标签及CDP、会员积分、会员等级、会员权益和付…

鸿蒙通用组件弹窗简介

鸿蒙通用组件弹窗简介 弹窗----Toast引入ohos.promptAction模块通过点击按钮,模拟弹窗 警告对话框----AlertDialog列表弹窗----ActionSheet选择器弹窗自定义弹窗使用CustomDialog声明一个自定义弹窗在需要使用的地方声明自定义弹窗,完整代码 弹窗----Toa…

Seata之TCC 模式的使用

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能…

【python数据分析基础】—pandas透视表和交叉表

目录 前言一、pivot_table 透视表二、crosstab 交叉表三、实际应用 前言 透视表是excel和其他数据分析软件中一种常见的数据汇总工具。它是根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。 一、pivot_table 透视表 pivot_tabl…

风与水如何联合优化?基于混合遗传算法的风-水联合优化运行程序代码!

前言 为提高风电场的供电质量同时增加其发电效益,利用储能技术为风电场配置一个蓄能系统是比较重要的解决措施之一。风电的蓄能技术有水力蓄能、压缩空气蓄能、超导磁力蓄能、流体电池组、电解水制氢等,其中水力蓄能是技术较成熟的一种蓄能方式,且小型的…

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码,再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面,进入后会存下cookies值&…

项目经理【过程】概念

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 【人】绩效 【过程】概念 一、过程是什么 1.1 项目管理五大过程组 1.2 五大过程组之间的相互作用 1.3 项目阶段VS过…

《Linux运维总结:ARM架构CPU基于docker-compose一离线部署consul v1.18.1集群工具》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

【SpringBoot】-- 监听容器事件、Bean的前后置事件

目录 一、ApplicationContextInitializer 使用 1、自定义类,实现ApplicationContextInitializer接口 2、在META-INF/spring.factories配置文件中配置自定义类 二、ApplicationListener 使用 1、自定义类,实现ApplicationListener接口 2、在META-…

tensorboard子目录运行

tensorboard默认在根目录运行,浏览器访问127.0.0.1:6006打开界面。 如果想在子目录运行,那么可以这么执行 tensorboard --logdir ./logs --path_prefix/app/asd 然后浏览器既可以通过 http://localhost:6006/app/asd/来访问。​​​​​​ 但这么做遇…

HADOOP之YARN详解

目录 一、YARN的简介 1.1 MapReduce 1.x 1.1.1 MapReduce 1.x的角色 1.2 YARN的介绍 1.3 YARN的设计思想 二 YARN的配置 1. mapred-site.xml 2. yarn-site.xml ​编辑 3. hadoop-env.sh 4. 分发到其他节点 5.YARN的服务启停 6. 任务测试 三 YARN的历史日志 1. 历…
最新文章