FFmpeg-CheatSheet

FFmpeg CheatSheet

基础使用

FFmpeg 可以使用下面的参数进行基本信息查询。例如,想查询一下现在使用的 FFmpeg 都支持哪些 filter,就可以用 ffmpeg -filters 来查询。详细参数说明如下:

命令

作用

ffmpeg -version

显示版本

-formats

显示可用的格式(包括设备)

-demuxers

显示可用的 demuxers

-muxers

显示可用的 muxers

-devices

显示可用的设备

-codecs

显示已知的所有编解码器

-decoders

显示可用的解码器

-encoders

显示所有可用的编码器

-bsfs

显示可用的比特流 filter

-protocols

显示可用的协议

-filters

显示可用的过滤器

-pix_fmts

显示可用的像素格式

-sample_fmts

显示可用的采样格式

-layouts

显示 channel 名称和标准 channel 布局

-colors

显示识别的颜色名称

参数

# Common switches
-codecs # list codecs
-c:v # video codec (-vcodec): 'copy' to copy stream
-c:a # audio codec (-acodec)
-fs SIZE # limit file size (bytes)
# Audio
-aq QUALITY # audio quality (codec-specific)
-ar 44100 # audio sample rate (hz)
-ac 1 # audio channels (1=mono, 2=stereo)
-an # no audio
-vol N # volume (256=normal)
# Bitrate
-b:v 1M # video bitrate (1M = 1Mbit/s)
-b:a 1M # audio bitrate
# Video
-aspect RATIO # aspect ratio (4:3, 16:9, or 1.25)
-r RATE # frame rate per sec
-s WIDTHxHEIGHT # frame size
-vn # no video

录制

# 查找设备名
## Windows
$ ffmpeg -list_devices true -f dshow -i dummy
## MAC
$ ffmpeg -f avfoundation -list_devices true -i ""

Windows

$ ffmpeg -f dshow -i video="Virtual-Camera" -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -f mpegts udp://10.1.0.102:1234
$ ffmpeg -f dshow -i video="screen-capture-recorder":audio="Stereo Mix (IDT High Definition" \
-vcodec libx264 -preset ultrafast -tune zerolatency -r 10 -async 1 -acodec libmp3lame -ab 24k -ar 22050 -bsf:v h264_mp4toannexb \
-maxrate 750k -bufsize 3000k -f mpegts udp://192.168.5.215:48550
  • -f fshow: windows system drivers for capturing video and audio

  • -f v4l2: linux system drivers for capturing video

  • -f alsa: linux system drivers for capturing audio

  • -i: ffmpeg option that defines input

  • -vcodec libx264: raw video from camera will be encoded using H264 video codec

  • -r 10: video FPS (frames per second)

  • -b:v 512k: video bitrate Kb/s (kilo bits per second)

  • -s 640x360: video width and height

  • -acodec aac: raw audio from microphone will be encoded using AAC audio codec

  • -ac 2: 2 audio channels (stereo)

  • -ab 32k: audio bitrate in Kb/s

  • -ar 44100: audio sampling rate 44.1 KHz

  • -f mpegts: video and audio will be packed into MPEG transport stream (MPEG TS)

  • udp://192.168.1.4:5000: MPEG transport stream is sent via UDP protocol to computer with IP address 192.168.1.4 on IP port 5000.

$ ffmpeg -y -loglevel warning -f dshow -i video="screen-capture-recorder" -vf crop=690:388:136:0 -r 30 -s 962x388 -threads 2 -vcodec libx264 -vpre baseline -vpre my_ffpreset -f flv rtmp:///live/myStream.sdp
# 输出为 MP4
$ ffmpeg -f dshow -rtbufsize 1000000k -s 640×480 -r 30 -i video=”1714-INOGENI 4K2USB3″ -an -c:v libx264 -q 0 -f h264 – | ffmpeg -f h264 -i – -an -c:v copy -f mp4 file.mp4 -an -c:v copy -f h264 pipe:play | ffplay -i pipe:play

屏幕录制:

# 屏幕录制并保存成文件
$ ffmpeg -f gdigrab -i desktop eguid.mp4
# 屏幕录制并推流
$ ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://eguid.cc:1935/rtmp/destop
# 视频文件推流
$ ffmpeg -re -i eguid.flv -vcodec copy -acodec copy -f flv -y rtmp://eguid.cc:1935/rtmp/eguid
# 转流(rtsp转rtmp为例)
$ ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -rtsp_transport tcp -vcodec h264 -acodec aac -f flv rtmp://eguid.cc:1935/rtmp/eguid
# 拉流
- ffmpeg -i rtmp://eguid.cc:1935/rtmp/eguid -vcodec h264 -f flv -acodec aac -ac 2 eguid.flv

Mac

