1.查看帮助文档
ffmpeg是一个开源的音视频转码工具
本文是自己学习ffmpeg使用方式的一个笔记
将ffmpeg命令行工具加入环境变量之后,输入ffmpeg -h
打印帮助文档
PS C:\Users\mudssky\Desktop> ffmpeg -h
ffmpeg version N-92752-g16ec62bbf4 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 8.2.1 (GCC) 20181201
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56\. 24.101 / 56\. 24.101
libavcodec 58\. 42.104 / 58\. 42.104
libavformat 58\. 24.101 / 58\. 24.101
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7\. 46.101 / 7\. 46.101
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
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.
Print help / information / capabilities:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods
Global options (affect whole program instead of just one file:
-loglevel loglevel set logging level
-v loglevel set logging level
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-y overwrite output files
-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)
Per-file main options:
-f fmt force format
-c codec codec name
-codec codec codec name
-pre preset preset name
-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile
-t duration record or transcode "duration" seconds of audio/video
-to time_stop record or transcode stop time
-fs limit_size set the limit file size in bytes
-ss time_off set the start time offset
-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 set stream filtergraph
-filter_script filename read stream filtergraph description from a file
-reinit_filter reinit filtergraph on input parameter changes
-discard discard
-disposition disposition
Video options:
-vframes number set the number of video frames to output
-r rate set frame rate (Hz value, fraction or abbreviation)
-s size set frame size (WxH or abbreviation)
-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 disable video
-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
Audio options:
-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
Subtitle options:
-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
可选视频编码方案
1. MP4封装:H264视频编码+AAC音频编码(最通用)
2. WebM封装: VP8视频编码+Vorbis音频编码(Google为了避开专利开发,无明显优势)
3. OGG封装: Theora视频编码 +Vorvis音频编码(完全开源的编码方式,无专利,HTML5可用)
2.音频转码
例子 flac转mp3
ffmpeg -i input.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
-acodec 输入编码器,不输入也可以,ffmpeg会自动根据后缀名选择编码器
-ar rate 指定采样频率,不指定采样频率会根据输入音视频的采样频率
-ab audio byte rates 指定比特率,如果不输入默认是128K,这点就有点坑了。128K作为视频的音轨比较合适,但是这个音质作为单纯的音频来说还是基本上是最低音质,平时我们在手机里听听的水平。
-ac audio channel 指定声道数
3.视频压制
ffmpeg -i in.webm -s 1920*1080 -pix_format yuv420p -vcodec libx264 -preset medium -profile:v high -level:v -crf 23
-s size 指定视频尺寸进行缩放
-pix_format 指定视频使用的颜色空间 ,输入
ffmpeg -pix_fmts
可以打印出所有支持的选项。我就知道两个YUV和RGB,YUV表示明亮度,色度和浓度,因为人的色觉对亮度的敏感程度要高一些,所以网络视频通常会对色度层面进行压缩。也就是所谓的yuv420p。Y保留全部UV进行压缩-vcodex 指定视频编码器,建议使用libx264
-
-preset 对编码器的预设,精度越高编码速度越慢,占用cpu性能越高,默认是medium
有以下几个选项
1. ultrafast
2. superfast
3. veryfast
4. faster
5. fast
6. medium
7. slow
8. slower
9. veryslow
10. placebo
通常我们在网络上发布视频,会使用veryfast选项。较快,消耗性能少,对播放器的要求也低,缺点是生成的视频会大一些
压制视频的时候,一般采用veryslow选项。
-profile:v 指定编码器配置,主要和压缩比有关。
如下图所示,越往左支持的选项越少,质量越低
实时通信领域采用baseline
流媒体领域 使用 main
超清视频 使用high
- -level:v 对编码器配置的限制,如下表
一般情况下1080P及以下视频选用4.1即可
-crf Constant Rate Factor 恒定速率因子模式,每一帧的画面都按照要求的视频质量计算需要的比特数,画质均衡,但是无法控制码率,也无法控制最终生成文件的大小。 适用于对于画质有要求,文件大小没有要求的情况,范围0-51,默认值就是23,数字越小质量越高
-r 设置视频帧率
-b:a 同 -ab 设置音频比特率,大多数视频网站的音频比特率都是128K或者192K
4.码率控制模式
fmmpeg支持3种码率控制模式
1. -qp
恒定量化器模式,量化器就是用算法将每一帧的质量转化为数字,可以设置,建议让软件自动设置。
体积最大
一般不使用这种模式,除非你想无损压制视频
无损压制视频的例子(快速编码)
ffmpeg -i input -vcodec libx264 -preset ultrafast -qp 0 output.mkv
无损压制视频的例子(高压缩比)
ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 output.mkv
尝试了用这种无损压缩方式压缩dvd镜像中提取的vob文件,发现这种方式压制出来的文件体积竟然是原来的两倍。所以说还是使用crf 18,这样就比较接近无损了。
2. -crf 恒定速率因子模式,相当于浮动值的qp模式,会给每个画面不同的量化值,比如说把人眼不敏感的部分码率调低。一般压制视频使用这个选项。但是不懂不推荐乱设置,让软件自动配置即可
值的范围是0-51,默认值是23,通常认为crf值18压制出来的视频视觉上是无损的。18-23之间的变化不明显。
3. -b 固定目标码率模式,当上传视频网站有码率限制时,可以使用这个选项。但是不推荐。crf也可以获得合适的体积和画质。没必要
使用上面3个选项压制,都是单遍编码,最好加上-preset veryslow 选项,这样软件对参数的控制会更精准
比特率模式
VBR 动态比特率,ffmpeg默认采用,简单的内容少给码率,复杂内容多给码率。
ABR 平均比特率,网络视频会采用这一格式,因为VBR码率变化太大,不适用网络传输
CBR 恒定比特率, 通常没有人使用
输入 ffmpeg -h encoder=libx264
查看最常用的x264编码器的使用方式
-nal-hrd
可以指定VBR和CBR两种,但是CBR在.mp4不支持?
其余还有-maxrate -minrate 选项,设置这两个选项就能达到ABR的效果
PS C:\Users\mudssky\Desktop> ffmpeg.exe -h encoder=libx264
ffmpeg version N-92752-g16ec62bbf4 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 8.2.1 (GCC) 20181201
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56. 24.101 / 56. 24.101
libavcodec 58. 42.104 / 58. 42.104
libavformat 58. 24.101 / 58. 24.101
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 46.101 / 7. 46.101
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
Encoder libx264 [libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10]:
General capabilities: delay threads
Threading capabilities: auto
Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16 nv21 yuv420p10le yuv422p10le yuv444p10le nv20le gray gray10le
libx264 AVOptions:
-preset <string> E..V..... Set the encoding preset (cf. x264 --fullhelp) (default "medium")
-tune <string> E..V..... Tune the encoding params (cf. x264 --fullhelp)
-profile <string> E..V..... Set profile restrictions (cf. x264 --fullhelp)
-fastfirstpass <boolean> E..V..... Use fast settings when encoding first pass (default true)
-level <string> E..V..... Specify level (as defined by Annex A)
-passlogfile <string> E..V..... Filename for 2 pass stats
-wpredp <string> E..V..... Weighted prediction for P-frames
-a53cc <boolean> E..V..... Use A53 Closed Captions (if available) (default true)
-x264opts <string> E..V..... x264 options
-crf <float> E..V..... Select the quality for constant quality mode (from -1 to FLT_MAX) (default -1)
-crf_max <float> E..V..... In CRF mode, prevents VBV from lowering quality beyond this point. (from -1 to FLT_MAX) (default -1)
-qp <int> E..V..... Constant quantization parameter rate control method (from -1 to INT_MAX) (default -1)
-aq-mode <int> E..V..... AQ method (from -1 to INT_MAX) (default -1)
none E..V.....
variance E..V..... Variance AQ (complexity mask)
autovariance E..V..... Auto-variance AQ
autovariance-biased E..V..... Auto-variance AQ with bias to dark scenes
-aq-strength <float> E..V..... AQ strength. Reduces blocking and blurring in flat and textured areas. (from -1 to FLT_MAX) (default -1)
-psy <boolean> E..V..... Use psychovisual optimizations. (default auto)
-psy-rd <string> E..V..... Strength of psychovisual optimization, in <psy-rd>:<psy-trellis> format.
-rc-lookahead <int> E..V..... Number of frames to look ahead for frametype and ratecontrol (from -1 to INT_MAX) (default -1)
-weightb <boolean> E..V..... Weighted prediction for B-frames. (default auto)
-weightp <int> E..V..... Weighted prediction analysis method. (from -1 to INT_MAX) (default -1)
none E..V.....
simple E..V.....
smart E..V.....
-ssim <boolean> E..V..... Calculate and print SSIM stats. (default auto)
-intra-refresh <boolean> E..V..... Use Periodic Intra Refresh instead of IDR frames. (default auto)
-bluray-compat <boolean> E..V..... Bluray compatibility workarounds. (default auto)
-b-bias <int> E..V..... Influences how often B-frames are used (from INT_MIN to INT_MAX) (default INT_MIN)
-b-pyramid <int> E..V..... Keep some B-frames as references. (from -1 to INT_MAX) (default -1)
none E..V.....
strict E..V..... Strictly hierarchical pyramid
normal E..V..... Non-strict (not Blu-ray compatible)
-mixed-refs <boolean> E..V..... One reference per partition, as opposed to one reference per macroblock (default auto)
-8x8dct <boolean> E..V..... High profile 8x8 transform. (default auto)
-fast-pskip <boolean> E..V..... (default auto)
-aud <boolean> E..V..... Use access unit delimiters. (default auto)
-mbtree <boolean> E..V..... Use macroblock tree ratecontrol. (default auto)
-deblock <string> E..V..... Loop filter parameters, in <alpha:beta> form.
-cplxblur <float> E..V..... Reduce fluctuations in QP (before curve compression) (from -1 to FLT_MAX) (default -1)
-partitions <string> E..V..... A comma-separated list of partitions to consider. Possible values: p8x8, p4x4, b8x8, i8x8, i4x4, none, all
-direct-pred <int> E..V..... Direct MV prediction mode (from -1 to INT_MAX) (default -1)
none E..V.....
spatial E..V.....
temporal E..V.....
auto E..V.....
-slice-max-size <int> E..V..... Limit the size of each slice in bytes (from -1 to INT_MAX) (default -1)
-stats <string> E..V..... Filename for 2 pass stats
-nal-hrd <int> E..V..... Signal HRD information (requires vbv-bufsize; cbr not allowed in .mp4) (from -1 to INT_MAX) (default -1)
none E..V.....
vbr E..V.....
cbr E..V.....
-avcintra-class <int> E..V..... AVC-Intra class 50/100/200 (from -1 to 200) (default -1)
-me_method <int> E..V..... Set motion estimation method (from -1 to 4) (default -1)
dia E..V.....
hex E..V.....
umh E..V.....
esa E..V.....
tesa E..V.....
-motion-est <int> E..V..... Set motion estimation method (from -1 to 4) (default -1)
dia E..V.....
hex E..V.....
umh E..V.....
esa E..V.....
tesa E..V.....
-forced-idr <boolean> E..V..... If forcing keyframes, force them as IDR frames. (default false)
-coder <int> E..V..... Coder type (from -1 to 1) (default default)
default E..V.....
cavlc E..V.....
cabac E..V.....
vlc E..V.....
ac E..V.....
-b_strategy <int> E..V..... Strategy to choose between I/P/B-frames (from -1 to 2) (default -1)
-chromaoffset <int> E..V..... QP difference between chroma and luma (from INT_MIN to INT_MAX) (default -1)
-sc_threshold <int> E..V..... Scene change threshold (from INT_MIN to INT_MAX) (default -1)
-noise_reduction <int> E..V..... Noise reduction (from INT_MIN to INT_MAX) (default -1)
-x264-params <string> E..V..... Override the x264 configuration using a :-separated list of key=value parameters
5.合并,提取视频
01.提取视频流,
假设我们提取mp4视频中的视频流
ffmpeg -i in.mp4 -vcodec copy -an v.mp4
-an选项是 audio no 也就是忽略音频
02.提取音频
ffmpeg -i in.mp4 -acodec copy -vn a.m4a
同理 -vn 即忽略音频
如果提取多个音轨的视频:
比如我们用ffprobe看到如下
提取第二条 只需加上-map 0:3
03.合并音视频
ffmpeg -i a.m4a -i v.mp4 -c copy out.mp4
瞬间就能完成合并,因为音频和视频都是现成的,不用重新编码
-c 就是 -codec的简写
6.截取、连接音视频
01.截取音视频
ffmpeg -i in.mp3 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp3
-ss 设置起始时间位移
-to 设置结束时间位移
也可以使用下面的方式
ffmpeg -i in.mp3 -ss 00:01:00 -t 10 -acodec copy out.mp3
-t 设置截取时长
还有-sseof 选项 是以媒体末尾作为起点,可以配合-t截取末尾多少秒
看下面2条命令
ffmpeg -i in.mp4 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp4
ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy out.mp4
调换-ss和-i的位置对结果的影响?
-ss在前面会调用关键帧技术,可能导致截取的时间并不准确
ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy -copyts out.mp4
我们可以加上 -copyts选项,作用是保留时间戳,这样就能正确截取了。
02.合并音视频
方法一
ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4
当合并的几个视频参数一致时,很快就合并完成了。
合并不同参数的视频,操作会比较麻烦。
方法二
上面的方法其实相当于把两个文件直接拼在一起,适用于mp2之类的视频,如果是flv连接处会有卡顿现象
下面的方法,先在一个txt文本中把要拼接的文件列出来。
这条命令只要是相同格式的视频均可以拼接
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
-safe 命令是让ffmpeg无视安全问题报错
在txt文件中的格式需要是这样子
file 'file1.mp4'
file 'file2.mp4'
可以使用开源软件Avidemux,图形化界面,操作方便
7.截图、水印、动图
01.截图
ffmpeg -i in.mp4 -ss 5 -vframes 1 img.jpg
-vframe 指定截取的帧
02.加水印
ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=20:20"
-filter_complex
添加滤镜 overlay20:20 指的是,离左边20像素,离上边20像素
03.制作GIF动图
ffmpeg -i in.mp4 -ss 4.5 -to 8.5 -s 640*320 -r 15 out.gif
8.录屏、直播
01.录屏
ffmpeg -f gdigrab -i desktop rec.mp4
默认录屏参数是下面这样的
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\rec.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.24.101
Duration: 00:00:04.11, start: 0.000000, bitrate: 676 kb/s
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 2560x1440, 672 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
清晰度相当不错,字符都很清楚,但是没有声音
-f 格式化 gdigrab 是ffmpeg的一个组件,用来捕获视频。 在windows系统中,ffmpeg自带的就是和默认使用的gdigrab,只能录制屏幕,不能录制声音
直播推荐使用OBS Studio,开源免费,功能强大
02.直播推流
ffmpeg -re -i rec.mp4 按网站要求输入想要的编码 -f flv rtmp地址