FFmpeg学习笔记汇总

简介: FFmpeg学习笔记汇总

第1章 FFmpeg简介


1.1 FFmpeg定义


FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。


FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。


FFmpeg中的“FF”指的是“FastForward”(快进),曾经有人写信给FFmpeg的项目负责人,询问“FF”是不是代表“FastFreec”或者“FastFourier”的意思。FFmpeg中的“mpeg则是人们通常理解的Moving Picture Experts Group(动态图像专家组),FFmpeg是一个很全面的图像处理套件。其实从2000年发展至今,FFmpeg中的“FF”已经可以用各种组合进行理解,因为FFmpeg的强大足以支撑这些意义。


1.2 FFmpeg的基本组成



(1)FFmpeg的封装模块AVFormat


 AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装

FFmpeg基本组成模块MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。


FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行煤体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。


(2)FFmpeg的编解码模块AVCodec


AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x265编码器:MP3(mp3lame)编码,需要使用libmp3lame编码器。如果


(3)FFmpeg的滤镜模块AVFilter


AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。



  • 相同的Filter线性链之间用逗号分隔


  • 不同的Filter线性链之间用分号分隔


(4)FFmpeg的视频图像转换计算模块swscale


swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420P转换成YUYV,或者YUV转RGB等图像格式转换。



(5)FFmpeg的音频转换计算模块swresample


swresample模块提供了高级别的音频重采样API。例如它允许操作音频采样、音频通道布局转换与布局调整。


1.3FFmpeg的编解码工具ffmpeg


fmpeg是FFmpeg源代码编译后生成的一个可执行程序,其可以作为命令行工具使用。


fmpeg的主要工作流程相对比较简单,具体如下。


1)解封装(Demuxing)。


2)解码(Decoding)。


3)编码(Encoding)。


4)封装(Muxing)。


其中需要经过6个步骤,具体如下。


1)读取输人源。


2)进行音视频的解封装。


3)解码每一帧音视频数据


4)编码每一帧音视频数据。


5)进行音视频的重新封装。


6)输出到目标。



1.4 FFmpeg的播放器fplay


FFmpeg不但可以提供转码、转封装等功能,同时还提供了播放器相关功能,使用FFmpeg的avformat与avcodec,可以播放各种媒体文件或者流。如果想要使用fplay,那么系统首先需要有SDL来进行fplay的基础支撑。


fplay是FFmpeg源代码编译后生成的另一个可执行程序,与fmpeg在FFmpeg项目中充当的角色基本相同,可以作为测试工具进行使用,fplay提供了音视频显示和播放相关的图像信息、音频的波形信息等。


注意:


有时通过源代码编译生成fplay不一定能够成功,因为mplay在旧版本时依赖于SDL-1.2,而fplay在新版本时依赖于SDL-2.0,需要安装对应的SDL才能生成flaya


1.5 FFmpeg的多媒体分析器ffprobe


ffprobe也是FFmpeg源码编译后生成的一个可执行程序。ffprobe是一个非常强大的多媒体分析工具,可以从媒体文件或者媒体流中获得你想要了解的媒体信息,比如音频的参数、视频的参数、媒体容器的参数信息等。


例如它可以帮助分析某个媒体容器中的音频是什么编码格式、视频是什么编码格式,同时还可以得到媒体文件中媒体的总时长、复合码率等信息。


使用fprobe可以分析媒体文件中每个包的长度、包的类型、顿的信息等


1.6 FFmpeg编译


FFmpeg在官方网站中提供了已经编译好的可执行文件。因为FFmpeg是开源的,所以也可以根据自己的需要进行手动编译。FFmpeg官方建议用户自行编译使用FFmpeg的最新版本,因为对于一些操作系统,比如Linux系统(无论是Ubuntu还是RedHat),如果使用系统提供的软件库安装fimpeg时会发现其版本相对比较老旧,比如使用apt-getinstall fmpeg或者yuminstallfmpeg安装fmpeg,那么默认支持的版本都很老,有些新的功能并不支持,如一些新的封装格式或者通信协议。


1.7FFmpeg编码支持与定制


FFmpeg本身支持一些音视频编码格式、文件封装格式与流媒体传输协议,但是支持的数量依然有限,FFmpeg所做的只是提供一套基础的框架,所有的编码格式、文件封装格式与流媒体协议均可以作为FFmpeg的一个模块挂载在FFmpeg框架中。这些模块以第三方的外部库的方式提供支持,可以通过FFmpeg源码的configure命令查看FFmpeg所支持的音视频编码格式、文件封装格式与流媒体传输协议,对于FFmpeg不支持的格式,可以通过configure--help查看所需要的第三方外部库,然后通过增加对应的编译参数选项进行支持。


configure--help


二.FFmpeg工具使用基础


FFmpeg中常用的工具主要是fimpeg、fprobe、ffplay,它们分别用作多媒体的编解码工具、内容分析工具和播放器。


  1. fpeg主要用于音视频编解码


  1. ffprobe主要用于音视频内容分析


  1. fplay主要用于音视频播放、可视化分析