# 录屏+声音
$ ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-f 指定使用 avfoundation 采集数据。
-i 指定从哪儿采集数据,它是一个文件索引号。在我的MAC上,1代表桌面(可以通过上面的命令查询设备索引号)。
-r 指定帧率。按ffmpeg官方文档说-r与-framerate作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r用于限制输出。
# 录视频
$ ffmpeg -f avfoundation -i 1:0 -r 29.97 -c:v libx264 -crf 0 -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k out.flv
-i 1:0 冒号前面的 “1” 代表的屏幕索引号。冒号后面的"0"代表的声音索相号。
-c:v 与参数 -vcodec 一样,表示视频编码器。c 是 codec 的缩写,v 是video的缩写。
-crf 是 x264 的参数。0 表式无损压缩。
-c:a 与参数 -acodec 一样,表示音频编码器。
-profile 是 fdk_aac 的参数。aac_he_v2 表式使用 AAC_HE v2 压缩数据。
-b:a 指定音频码率。b 是 bitrate的缩写, a是 audio的缩与。
# 录音
$ ffmpeg -f avfoundation -i :0 out.wav
# 录制音频裸数据
$ ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm
#! /bin/bash
#
# Diffusion bilibili live avec ffmpeg
# Make sure you have FFmpeg installed in your mac
# list avfoundation devices
ffmpeg -f avfoundation -list_devices true -i ""
# change the param after `-i` and `-f flv`
# use 140m mermory
ffmpeg \
-f avfoundation \
-re -i "2" \
-vcodec libx264 \
-preset ultrafast \
-acodec aac \
-ar 44100 \
-ac 1 \
-f flv "rtmp://example.com/path?key=xx"
# 560m mermory 90% cpu
ffmpeg \
-f avfoundation \
-video_size 1920x1080 \
-framerate 30 \
-i "2:0" -ac 2 \
-vcodec libx264 -maxrate 2000k \
-bufsize 2000k -acodec libmp3lame -ar 44100 -b:a 128k \
-f flv "rtmp://example.com/path?key=xx"

其他直播

  • 推流: ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName

  • 拉流保存: 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 avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room

视频处理

$ ffmpeg -framerate 1 -pattern_type glob -i '*.bmp' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

视频联接

:: Create File List
echo file file1.mp4 > mylist.txt
echo file file2.mp4 >> mylist.txt
echo file file3.mp4 >> mylist.txt
# Windows 下视频连接
:: Concatenate Files
$ ffmpeg -f concat -i mylist.txt -c copy output.mp4
:: Create File List
for %%i in (*.mp4) do echo file '%%i'>> mylist.txt
:: Concatenate Files
$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
$ ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[0:v]scale=320:240[a];[a]pad=640:240[b];[b][1:v]overlay=320:0[out]" -map "[out]" -movflags faststart -map 1:a c.mp4

分解/复用

  • 抽取音频流

ffmpeg -i input.mp4 -acodec copy -vn out.aac

acodec: 指定音频编码器,copy 指明只拷贝,不做编解码。 vn: v 代表视频,n 代表 no 也就是无视频的意思。

  • 抽取视频流

ffmpeg -i input.mp4 -vcodec copy -an out.h264

vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。 an: a 代表视频,n 代表 no 也就是无音频的意思。

  • 转格式

ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv

上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了 flv。

  • 音视频合并

ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4

格式转换与压缩

$ ffmpeg -i in.mp4 out.avi
$ ffmpeg -i foo.mp3 -ac 1 -ab 128000 -f mp4 -acodec libfaac -y target.m4r
# no audio
ffmpeg -i input.mov -vcodec h264 -an -strict -2 output.mp4
ffmpeg -i input.mov -vcodec libvpx -an output.webm
ffmpeg -i input.mov -vcodec h264 -acodec aac -strict -2 output.mp4
ffmpeg -i input.mov -vcodec libvpx -acodec libvorbis output.webm
<video width="320" height="240" controls>
<source src="movie.mp4" type='video/mp4'></source>
<source src="movie.webm" type='video/ogg'></source>
</video>
  • 视频缩小一倍

$ ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4

-vf scale 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。-1 表示高度随宽度一起变化。

  • 视频裁剪

$ ffmpeg -i VR.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4

crop 格式:crop=out_w:out_h: x :y

  • out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。

  • out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。

  • x : X 坐标

  • y : Y 坐标

  • 倍速播放

$ ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4
  • -filter_complex 复杂滤镜,[0:v]表示第一个(文件索引号是 0)文件的视频作为输入。setpts=0.5*PTS 表示每帧视频的 pts 时间戳都乘 0.5,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。

  • map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map 的用法是将复杂滤镜输出的视频和音频输出到指定文件中。

图/视互转

  • 视频转 JPEGffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg

  • 视频转 gifffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif

  • 图片转视频ffmpeg -f image2 -i image-%3d.jpeg images.mp4

对称视频与画中画

  • 对称视频:$ ffmpeg -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4

  • 画中画:ffmpeg -i out.mp4 -i out1.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart new.mp4

  • 录制画中画:ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[a];[0:v][a]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart -map 1:a b.mp4

处理原始数据

  • 提取 YUV 数据

ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv ffplay -s wxh out.yuv

-c:v rawvideo 指定将视频转成原始数据 -pixel_format yuv420p 指定转换格式为 yuv420p

  • YUV 转 H264

ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264

  • 提取 PCM 数据

ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm ffplay -ar 44100 -ac 2 -f s16le -i out.pcm

滤镜

在编码之前,ffmpeg 可以使用 libavfilter 库中的过滤器处理原始音频和视频帧。几个链式过滤器形成一个过滤器图形。ffmpeg 区分两种类型的过滤器图形:简单和复杂。

水印

  • 添加水印

ffmpeg -i out.mp4 -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4

-vf 中的 movie 指定 logo 位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。

  • 滤镜加水印

ffmpeg -i killer.mp4 -filter_complex "movie=./logo/daka.png,scale=64:48[w];[0:v]curves=vintage[o];[o][w]overlay=30:10[out]" -map "[out]" -map 0:a test1.mp4

  • 删除水印

先通过 ffplay 找到要删除 LOGO 的位置。

$ ffplay -i test.flv -vf delogo=x=806:y=20:w=70:h=80:show=1

使用 delogo 滤镜删除 LOGO。

$ ffmpeg -i test.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv