简要介绍
FFmpeg 介绍
- 音视频多媒体处理开源框架,采用LGPL或GPL许可证。
- 有音视频采集、编码、解码、转码、复用、解复用、音视频分离、合并、流化、过滤器等功能。
- 可在iOS、Android、Window、Linux、Mac上运行.
- 包含音频/视频编解码库libavcodec,具有非常高的可移植性和编解码质量。
FFmpeg 历史
- 2000年, 由法布里斯-贝拉(FabriceBellard)创建。
- 2004年, 迈克尔(Michael Niedermayer)接管。
- 2011年, Libav从FFmpeg分离。
主要的开发库
- libavutil: 包含一些公共的工具函数,包括随机数生成、数据结构、核心多媒体工具等。
- libavcodec: 用于各种类型声音/图像encode/decode编解码库。
- libavformat: 用于各种音视频封装格式(mp4/AVI/Flv等)的生成和解析muxer/demuxer,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能。
- libavdevice: 读取电脑(或者其他设备上)的多媒体设备的数据 或者输出数据到指定的多媒体设备上。
- libswresample: 用于音频采样采样数据(PCM)转换的库。
- libswscale: 用于视频场景比例缩放、色彩映射转换的库。
- libavfilter: 包含媒体滤波器的库。
主要的工具集:
- ffmpeg: 一个命令行工具,可用于格式转换、解码或电视卡即时编码等。
- ffsever: 一个 HTTP 、RTSP的实时广播流媒体服务器.
- ffplay: 是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示。
- ffprobe: 一个多媒体流分析工具。 它从多媒体流中收集信息 并且以人类和机器可读的形式打印出来。
FFmpeg 安装
- 先在安装Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 再用Homebrew 安装 ffmpeg
brew install ffmpeg
FFmpeg 处理音视频流程
- 要有输入文件: MP4/flv/mkv等具有封装格式的文件, 里边包含了音频/视频/字幕等很多数据。
- demuxer: 视音频分离器分离数据。(会得到一些编码数据包--压缩后的数据)
- decoder: 解码,等到解码后的数据帧。
- 自定义处理数据帧,比如视频720p转化为480p等。
- encoder: 压缩数据,得到另一种编码数据包。
- muxer: 视音频复用器封装音视频数据,得到指定格式的文件。(MP4/flv/mkv)
- 输出数据。
ffmpeg 命令
基本信息查询命令
- -version: 显示版本
- -demuxers : 显示可用的demuxers
- -muxers: 显示可用的muxers
- -devices: 显示可用的设备
- -codecs: 显示可用的编解码器
- -decoders: 显示所有的解码器
- -encoders: 显示所有的编码器
- -bsfs: 显示比特流filter
- -formats: 显示可用的格式
- -protocols: 显示可用的协议
- -filters: 显示可用的过滤器
- -pix_fmts: 显示可用的像素格式
- -sample_fmts:显示可用的采样格式
- -layouts: 显示channel名称
- -colors:显示识别的颜色名称
例如: ffmpeg -version
录制/播放命令
例 1:
ffmpeg -f avfoundation -i 1 -r 30 out.yuv (录制视频)
- -f: (-f avfoundation)指定使用Mac系统下的 avfoundation库采集数据,avfoundation是用作音视频处理的
- -i: 指定从哪采集数据,它是一个文件索引号。(-i0:是摄像头 -i1:是屏幕录制)
- -r: 指定帧率,fps,高清电影在60帧以上(-r60)
- out.yuv: 指定采集的yuv格式的数据,yuv是原始格式数据,没有任何压缩
- ffmpeg -f avfoundation -list_devices true -i "": 查询avfoundation下支持的设备列表
- control + c : 退出录制
例 2:
ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv (播放)
- ffplay out.yuv: 播放视频。(yuv是原始数据不知道视频大小,ffplay默认使用的像素格式yuv420p,如果使用例 1录制,录制默认是uyvy422格式,无法正常播放。)
- ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv: 播放( 例 1 录制可正常播放)。 -> (-s)指定尺寸大小,可以之前录制的日志中找到;(-pix_fmt) 指定录制的像素的格式
例 3:
ffmpeg -f avfoundation -i :0 out.wav (录制音频)
- ":" : ":"代表音频设备
- ffplay out.wav: 播放音频
例 4:
// (录制音视频同步。要录制flv格式的,mp4格式的音频录制不上)
ffmpeg -f avfoundation -i 1 -f avfoundation -i :0 -r 30 out2.flv
分解复用命令
例 1:
// (将test.mp4转换为test.flv)
ffmpeg -i test.mp4 -vcodec copy -acodec copy test.flv
- -i: 输入文件
- -vcodec copy: 视频编码处理方式为复制
- -acodec copy: 音频编码处理方式为复制
例 2:
// 只提取视频
ffmpeg -i test.mp4 -vcodec copy -an test.h264
- -an: (n:代表no)不要音频数据
例 3:
// 只提取音频
ffmpeg -i test.mp4 -acodec copy -vn test.aac
- -vn: (n:代表no)不要视频数据
处理原始数据命令
例 1:
// 提取原始视频yuv数据
ffmpeg -i test.mp4 -an -c:v rawvideo -pix_fmt yuv420p test.yuv
//播放yuv, 播放原始数据得告诉播放器数据格式类型
ffplay -s 540x960 test.yuv
- -c:v: 输出视频格式。(rawvideo -> 原始数据格式)
例 2:
// 提取原始音频pcm数据
ffmpeg -i test.mp4 -vn -ar 44100 -ac 2 -f s16le test.pcm
//播放pcm, 播放原始数据得告诉播放器数据格式类型
ffplay -ar 44100 -ac 2 -f s16le test.pcm
- -ar: 设定音频采样率(44100 -> 44k)
- -ac: 设定声音的Channel数(1单声道,2双声道,3:立体声)
- -f: 设定数据格式(s16le: s有正负,16:16位,le:little end)
- .pcm: 声音的原始数据
裁剪和合并命令
例 1:
// 裁剪前两秒
ffmpeg -i test.mp4 -ss 00:00:00 -t 2 test1.ts
// 截取后两秒
ffmpeg -i test.mp4 -ss 00:00:02 -t 2 test2.ts
- -ss: 指定开始时间 (00:00:02)
- -t: 指定持续时间(00:05)
例 2:
// 新建txt资源
touch resource.txt
// 编辑 resource.txt,并保存
file 'test1.ts'
file 'test2.ts'
// 使用 resource.txt和音视频文件拼接
ffmpeg -f concat -i resource.txt test3.mp4
- -f contat: 设定文件拼接
图片和视频互转命令
// 视频每1秒生成15张图片
ffmpeg -i test.mp4 -r 15 -f image2 image_%3d.jpeg
// 图片生成视频
ffmpeg -i image_%3d.jpeg test.mp4
- -r: 提取图像频率(用于视频截图)
- image2: 一种图片格式
直播类命令
// 推流
ffmpeg -re -i test.mp4 -c copy -f flv address(服务器地址)
// 拉流
ffmpeg -i address(直播流地址) -c copy test.mp4
- -re :以本地帧频读数据,避免获取的帧率比本地快,保持同步
滤镜命令
例 1:
// 裁剪滤镜
ffmpeg -i test.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy test1.mp4
- -vf: 设定视频滤镜
- -af: 设定音频滤镜
- -c:v: 设定视频编码器
- -c:a: 设置音频编码器