2.1 fmpeg常用命令


fmpeg在做音视频编解码时非常方便,所以在很多场景下转码使用的是fmpeg,通过ffmpeg--help可以看到fmpeg常见的命令大概分为6个部分,具体如下。


  1. ffmpeg信息查询部分


  1. 公共操作参数部分


  1. 文件主要操作参数部分


  1. 视频操作参数部分


  1. 音频操作参数部分


  1. 字幕操作参数部分


通过ffmpeg--help查看到的help信息是fmpeg命令的基础信息,如果想获得高级参数部分,那么可以通过使用ffmpeg --help long参数来查看,如果希望获得全部的帮助信息,那么可以通过使用ffmpegg --help full参数来获得。


看fmpeg的版本,包括子模块的详细版本信息,如libavformat、libavcodec、libavutil、libavfilter、libswscale、libswresample的版本。


ffmpeg --help long
ffmpegg --help ful


2.2ffprobe常用命令


在FFmpeg套件中,除了fmpeg作为多媒体处理工具之外,还有ffprobe多媒体信息查看工具,ffprobe主要用来查看多媒体文件的信息.


fprobe常用的参数比较多,可以通过fprobe--help来查看详细的帮助信息。


fprobe--help


使用fprobe-showpacketsinput.flv查看多媒体数据包信息:



通过showpackets查看的多媒体数据包信息使用PACKET标签括起来,其中包含的信息主要如表


字段 说明
.codec_type 多媒体类型,如视频包、音频包等
Stream index 多媒体的stream索引
PIS 多媒体的显示时间值
pIs_time 根据不同格式计算过后的多媒体的显示时间
dts 多媒体解码时间值
dts time 根据不同格式计算过后的多媒体解码时间
duration 多媒体包占用的时间值
duration timc 根据不同格式计算过后的多媒体包所占用的时间值
size 多媒体包的大小
pos 多媒体包所在的文件偏移位置
flags 多媒体包标记,如关键包与非关键包的标记


除了packets与data之外,ffprobe还可以分析多媒体的封装格式,通过ffprobe-show_formatoutput.mp4命令可以查看多媒体的封装格式,其使用FORMAT标签括起来显示:



下面对输出信息关键字段进行说明,具体见表


字段 说明
filename 文件名
nb streams 媒体中包含的流的个数
nbprograms 节目数(相关的概念在2.3节中会有详细的介绍)
format name 使用的封装模块的名称
format long name 封装的完整名称
start time 媒体文件的起始时间
duration 媒体文件的总时间长度
size 媒体文件的大小
bit rate 媒体文件的码率


相关文章
|
30天前
|
应用服务中间件 Linux nginx
FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作
这篇博客介绍了如何使用FFmpeg实现RTSP推流到RTMP服务器,并使用ffplay进行拉流操作,包括在Windows和Linux系统下的命令示例,以及如何通过HTML页面显示视频流。
335 0
|
Windows 计算机视觉 安全
流媒体技术学习笔记之(十三)Windows安装FFmpeg
一、下载地址: 网址:https://ffmpeg.org/ 选择Windows版本:https://ffmpeg.org/download.html#build-windows 二、解压安装: 下载并解压FFmpeg文件夹,它会生成一个类似名为“ffmpeg-20150504-git-eb9fb50-win32-static”的新文件夹:   打开你想安装的任意磁盘,例如:d盘。
3287 0
|
29天前
|
缓存 并行计算 Ubuntu
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
58 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
27天前
|
计算机视觉 Python
FFMPEG学习笔记(一): 提取视频的纯音频及无声视频
本文介绍了如何使用FFmpeg工具从视频中提取纯音频和无声视频。提供了具体的命令行操作,例如使用`ffmpeg -i input.mp4 -vn -c:a libmp3lame output.mp3`来提取音频,以及`ffmpeg -i input.mp4 -c:v copy -an output.mp4`来提取无声视频。此外,还包含了一个Python脚本,用于批量处理视频文件,自动提取音频和生成无声视频。
37 1
|
30天前
|
存储 编解码 网络协议
FFmpeg学习笔记(三):FFmpeg和FFplay参数介绍
这篇文章是关于FFmpeg和FFplay参数的介绍,包括如何使用这些参数进行视频流的捕获、处理和播放。
48 0
|
30天前
FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频
这篇博客主要介绍了如何使用FFmpeg进行多线程RTSP推流和ffplay拉流操作,以及如何将视频流保存为多路AVI格式的视频文件。
145 0
|
应用服务中间件 nginx
流媒体技术学习笔记之(十四)FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务
FFmpeg推送视频流,Nginx RTMP模块转发,VLC播放器播放,实现整个RTMP直播 查看本机电脑的设备 ffmpeg -list_devices true -f dshow -i dummy 红色标记表示视频设备和麦克风设备 看到乱码了吧!来这里查看哦   FFmpeg编码推送到R...
3488 0
|
编解码 文件存储 iOS开发
FFmpeg学习笔记汇总(下)
FFmpeg学习笔记汇总
|
编解码 网络协议 Windows
|
编解码 网络协议 C语言