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

news2025/1/10 11:19:42

【导读】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.coloradmin.cn/o/1651387.html

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

相关文章

市场营销的酒店营销策略研究意义

在市场经济条件下,市场营销策略已成为企业经营管理中最重要的组成部分,其在企业管理中的地位日益显现出来。 然而,由于酒店营销环境的特殊性,酒店营销策略研究一直是咱们从业者研究的热点之一。 对于酒店营销策略的研究&#xf…

云计算技术发展趋势详解

云计算最全详解(图文全面总结) 云计算是技术趋势的未来,掌握它至关重要。从基础到高级,本文深入探讨云计算的方方面面,为您提供全面的理解。 云计算 云计算将计算转移到远程数据中心,让用户灵活、经济地访问资源。就像水电一样&…

【数据结构】闲谈A股实时交易的数据结构-队列

今天有点忙,特意早起,要不先写点什么。看到个股的红红绿绿, 突然兴起,要不写篇文章分析下A股交易的简易版数据结构。 在A股实时股票交易系统中,按照个人理解,大致会用队列来完成整个交易。队列(…

PyQt 入门

Qt hello - 专注于Qt的技术分享平台 Python体系下GUI框架也多了去了,PyQt算是比较受欢迎的一个。如果对Qt框架熟悉,那掌握这套框架是很简单的。 一,安装 1.PyQt5 pip3 install PyQt5 2.Designer UI工具 pip3 install PyQt5-tools 3.UI…

上位机图像处理和嵌入式模块部署(树莓派4b安装dockerros)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们讨论过树莓派4b安装ros的问题,当时的解决方案就是利用docker来安装ros。我们都知道,每一个ros版本都是和特定的ubu…

基于参数化建模的3D产品组态实现

我们最近为荷兰设计师家具制造商 KILO 发布了基于网络的 3D 配置器的第一个生产版本。我们使用了 Salsita 3D 配置器,这是一个内部 SDK,使新的 3D 配置器的实施变得轻而易举。虽然它给我们带来了巨大帮助,但我们仍然面临一些有趣的挑战。 NSD…

LINUX 入门 6

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

python网络爬虫学习——编写一个网络爬虫

参考资料:用Python写网络爬虫(第2版) 1、编写一个函数 (1)用于下载网页,且当下载网页发生错误时能及时报错。 # 导入库 import urllib.request from urllib.error import URLError,HTTPError,ContentTooS…

Shell编程规范和变量

一.Shell脚本概述 Shell脚本的概念 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shell脚本应用场景 重复性操作交互性任务批量事务处理服务运行状态监控定时任务执行 Shell的作用 1)介于系统内核与用…

《Fundamentals of Power Electronics》——隔离型CUK转换器、

以下是隔离型CUK转换器的相关知识点: Cuk电路的隔离型版本获得方式不同。基础非隔离型Cuk电路如下图所示。 将上图中电容C1分成两个串联的电容C1a和C1b,得到结果如下图所示。 在两个电容之间插入一个变压器,得到如下图所示电路。 变压器极性…

网络基础-默认网关

默认网关,又称缺省网关,缺省路由器;它是指在一个连接两个不同网络的设备,为网关设备;当主机需要发送数据包到另一个子网或者另一个网络时,它会首先检查目标地址是否在本地子网内;如果不在本地子…

Flask gevent启动报错UnicodeDecodeError

文章目录 环境代码报错Track解决思路 环境 acondana 24.1.2python 3.7.13 32bitflask 2.2.3gevent 21.8.0 代码 port 7236 logging.basicConfig(levellogging.INFO, # 控制台打印的日志级别filename./logs/app.log, # 将日志写入log_new.log文件中filemodea, # 模式&…

nodejs里面的 http 模块介绍和使用

Node.js的HTTP模块是一个核心模块,它提供了很多功能来创建HTTP服务器和发送HTTP请求。 http.Server是一个基于事件的http服务器,内部是由c实现的,接口是由JavaScript封装。 http.request是一个http客户端工具。 用户向服务器发送数据。 创…

Cordova 12 Android 不支持 http 原因探索

最近在升级 Cordova 到最新版本,升级完成后发现无法请求网络,研究了两次最终发现解决方案。 发现控制台中有日志输出,提示当前是 https ,无法直接访问 http。 [INFO:CONSOLE(225)] "Mixed Content: The page at https://lo…

怎么设置电脑开机后自动启动某个程序 ?(电脑如何设置自动运行?)

​在现今的信息化社会,电脑已经成为我们生活和工作中不可或缺的一部分。而一些特定的程序,如杀毒软件、系统优化工具等,我们可能希望它们在每次开机后都能自动启动,以便更好地保护和管理我们的电脑。那么,如何设置电脑…

白色或类白色的粉末/固体,DOTA-Ala-Ala-Tyr-COOH,是一种具有特定氨基酸序列的多肽,具有良好的稳定性和溶解性

一、试剂信息 英文名:DOTA-Ala-Ala-Tyr-COOH,DOTA-AAY-OHCAS号:N/A分子式:C31H47N7O12分子量:709.74结构式: 纯度标准:≥95%包装规格:1g,5g,10g&#xff08…

什么是HTTP/2?

HTTP/2(原名HTTP 2.0)即超文本传输协议第二版,使用于万维网。HTTP/2主要基于SPDY协议,通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措,来减少网络延迟,提高客户端的页面加载…

探索希尔排序算法:优雅而高效的增量排序

在计算机科学领域,排序算法是一项至关重要的技术,在各种应用场景中都扮演着重要角色。而希尔排序算法作为一种增量排序方法,在实际应用中展现了其优雅而高效的特性。本文将深入探讨希尔排序算法的原理、实现细节以及优化方法,带您…

free5gc+ueransim操作

启动free5gc容器 cd ~/free5gc-compose docker-compose up -d 记录虚拟网卡地址,eth0 ifconfig 查看并记录amf网元的ip地址 sudo docker inspect amf "IPAddress"那一行,后面记录的即是amf的ip地址 记录上述两个ip地址,完成UER…

C#高级编程笔记-泛型

本章的主要内容如下: ● 泛型概述 ● 创建泛型类 ● 泛型类的特性 ● 泛型接口 ● 泛型结构 ● 泛型方法 目录 1.1 泛型概述 1.1.1 性能 1.1.2 类型安全 1.1.3 二进制代码的重用 1.1.4 代码的扩展 1.1.5 命名…