简介
FFmpeg 是一个*软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。
“FFmpeg”这个单词中的“FF”指的是“Fast Forward(快速前进)”。
https://zh.wikipedia.org/wiki/FFmpeg
MPEG正式审核程序是Moving Picture Experts Group的简称。这个名字本来的含义是指一个研究视频和音频编码标准的“动态图像专家组”组织,成立于1988年,致力开发视频、音频的压缩编码技术。现在我们所说的MPEG泛指由该小组制定的一系列视频编码标准正式审核程序。
https://zh.wikipedia.org/wiki/MPEG
https://ffmpeg.org/
安装
sudo apt install ffmpeg # ubuntu
brew install ffmpeg # mac
命令语法
ffmpeg [全局选项] {[输入文件选项] -i 输入_url_地址} ... {[输出文件选项] 输出_url_地址} ...
处理流程
查看信息
ffmpeg -i out.mp4
查看支持的yuv格式
ffmpeg -pix_fmts
Pixel formats:
I.... = Supported Input format for conversion
.O... = Supported Output format for conversion
..H.. = Hardware accelerated format
...P. = Paletted format
....B = Bitstream format
FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL
IO... yuv420p 3 12
IO... yuyv422 3 16
IO... rgb24 3 24
IO... bgr24 3 24
IO... yuv422p 3 16
IO... yuv444p 3 24
IO... yuv410p 3 9
IO... yuv411p 3 12
IO... gray 1 8
IO... 0bgr 3 24
IO... bgr0 3 24
-version 显示版本
-formats 显示可用的格式
-demuxers 显示可有的demuxers
-protocols 显示可用的协议
-muxers 显示可有的muxers
-filters 显示可用的过滤器
-devices 显示可用的设备
-pix_fmts 显示可用的像素格式
-codecs 显示所以编解码器
-sample_fmts 显示可用的采样格式
-decoders 显示可用的解码器
-layouts 显示channel名称
-encoders 显示可用的编码器
-colors 显示识别的颜色名称
-bsfs 显示比特流filter
录屏
ffmpeg -f x11grab -r 30 -s 1366x768 -i :0.0 out.yuv # ubuntu
-i:
[hostname]:display_number.screen_number[+x_offset,y_offset]
hostname:display_number.screen_number指定了要捕获的X11显示屏幕名,hostname可以省略则默认为"localhost"。环境变量DISPLAY可以指定默认显示名。x_offset,y_offset指定捕获偏移,是对于左上建立的X11屏幕,默认为0.
ffmpeg -f avfoundaton -i 1 -r 30 out.yuv # mac
ffmpeg -f avfoundation -list_devices true -i "" # mac
播放
ffplay -s 1366x768 -pix_fmt bgr0 out.yuv
支持分辨率列表
xrandr -q --current # xrandr -q --current | grep '*' | awk '{print$1}'
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 309mm x 173mm
1366x768 60.10*+
1360x768 59.80 59.96
1280x720 60.00 59.99 59.86 59.74
1024x768 60.04 60.00
800x600 60.00 60.32 56.25
640x480 60.00 59.94
640x400 59.88 59.98
640x360 59.86 59.83 59.84 59.32
480x270 59.63 59.82
400x300 60.32 56.34
320x240 60.05
360x202 59.51 59.13
320x180 59.84 59.32
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
录音
ffmpeg -f pulse -i default out.wav # -i alsa_input.pci-0000_00_1f.3.analog-stereo
播放
ffplay out.wav
声音源列表
pactl list sources short
0 alsa_output.pci-0000_00_1b.0.analog-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
1 alsa_input.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 48000Hz SUSPENDED
摄像头支持信息
ffplay -f video4linux2 -list_formats all /dev/video0
[video4linux2,v4l2 @ 0x7f55ac000b80] Raw : yuyv422 : YUYV 4:2:2 : 640x480 160x120 176x144 320x240 352x288 1280x720 1280x1024
摄像头显示
ffplay -f video4linux2 -video_size 640x480 /dev/video0 # -video_size hd480 -framerate 30
摄像头录像
ffmpeg -f video4linux2 -r 30 -s 640x480 -i /dev/video0 out2.yuv # ffplay -s 640x480 -pix_fmt yuyv422 out2.yuv
格式转换
ffmpeg -i out.mp4 out.flv # -vcodec copy -acodec copy
ffmpeg -i out.mp4 -qscale 0 out.flv # 无损转换
抽取音视频
ffmpeg -i out.mp4 -an out.h264 # -vcodec copy # ffplay out.h264
ffmpeg -i out.mp4 -vn out.aac # -acodec copy -ar 44100 -ac 2 -ab 320k
ffmpeg -i out.mp4 -vn out.mp3
-vn – 表明我们已经在输出文件中禁用视频录制。
-ar – 设置输出文件的音频频率。通常使用的值是22050 Hz、44100 Hz、48000 Hz。
-ac – 设置音频通道的数目。
-ab – 表明音频比特率。
-f – 输出文件格式。在我们的实例中,它是 mp3 格式。
抽取原始数据
ffmpeg -i out.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv # ffplay -s 640x480 out.yuv
ffmpeg -i out.mp4 -vn -ar 48000 -ac 2 -f s16le out.pcm # ffplay -ar 48000 -ac 2 -f s16le out.pcm
指定分辨率
ffmpeg -i out.mp4 -filter:v scale=320x240 -c:a copy tout.mp4
ffmpeg -i out.mp4 -s 320x240 -c:a copy tout.mp4
压缩音视频
ffmpeg -i out.mp4 -vf scale=640:-1 -c:v libx264 -preset veryslow -crf 24 yout.mp4 # -ac 2 -c:a aac -strict -2 -b:a 96k
ffmpeg -i out.mp3 -ab 96k yout.mp3
1. 96kbps
2. 112kbps
3. 128kbps
4. 160kbps
5. 192kbps
6. 256kbps
7. 320kbps
视频裁剪
尺寸
ffmpeg -i input.mp4 -filter:v crop=w:h:x:y output.mp4
-filter:v – 表示视频过滤器。 -vf
crop – 表示裁剪过滤器。
w – 我们想自源视频中裁剪的矩形的宽度。
h – 矩形的高度。
x – 我们想自源视频中裁剪的矩形的 x 坐标 。
y – 矩形的 y 坐标。
ffmpeg -i out.mp4 -vf crop=in_w-440:in_h-280 -c:v libx264 -c:a copy crop.mp4 # 640x480 => 200x200
ffmpeg -i out.mp4 -filter:v crop=200:200:0:0 crop2.mp4
长度
ffmpeg -i out2.mp4 -ss 00:00:00 -t 10 out2.ts # 66s => 10s
ffmpeg -i out2.mp4 -ss 00:00:00 -to 00:00:10 out3.ts # -c copy
-ss – 表示视频剪辑的开始时间。
-t – 表示总的持续时间。
-to – 表示视频剪辑的结束时间。
视频宽高比
ffmpeg -i out.mp4 -aspect 16:9 wh.mp4
16:9
4:3
16:10
5:4
视频合并
ffmpeg -f concat -i inputs.txt concat.mp4 # ffplay concat.mp4
# inputs.txt
file 'out1.ts'
file 'out2.ts'
视频字幕
ffmpeg -i out.mp4 -i demo.srt -c:s mov_text -c:v copy -c:a copy srt.mp4 # ffplay -vf subtitles=demo.srt srt.mp4
ffmpeg -i out.mp4 -vf subtitles=demo.srt srt2.mp4
ffmpeg -i srt.mp4 -map 0:s:0 srt.srt
调整播放速度
ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed.mp4
视频图片互转
ffmpeg -i ../out.mp4 -r 30 -f image2 image-%3d.jpeg
ffmpeg -i img/image-%3d.jpeg -r 30 imgm.mp4
-r – 设置帧速度。即,每秒提取帧到图像的数字。默认值是 25。
-f – 表示输出格式,即,在我们的实例中是图像。
image-%3d.png – 表明我们如何想命名提取的图像。在这个实例中,命名应该像这样image-001.png、image-002.png、image-003.png 等等开始。
视频直播
拉流
ffplay rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -c copy bbb.mov # ffplay bbb.mov
推流
sudo apt install nginx-full libnginx-mod-rtmp
rtmp_auto_push on;
rtmp {
server {
listen 1935;
application live {
live on;
}
}
}
ffmpeg -re -i out2.mp4 -c copy -f flv rtmp://localhost:1935/live/room
ffplay rtmp://localhost:1935/live/room
ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -c:a copy -c:v copy -f flv rtmp://localhost:1935/live/room
via: