FFmpeg的命令非常多,经常看着会云里雾里的,个人认为没必要去硬背,只要打开Terminal,输入ffmpeg -help
命令,这条命令会告述你FFmpeg支持的大部分常用命令以及使用方式。查看这些输出的信息,基本上就会使用很多常用的命令了。
你会发现执行ffmpeg -help
会输出一大坨,那都是些啥玩意呢,不着急,咱们一步一步来慢慢品尝。
ffmpeg version 4.1.4 ...
第一个就是输出我们安装的FFmpeg的版本号
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1.4_1
--enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-12.0.1.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-12.0.1.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr
--prefix
是指FFmpeg的安装路径
--enable
是你安装的FFmpeg支持的三方库 这里可以看出支持libx264
、libx265
的编码,以及支持videotoolbox
,videotoolbox
是Mac、iOS上的一个系统自带硬编解码库,FFmpeg也给予了支持,非常的给力。
libavutil //工具库
libavcodec //编解码库
libavformat //解协议、解封装库
libavdevice //设备库
libavfilter //滤镜库
libavresample
libswscale
libswresample
libpostproc
这是输出FFmpeg里面包含的库,这些都是独立的,是可以单独拎出来使用的,你如果只要编解码,那你就只要在项目中导入libavcodec
即可
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
这是告诉我们命令行使用格式
[options]
这个是全局参数
[infile options]
这个是输入文件的参数
infile
这个是输入文件的路径
[outfile options]
这个是输出文件的参数
outfile
这个是输出文件的路径
细心的你肯定发现infile
、outfile
的后面有个...
,这是在告诉我们输入、输出文件可以分别有一个或者多个。
比如执行ffmpeg -i test.h264 -i test.aac -c copy test.mp4
这条命令会把一个h264文件和一个aac的音频文件合并并输出一个mp4格式的文件,这其中就有两个输入文件、一个输出文件。
Getting help:
-h -- print basic options
-h long -- print more options
-h full -- print all options (including all format and codec specific options, very long)
-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf
See man ffmpeg for detailed description of the options.
这些是详细的帮助信息
-h long
打印更多的选项参数。
-h full
打印所有的选项参数,包括所有针对于format
和codec
的选项,信息特别的长。
man ffmpeg
: 查看FFmpeg的帮助手册。
-h type=name
打印指定名称的decoder/encoder/demuxer/muxer/filter
的所有选项信息。
比如你要查询scale
滤镜的使用方式,我们就执行ffmpeg -h filter=scale
输出如下:
scale AVOptions:
w <string> ..FV..... Output video width
width <string> ..FV..... Output video width
h <string> ..FV..... Output video height
height <string> ..FV..... Output video height
flags <string> ..FV..... Flags to pass to libswscale (default "bilinear")
interl <boolean> ..FV..... set interlacing (default false)
in_color_matrix <string> ..FV..... set input YCbCr type (default "auto")
out_color_matrix <string> ..FV..... set output YCbCr type
in_range <int> ..FV..... set input color range (from 0 to 2) (default auto)
...
这就告诉我们scale
滤镜有w
、h
等参数,我们就这样使用scale
滤镜,
ffmpeg -i input.mp4 -filter_complex "scale=w=iw/2h=ih/2" output.mp4
其中iw
代表输入视频的宽,ih
代表输入视频的高,这条命令就把输入的视频缩小一倍,这里你可能会有疑问,我都不记得那些滤镜的名字,就无法使用这个去查了,哈哈不要急,还记得上面的帮助命令吗,ffmpeg -filters
可以输出所有的滤镜名字了,如果你觉的输出太多,你不好找的话,你只要记得这个滤镜大概是叫什么名字、包含什么字母,你就借助grep
指令去输出里面搜索关键字,这样就只会输出你关心的滤镜名了,如ffmpeg -filters | grep over
Print help / information / capabilities:
-L //show license
-h topic // show help
-? topic //show help
-help topic //show help
--help topic //show help
-version //显示版本号
-buildconf //显示编译配置,如上面所说的 --enable-libx264 --enable-libx265 --enable-videotoolbox 这种你所编译的ffmpeg所支持的三方库功能
-formats //显示支持的所有格式
-muxers //显示复用器
-demuxers //显示可用的解复用器
-devices //显示支持的设备
-codecs //显示可用的编解码器
-decoders //显示可用的解码器
-encoders //显示可用的编码器
-bsfs //显示可用的字节流滤镜
-protocols //显示支持的协议 http rtmp ftp hls等等
-filters //显示支持的滤镜
-pix_fmts //显示支持的像素格式 yuv420p yuv422p yuv444p
-layouts //显示支持的音频声道布局,最常见的就是mono单声道,stereo立体双声道
-sample_fmts //显示可用的音频采样格式
-colors //显示支持的color名称 比如Red是#ff0000表示红色,当你需要使用时就只要输入Red,而不用输入#ff0000
-sources device //显示输入设备的源列表
-sinks device //显示列表的输出设备
-hwaccels //显示HW加速方法
以上是帮助命令,如果你忘记了某个编译器、像素格式或者滤镜的名字,你就可以用这些命令去查看。
-loglevel loglevel //设置日志级别
-v loglevel //这是-loglevel的缩写
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-y //强制覆盖输出文件
-n never overwrite output files
-ignore_unknown Ignore unknown stream types
-filter_threads number of non-complex filter threads
-filter_complex_threads number of threads for -filter_complex
-stats print progress report during encoding
-max_error_rate maximum error rate ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.
-bits_per_raw_sample number set the number of bits per raw sample
-vol volume change audio volume (256=normal)
以上就是全局参数
-f fmt //文件格式 这个可以根据 ffmpeg -formats查看所支持的所有格式
-c codec //编解码器 copy表示不进行编解码,直接复制
-codec codec //同-c
-pre preset //预设参数
-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile
-t duration //时间
-to time_stop //截止实践
-fs limit_size set the limit file size in bytes
-ss time_off //开始时间
-sseof time_off set the start time offset relative to EOF
-seek_timestamp enable/disable seeking by timestamp with -ss
-timestamp time set the recording timestamp ('now' to set the current time)
-metadata string=string add metadata
-program title=string:st=number... add program with specified streams
-target type specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
-apad audio pad
-frames number set the number of frames to output
-filter filter_graph //滤镜
-filter_script filename //从文件中读取滤镜的描述filtergraph
-reinit_filter reinit filtergraph on input parameter changes
-discard discard
-disposition disposition
以上是音视频的公共参数
-vframes number // set the number of video frames to output
-r rate // set frame rate (Hz value, fraction or abbreviation)
-s size // 大小 格式是WxH
-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample number set the number of bits per raw sample
-vn //忽略视频流
-vcodec codec force video codec ('copy' to copy stream)
-timecode hh:mm:ss[:;.]ff set initial TimeCode value.
-pass n select the pass number (1 to 3)
-vf filter_graph set video filters
-ab bitrate audio bitrate (please use -b:a)
-b bitrate video bitrate (please use -b:v)
-dn disable data
以上是视频处理相关参数
-aframes number set the number of audio frames to output
-aq quality set audio quality (codec-specific)
-ar rate set audio sampling rate (in Hz)
-ac channels set number of audio channels
-an disable audio
-acodec codec force audio codec ('copy' to copy stream)
-vol volume change audio volume (256=normal)
-af filter_graph set audio filters
以上是音频处理相关
-s size set frame size (WxH or abbreviation)
-sn disable subtitle
-scodec codec force subtitle codec ('copy' to copy stream)
-stag fourcc/tag force subtitle tag/fourcc
-fix_sub_duration fix subtitles duration
-canvas_size size set canvas size (WxH or abbreviation)
-spre preset set the subtitle options to the indicated preset
以上字幕处理相关参数
以上就是ffmpeg -help
的输出说明了,下面咱们来看看常用的命令。
mp4格式转换为flv
ffmpeg -i input.mp4 output.flv
从视频中提取yuv420格式的视频流
ffmpeg -i input.mp4 -pix_fmt yuv420p output.h264
从视频中提取音频流
ffmpeg -i input.mp4 output.aac
视频转图片
ffmpeg -i input.mp4 -r 10 image%02d.png
-r 10
表示1秒视频会生成10张图片
视频中提取yuv原始数据
ffmpeg -i input.mp4 -pix_fmt yuv444p output.yuv
视频中提取pcm原始数据
ffmpeg -i input.mp4 -c:a pcm_f32le -ar 44100 -ac 2 -f f32le output.pcm
根据yuv与pcm数据生成视频
ffmpeg -pix_fmt yuv420p -s 320x240 -i input.yuv -ar 44100 -ac 2 -f f32le input.pcm -pix_fmt yuv422p output.flv
根据图片生成视频
ffmpeg -i image%03d.png -pix_fmt yuv420p -c:v libx264 output.avi
裁剪视频,从第3秒开始,裁剪5秒
ffmpeg -i input.mp4 -ss 3 -t 5 output.mp4
视频缩放
ffmpeg -i input.mp4 -filter_complex "scale=w=iw/2:h=ih/2" output.mp4
视频叠加
ffmpeg -i main.mp4 -i overlay.mp4 -filter_complex "overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10" outpu.mp4
录制摄像头
ffmpeg -f avfoundation -r 30 -s 640x480 -i '1' -pix_fmt yuv420p -f flv output.flv
录制摄像头+录音
ffmpeg -f avfoundation -r 30 -s 640x480 -i '1:0' -pix_fmt yuv420p -f flv output.flv
录制摄像头+录音+屏幕并推送到rtmp服务器
ffmpeg -thread_queue_size 128 -y -f avfoundation -r 30 -i '1:0' -f avfoundation -r 30 -s 640x480 -i 0 -filter_complex 'overlay=100:100' -pix_fmt yuv420p -f flv rtmp://localhost:1935/app/room
-f avfoundation
指定采用avfoundation采集数据使用
-i 1:0
表示 指定视频设备索引为1,指定录音设备索引为0。
使用ffmpeg -list_devices 1 -f avfoundation -i ''
可以打印出设备列表,如下:
[AVFoundation input device @ 0x7fbcba520040] AVFoundation video devices:
[AVFoundation input device @ 0x7fbcba520040] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7fbcba520040] [1] Capture screen 0
[AVFoundation input device @ 0x7fbcba520040] AVFoundation audio devices:
[AVFoundation input device @ 0x7fbcba520040] [0] Built-in Microphone
因此上述命令中的-i 1:0
表示采用【Capture screen 0】【Built-in Microphone】即采用屏幕和系统自带的麦克风进行采集。
网友评论