# 基础命令
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。
# 命令分类
类别 |
---|
基本信息查询命令 |
录制命令 |
分解/复用命令 |
处理原始数据命令 |
裁剪与合并命令 |
图片/视频互转命令 |
直播相关命令 |
各种滤镜命令 |
# 查询
参数 | 说明 | 参数 | 说明 |
---|---|---|---|
-version | 显示版本 | -formats | 显示可用的格式 |
-demuxers | 显示可用的 demuxers | -protocols | 显示可用的协议 |
-muxers | 显示可用的 muxers | -fileters | 显示可用的过滤器 |
-devices | 显示可用的设备 | -pix_fmts | 显示可用的像素格式 |
-codes | 显示所用编解码器 | -sample_fmts | 显示可用的采样格式 |
-decoders | 显示所有的编辑器 | -layouts | 显示 channel 名称 |
-encoders | 显示所有的编码器 | -colors | 显示识别的颜色名称 |
-bsfs | 显示比特流 |
比如查看可用的设备列表:
ffmpeg -devices # 在 Mac 中的输出中会包含 avfoundation 数据输入设备
# 录制
屏幕画面录制:
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
- -f: 指定使用 avfoundation 采集数据
- -i: 指定输入来源,1 表示屏幕
- -r: 指定帧率
- out.yuv: 输出文件名称
播放录制结果:
ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv
- -s: 指定分辨率
- -pix-fmt: 解码的格式,默认为 yuv420p
- out.yuv: 指定播放文件名称
那么上面的指定屏幕从何而来呢?我们可以通过下面的命令查看 AVFoundation 所支持的设备列表:
ffmpeg -f avfoundation -list_devices true -i ""
# 以下是截取的部分输出,可见包括视频设备和音频设备,前者索引为 1 所指的就是录屏
# [AVFoundation indev @ 0x7fb1a5522180] AVFoundation video devices:
# [AVFoundation indev @ 0x7fb1a5522180] [0] FaceTime高清摄像头(内建)
# [AVFoundation indev @ 0x7fb1a5522180] [1] Capture screen 0
# [AVFoundation indev @ 0x7fb1a5522180] AVFoundation audio devices:
# [AVFoundation indev @ 0x7fb1a5522180] [0] MacBook Pro麦克风
音频录制:
ffmpeg -f avfoundation -i :0 out.wav
- -f: 指定使用 avfoundation 采集数据
- -i: 指定输入来源,:0 表示音频中的索引为 0 的设备,冒号可以和视频设备区别开
- out.wav: 输出文件名称
播放音频:
ffplay out.wav
# 分解和复用
多媒体格式转换:
ffmpeg -i input.mp4 -vcodec copy -acodec copy out.flv
- -i: 指定输入文件
- -vcodec: 视频编码处理方式,copy 表示直接复用,之前是什么编码就是什么
- -acodec: 音频编码处理方式
- out.flv: 输出文件
抽取视频:
ffmpeg -i input.mp4 -an -vcodec copy out.h264
- -an: 表示 audio not,即输出不包含音频
- out.h264: 输出视频文件,后缀为视频的编码
抽取音频:
ffmpeg -i input.mp4 -vn -acodec copy out.aac
- -vn: 表示 vedio not,即输出不包含视频
- out.aac: 输出的音频文件,后缀为音频的编码
# 处理原始数据
原始数据对于视频而言就是 YUV 数据,而音频则是 PCM 数据,它们没有经过任何编码。
提取 YUV 数据:
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
- -c✌️ 指定 rawvideo 为视频的编码方式
- -pix_fmt: 指定编码时的像素格式
对原生视频数据进行播放:
ffplay -f rawvideo -video_size 1280x720 -pix_fmt yuv420p out.yuv
- -f: 指定将视频转成原始数据
- -video-size: 指定分辨率
- -pix_fmt: 默认为 yuv420p,使用默认值则可省略
提取 PCM 数据:
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
- -ar: 表示 audio rate,音频的采样率
- -ac: 表示 audio channel,音频轨道
- -f: 数据存储格式为 s16le (signed 16 bits little endian, 有符号 16 位小端)
对原始音频进行播放:
# 和播放 YUV 数据一样,播放 PCM 也需要指定一些参数值
ffplay -ac 2 -ar 44100 -f s16le out.pcm
# 裁剪与合并
裁剪:
# 从第 10 秒开始截取 10 秒的视频分段
ffmpeg -i input.mp4 -ss 00:00:10 -t 10 fegment.ts
- -ss: 从什么时间点开始裁剪
- -t: 裁剪多久的时间
合并:
# 当期目录下包含 1.ts 和 2.ts 两个文件
# 在 inputs.txt 文件指定文件列表和就可以进行合并操作
$ cat inputs.txt
file '1.ts'
file '2.ts'
$ ffmpeg -f concat -i inputs.txt out.mp4
- -f concat: 表示对后面的文件进行合并
- -i inputs.txt: 指定了要拼接的内容,包含格式为
file '<filename>'
的文件列表
# 图片和视频互转
视频转图片:
ffmpeg -i input.mp4 -r 1 -f image2 image-%3d.jpeg
- -r: 指定转换图片的帧率,为 1 表示每秒转出一张图片
- -f: 指定转出图片的格式
- image-%3d.jpeg: 输出文件的名称,%3d 表示 3 位数字
图片转视频:
ffmpeg -i image-%3d.jpeg out.mp4
# 推流和拉流
直播推流:
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamName
- -re: 减慢帧率速度,保证和真实的帧率一致
- -c: 指定音视频的编解码,单独指定音频使用 -a,使用 -v 则可以单独为视频指定
- -f: 指定推出流的格式
- rtmp://server/live/streamName: 指定 rtmp 服务器的地址
直播拉流:
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
当然也可以对 HTTP 协议直播源进行处理,比如:
ffmpeg -i http://server/live/streamName -c copy dump.m3u8
对于 RTMP、RTSP、HTTP 视频协议直播流地址都可以使用 FFplay 直接进行播放。
# 滤镜命令
ffmpeg -i input.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
- -vf: 表示 video filter,指定 crop 作为视频的滤镜,同时指定一些参数(in_w-200: 宽度减去 200,in_h-200: 高度减去 200)
- -c🅰️ 指定音频的编码
滤镜 crop
的参数后面还可以指定起始的位置,格式为:out_w:out_h:x:y
,上面 in_w
表示视频的宽度,in_h
表示视频的高度。