本文目录
[[toc]]
常见命令
提取
mp3:ffmpeg -i 输入视频文件.mp4 -q:a 0 -map a 输出音频文件.mp3-i 输入视频文件.mp4: 指定输入的视频文件。-q:a 0: 指定音频质量, 0 表示最高质量。可以根据需要调整这个参数。-map a: 指定提取音频轨道, a 表示音频。输出音频文件.mp3: 输出文件保存为 MP3 格式。
提取
acc:ffmpeg -i 输入视频文件.mp4 -vn -acodec copy 输出音频文件.aac-vn:表示不包含视频轨道-acodec copy: 直接复制输入文件的音频流到输出文件,而不进行重新编解码
提取
wav:ffmpeg -i 输入视频文件.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 输出音频文件.wav-vn:表示不包含视频轨道-acodec pcm_s16le: 指定音频编码为 PCM , WAV 格式常用的编码方式。-ar 44100: 设置音频采样率为 44100 Hz 。-ac 2: 设置为双声道音频。输出音频文件.wav: 输出文件保存为 WAV 格式。
B 站移动端缓存视频合并 :
ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a copy output.mp4
FFmpeg 处理流程
- 将输入文件按文件格式解析为数据包
- 将数据包解码为原始数据
- 将原始数据编码
- 将编码后的数据包按文件格式输出
graph LR
input[输入文件]
output[输出文件]
encode[编码数据包]
decode[解码数据包]
data[解码后的数据帧]
input -->|demuxer| encode
encode -->|decoder| data
data -->|encoder| decode
decode -->|muxer| output命令分类
基本信息查询
-version: 显示版本-demuxers: 显示所有可用的demuxer,也就是支持解析什么格式-muxers: 显示所有可用的muxer,也就是支持转换成什么格式-devices: 显示可用的设备,用于数据采集、数据输入等-codecs: 显示所有可用的编码器、解码器-decoders: 显示所有可用的解码器-encoders: 显示所有可用的编码器-bsfs: 显示比特流 filter-formats: 显示可用的格式-protocols: 显示可用的协议-filters: 显示可用的过滤器-pix_fmts: 显示可用的像素格式-sample_fmts: 显示可用的采样格式-layouts: 显示 channel 名称-colors: 显示识别的颜色名称
录制
Windows: ffmpeg -f gdigrab -i desktop -f mp4 d:/out.mp4
-f: 采集什么格式的数据-i: 指定从哪里采集数据-s: 指定视频分辨率-r: 指定帧率-ac: 指定音频声道数1: 单声道2: 立体声6: 5.1 环绕声8: 7.1 环绕声
Window
常见输入格式:
dshow: DirectShow 格式,用于录制 Windows 上的摄像头、麦克风、屏幕、窗口等- 使用
ffmpeg -list_devices true -f dshow -i dummy命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的索引号或设备名称
- 使用
gdigrab: GDI 抓取输入格式,用于录制 Windows 上的屏幕或串口,可以选择特定窗口录制- 不需要设备索引,直接使用
-offset_x、-offset_y、-video_size等参数指定需要录制的屏幕区域或窗口标题即可
- 不需要设备索引,直接使用
vfwcap: 录制视频设备(如摄像头)的输入源- 使用
ffmpeg -list_devices true -f vfwcap -i dummy命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号
- 使用
Linux
v412: Video for linux 2 输入格式,用于录制视频设备,如 USB 摄像头- 使用
v4l2-ctl --list-devices命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号
- 使用
alsa: Advanced Linux Sound Architecture输入格式,用于录制 Linux 上的音频设备,如麦克风、扬声器- 不需要设备索引,直接使用
ffmpeg -f alsa -i default参数录制默认音频设备
- 不需要设备索引,直接使用
x11grab: X11 抓取输入格式,用于录制 X Window 系统上的屏幕或窗口- 不需要设备索引,直接使用
-offset_x、-offset_y、-video_size等参数指定需要录制的屏幕区域或窗口标题即可
- 不需要设备索引,直接使用
Mac
avfoundation: AVFoundation输入格式,用于录制Mac上的摄像头、麦克风、屏幕- 使用
ffmpeg -f avfoundation -list_devices true -i ""命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号
- 使用
qtkit: QuickTime Kit 输入格式,用于录制 Mac 上的摄像头、麦克风- 使用
ffmpeg -f qtkit -list_devices true -i ""命令列出可用的视频设备及其对应的名称和索引号,然后根据需要选择对应的设备名称或索引号
- 使用
分解、复用
例如: ffmpeg -i xxx.mov -vcodec copy -acodec copy xxx.mp4
-vn: 丢弃视频-vcodec: 针对视频进行什么操作copy: 复制视频数据
-an: 丢弃音频-acodec: 针对音频进行什么操作copy: 复制视频数据
处理原始数据
原始数据分为 音频数据( PCM ) 、 视频数据( YUV )
提取 PCM 数据
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
提取音频的时候需要指定音频采样率,也就是 -ar 44100 ,其中 a 代表 audio , r 代表 rate
-ac2 是指使用双声道, a 代表 audio , c 代表 channel
-f s16le 指提取出来的音频数据存储格式, s16le 指 signed 16 bits little endian ,即:有符号 16 位小端
提取出来的音频也是原始数据,播放的时候需要补充采样率、声道数等数据,例如: ffplay -ar 44100 -ac 2 -f s16le out.pcm
提取 YUV 数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
提取原始数据一定要指定像素格式,也就是 -pix_fmt yuv420p
抽取出来的视频是原始数据,播放时需要手动指定分辨率,比如: ffplay -s 1024 * 600 out.yuv
长度裁剪、合并
长度裁剪
示例: ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out.ts
-ss: 开始时间,格式为小时:分钟:秒-t: 视频长度,单位为 秒
合并
示例: ffmpeg -f concat -i inputs.txt out.flv
inputs.txt 格式为:
file '1.ts'
file '2.ts'图片、视频互转
视频转图片
示例: ffmpeg -i input.flv -r 1 -f image2 image-%3d.jpeg
-r 1: 帧率为 1 ,每一秒取一张图-f image2: 指定转为图片image-%3d.jpeg: 输出文件格式命名,%3d表示 3 位整数
图片转视频
示例: ffmpeg -i image-%3d.jpeg out.mp4
直播
推流
示例: ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
-re: 减慢帧率与速度,将帧率与速度与流同步
拉流
示例: ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
转流
示例: ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream
实时推流桌面
示例: ffmpeg -framerate 15 -f gdigrab -i desktop -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room
滤镜
将视频原有尺寸宽高裁剪 200px : ffmpeg -i input.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c"a copy out.mp4
-vf: 针对视频应用滤镜 crop: 滤镜名,用于裁剪 in_w: 视频宽度 in_h: 视频高度
裁剪滤镜格式为: crop=out_w:out_h:x:y
out_w: 最终视频宽度out_h: 最终视频高度x: 裁剪保留的中心点 x 坐标y: 裁剪保留的中心点 y 坐标