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.mzph.cn/bicheng/7978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年第九届数维杯数学建模B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

Ansible-playbook剧本

目录 一、Ansible playbook简介 2.1 playbook格式 2.2 playbook组成部分 二、playbook示例 2.1 yaml文件编写 2.2 运行playbook 2.3 定义、引用变量 2.4 指定远程主机sudo切换用户 ​编辑 2.5 when条件判断 ​编辑​编辑 2.6 迭代 ​编辑 ​编辑 三、总结 Ansib…

2023黑马头条.微服务项目.跟学笔记(五)

2023黑马头条.微服务项目.跟学笔记 五 延迟任务精准发布文章 1.文章定时发布2.延迟任务概述 2.1 什么是延迟任务2.2 技术对比 2.2.1 DelayQueue2.2.2 RabbitMQ实现延迟任务2.2.3 redis实现3.redis实现延迟任务4.延迟任务服务实现 4.1 搭建heima-leadnews-schedule模块4.2 数据库…

简单了解泛型

基本数据类型和对应的包装类 在Java中, 基本数据类型不是继承自Object, 为了在泛型代码中可以支持基本类型, Java给每个基本类型都对应了一个包装类型. 简单来说就是让基本数据类型也能面向对象.基本数据类型可以使用很多方法, 这就必须让它变成类. 基本数据类型对定的包装类…

sql注入练习

1.什么是SQL注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库 2.sql注入原理 攻击者注入一段包含注释符的SQL语…

能将图片转为WebP格式的WebP Server Go

本文完成于 2023 年 11 月 之前老苏介绍过 webp2jpg-online,可以将 webp 格式的图片,转为 jpg 等,今天介绍的 WebP Server Go 是将 jpg 等转为 webp 格式 文章传送门:多功能图片转换器webp2jpg-online 什么是 WebP ? WebP 它是由…

Vue 路由

单应用程序 SPA - Single Page Application 所有功能在一个html页面上实现 单页面应用 多用于 系统类网站/内部网站/文档类网站/移动端站点 多页面应用 多用于 公司官网/电商类网站 路由 单页面应用按需更新页面,需要明确访问路径和组件的对应关系 Vue中的路…

重学java 30.API 1.String字符串

于是,虚度的光阴换来了模糊 —— 24.5.8 一、String基础知识以及创建 1.String介绍 1.概述 String类代表字符串 2.特点 a.Java程序中的所有字符串字面值(如“abc”)都作为此类的实例(对象)实现 凡是带双引号的,都是String的对象 String s "abc&q…

修改ElTable组件的样式(element-plus)

效果展示 <div class"table_main"><ElTable:data"tableList":header-cell-style"{color: #ffffff,background: #6f7f93,}"class"table_border":highlight-current-row"false"><ElTableColumn type"inde…

CentOS 自建gitlab仓库:安装相关工具

所需环境 Node 安装项目依赖、项目打包运行Nginx 前端项目部署&#xff08;正向代理、反向代理、负载均衡等&#xff09;Git 自动化部署时 拉取代码使用GitLab 代码仓库GitLab-Runner GitLab的CI/CD执行器 一、安装Node 检测是否已安装 常用node -v 命令检测。 如果已安装&a…

为什么你的企业需要微信小程序?制作微信小程序有什么好处?

什么是小程序&#xff1f; WeChat小程序作为更大的WeChat生态系统中的子应用程序。它们就像更小、更基本的应用程序&#xff0c;在更大的应用程序&#xff08;WeChat&#xff09;中运行。这些程序为用户提供了额外的高级功能&#xff0c;以便在使用WeChat服务时加以利用。根据…

DeepSeek发布全新开源大模型,GPT-4级别能力 价格仅百分之一

最新国产开源MoE大模型&#xff0c;刚刚亮相就火了。 DeepSeek-V2性能达GPT-4级别&#xff0c;但开源、可免费商用、API价格仅为GPT-4-Turbo的百分之一。 因此一经发布&#xff0c;立马引发不小讨论。 从公布的性能指标来看&#xff0c;DeepSeek-V2的中文综合能力超越一众开源…

运维实施工程师之Linux服务器全套教程

一、Linux目录结构 1.1 基本介绍 Linux 的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 在 Linux 世界里&#xff0c;一切皆文件&#xff08;即使是一个硬件设备&#xff0c;也是使用文本来标…

校园论坛系统基于PHP的校园管理系统毕设校园好感度系统 校园文化建设系统APP小程序H5前后端源码交付支持二开,一次付款,终生使用

APP小程序H5前后端源码交付&#xff0c;支持二开&#xff0c;一次付款&#xff0c;终身使用&#xff0c;免费更新系统本身源码。 校园社交网络系统开发是一个复杂且综合性的项目&#xff0c;旨在为学生、教师和管理人员提供一个互动、分享和交流的平台。以下是一个关于校园社交…

Hive Bucketed Tables 分桶表

Hive Bucketed Tables 分桶表 1.分桶表概念 2.分桶规则 3.语法 4.分桶表的创建 5.分桶表的好处

工厂自动化升级改造(2)-RS485与Modbus通信协议

在工业控制、电力通信、智能仪表等领域,数据交换通常依赖于串口通信。最初,RS232接口是主流选择,然而,由于工业现场的复杂性,各种电气设备产生的电磁干扰可能导致信号传输错误。 RS232和RS485是两种不同的串行通信协议,它们在电气特性、传输距离和拓扑结构等方面有所不同…

LINUX 入门 6

LINUX 入门 6 day10 20240505 耗时&#xff1a;41min day10 20240506 耗时&#xff1a;155min 课程链接地址 第6章 DNS协议与请求 1 DNS协议分析与项目介绍 自己去看教程 快速扫了一下&#xff0c;还是结合实践去看概念有感觉 回答以下几个问题&#xff1a; dns作用dns分层…

信息安全-古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

网络安全的未来:挑战、策略与创新

引言&#xff1a; 在数字化时代&#xff0c;网络安全已成为个人和企业不可忽视的议题。随着网络攻击的日益频繁和复杂化&#xff0c;如何有效保护数据和隐私成为了一个全球性的挑战。 一、网络安全的现状与挑战 网络安全面临的挑战多种多样&#xff0c;包括但不限于恶意软件、…

学习通下载PDF资源

今天突然发现&#xff0c;学习通的pdf资源居然是没有下载入口的&#xff0c;这整的我想cv一下我的作业都搞不了&#xff0c;于是我一怒之下&#xff0c;怒了一下。 可以看到学习通的pdf资源是内嵌在网页的&#xff0c;阅读起来很不方便&#xff0c;虽然他内置了阅读器&#xf…