FFmpeg是什么
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。
FFmpeg 功能
FFmpeg有非常强大的功能包括:视频采集、视频格式转化、视频截图、视频添加水印、视频切片(m3u8、ts)、视频录制、视频推流、更改音视频参数(编码方式、分辨率、码率、比特率等)功能,等等..
FFmpeg 的原理
整个过程基本可以说成:解复用 => 解码 => 编码 => 复用器。
FFmpeg主要构成
- ffmpeg——一个命令行工具,用来对视频文件转换格式,也支持对电视卡即时编码
- ffserver——一个HTTP多媒体即时广播流服务器,支持时光平移
- ffplay——一个简单的播放器,基于SDL与FFmpeg库
- libavcodec——包含全部FFmpeg音频/视频编解码库
- libavformat——包含demuxers和muxer库
- libavutil——包含一些工具库
- libpostproc——对于视频做前处理的库
- libswscale——对于视频作缩放的库
FFmpeg的关键结构体,按功能分类
解协议(http, rtsp, rtmp, mms)
AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。
解封装(flv, avi, rmvb, mp4, …)
AVFormatContext: Format I/O context, 主要存储视音频封装格式中包含的信息;
AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。
解码(h264, mpeg2, aac, mp3, …)
AVStream存储一个视频/音频流的相关数据;
每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;
每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。
存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket 存储压缩编码数据相关信息的结构体
解码后数据:AVFrame 位于frame.h,一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。
Mac 安装:
代码语言:javascript复制brew install ffmpeg
命令行语法:
代码语言:javascript复制ffmpeg[全局参数][输入文件参数]-i[输入文件][输出文件参数][输出文件]
FFmpeg常用参数
主要参数
-i 设定输入流
-f 设定输出格式
音频参数
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定则使用与输入流相同的编解码器
-an 不处理音频
视频参数
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定则使用与输入流相同的编解码器
命令使用例子:
1.查看视频信息
代码语言:javascript复制ffmpeg -i input.mp4
2.分辨率转换
代码语言:javascript复制ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4
3.帧率转换
代码语言:javascript复制ffmpeg -i input.mp4 -r 5 output.mp4
4.提取视频/音频
代码语言:javascript复制//提取视频
ffmpeg -i input.mp4 -an output.mp4
//提取音频
ffmpeg -i input.mp4 -vn output.mp3
5.可以获取当前视频所有帧包的时间和大小信息
代码语言:javascript复制ffprobe -show_packets input.mp4
我们还可以通过ffmpeg命令给视频添加滤镜,添加水印,添加字幕,或者对视频进行截取,压缩,推流等待操作,这里就不做一一介绍,有兴趣对读者可以深入去查看相关资料。