命令分类

处理音视频的流程

基本信息查询命令

录制命令
录制屏幕
            
            
              shell
              
              
            
          
          ffmpeg -f avfoundation -i 1 -r 30 out.yuv
        
ctrl+c结束
使用ffplay进行播放
            
            
              shell
              
              
            
          
          # ffplay旧版本的写法
ffplay -s 2880x1800 -pix_fmt uyvy422 out.yuv
# ffplay7.0的写法
ffplay -f rawvideo -video_size 2880x1800 -pixel_format uyvy422 out.yuv
        为什么上述ffmpeg录制的时候-i可以指定为1呢?
执行ffmpeg -f avfoundation -list_devices true -i ""可以看到avfoundation支持的设备:

录制声音
            
            
              shell
              
              
            
          
          ffmpeg -f avfoundation -i :0 out.wav
        :0表示音频设备
分解与复用命令

多媒体格式转换
            
            
              shell
              
              
            
          
          # 格式转换,保留音视频
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
# 去掉音频
ffmpeg -i out.mp4 -an -vcodec copy out.h264
        处理原始数据命令
提取YUV数据
            
            
              shell
              
              
            
          
          ffmpeg -i out.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
        提取PCM数据
            
            
              shell
              
              
            
          
          # 采样率rate为44100 声道channel为2
ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
        播放pcm数据,由于pcm是裸流,需要指定采样率声道等信息
            
            
              shell
              
              
            
          
          # 旧版ffmpeg
ffplay -ar 44100 -ac 2 -f s16le out.pcm
# ffplay7.0
ffplay -f s16le -ar 44100 -ch_layout stereo out.pcm
        新版的ffmpeg中,用channel的layout布局来表示数量以及位置
常见 channel_layout 值一览
| 值 | 声道数 | 组成 | 说明 | 
|---|---|---|---|
mono | 
1 | C(中置) | 常见于语音、讲解 | 
stereo | 
2 | L + R | 左右声道,最常用 | 
2.1 | 
3 | L + R + LFE(低频) | 加了一个重低音 | 
3.0 | 
3 | L + R + C | 三声道(左、右、中) | 
4.0 | 
4 | L + R + C + S(环绕) | 简易环绕布局 | 
5.0 | 
5 | L + R + C + LS + RS | 正常 5 声道系统(无低音) | 
5.1 | 
6 | L + R + C + LFE + LS + RS | 最常见家庭影院布局 | 
6.1 | 
7 | L + R + C + LFE + LS + RS + RC | 带后中置的 6.1 | 
7.1 | 
8 | L + R + C + LFE + LS + RS + LB + RB | 多用于影院与游戏 | 
quad | 
4 | L + R + LS + RS | 早期四声道 | 
hexagonal | 
6 | L + R + C + LFE + LS + RS | 等同于 5.1 | 
octagonal | 
8 | 环绕布局 | 影院音效或高端 VR | 
声道英文简写含义对照表
| 缩写 | 含义 | 
|---|---|
| L | Left(左) | 
| R | Right(右) | 
| C | Center(中置) | 
| LFE | Low Freq Effects(低频/重低音) | 
| LS | Left Surround(左环绕) | 
| RS | Right Surround(右环绕) | 
| LB | Left Back(左后) | 
| RB | Right Back(右后) | 
| RC | Rear Center(后中置) | 
| TFL | Top Front Left(上前左)等(3D 声道扩展) | 
滤镜命令

            
            
              shell
              
              
            
          
          # 裁剪视频 保留音频
ffmpeg -i out.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy crop.mp4
        裁剪与合并命令
裁剪
            
            
              shell
              
              
            
          
          # 先解码再截取(精确)
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 1.ts
# 先seek到某个位置再截取,快速但不精确
ffmpeg -ss 00:00:10 -i out.mp4 -t 10 1.ts
# 先seek到8秒位置的关键帧,再解码,然后解码2秒后,再开始截取,双重-ss保证快速和精确
ffmpeg -ss 00:00:08 -i out.mp4  -ss 00:00:02 -t 10 1.ts
        -ss表示从第几秒开始截,
- 如果
-ss指定的开始时间超过输入文件的视频时长,则直接报错; - 假设
-ss指定的时间点是非关键帧,- 若
-ss在-i前面,则先seek到关键帧,再往下读取,所以可能会有偏差,因为这是不解码的操作,相当于ffmpeg认为要快速seek到那个位置,而不是要精确 - 若
-ss在-i后面,则从0解码,精确但是解码时间长 
 - 若
 
-t表示截取的时长,如果-t指定的时间超过视频时长,则尽可能截取
合并

            
            
              shell
              
              
            
          
          ffmpeg -f concat -i input.txt concat.mp4
        图片与视频互转命令
            
            
              shell
              
              
            
          
          # 视频转图片
ffmpeg -i out.mp4 -r 1 -f image2 image-%3d.jpeg
# -r 表示每秒取一帧
# 图片转视频
ffmpeg -i image-%3d.jpeg image.mp4
        直播推/拉流命令
            
            
              shell
              
              
            
          
          # 推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
# 拉流
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv