目录

FFmpeg

FFmpeg 是领先的多媒体框架,能够解码、编码、 转码、复用、解复用、流、过滤和播放几乎所有人类和机器创建的东西。

它包含可供应用程序使用的 libavcodec、libavutil、libavformat、libavfilter、libavdevice、libswscale 和 libswresample。还有ffmpeg、ffplay和ffprobe可供最终用户转码和播放。

Install

A homebrew tap for an ffmpeg formula with lots of options

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Installing
brew tap homebrew-ffmpeg/ffmpeg
brew info homebrew-ffmpeg/ffmpeg/ffmpeg
# 支持插件选项列表
brew options homebrew-ffmpeg/ffmpeg/ffmpeg

brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-fdk-aac
ffmpeg -version

# Installing everything
brew install homebrew-ffmpeg/ffmpeg/ffmpegg $(brew options homebrew-ffmpeg/ffmpeg/ffmpeg --compact)
# Updating
brew update && brew upgrade ffmpegg
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 显示当前版本
ffmpeg -version
# 显示编译此 ffmpeg 的 configuration
ffmpeg help -buildconf
# 显示支持的文件格式,同时显示 muxers 和 demuxers
ffmpeg help -formats
# 显示支持的 muxers 格式
ffmpeg help -muxers
# 显示支持的 demuxers 格式
ffmpeg help -demuxers
# 显示支持的设备,包括音视频设备
ffmpeg help -devices
# 显示支持的格式,同时显示视频、音频、字幕、帧内编码、有损压缩和无损压缩的解编码支持情况
ffmpeg help -codecs
# 显示支持的解码器
ffmpeg help -decoders
ffmpeg help -encoders #显示支持的编码器
ffmpeg help -bsfs #显示支持的二进制流过滤器,例如h264_metadata、h264_mp4toannexb、hevc_mp4toannexb等
ffmpeg help -protocols #显示支持的可用的协议,区分Input和Output,例如file、http、hls、rtmp、rtp、pipe、tee等
ffmpeg help -filters #显示支持的可用的过滤器
ffmpeg help -pix_fmts #显示支持的可用的像素格式
ffmpeg help -layouts #显示支持的声道布局,例如mono、stereo、2.1、2.0、3.0、5.0、5.1等
ffmpeg help -sample_fmts #显示支持的音频采样格式,例如u8、s16、s32、flt等
ffmpeg help -colors #显示支持的颜色
ffmpeg help -sources device #列出输入设备的源
ffmpeg help -sinks device #列出输出设备的槽(节点)
ffmpeg help -hwaccels #显示可用的硬件加速方法

视频压缩

Constant Rate Factor (CRF)

1
2
3
4
5
# 复制音频
ffmpeg -i <input> \
       -c:v libx265 -tag:v hvc1 -crf 25 -preset fast -pix_fmt yuv420p10le \
       -c:a copy -strict experimental \
       output.mp4

Two-Pass Encoding

1
2
ffmpeg -y -i <input> -c:v libx265 -b:v 2600k -x265-params pass=1 -an -f mp4 /dev/null && \
ffmpeg -i <input> -c:v libx265 -tag:v hvc1 -b:v 2600k -x265-params pass=2 -c:a libfdk_aac -b:a 128k output.mp4

视频编码测试

所用的样本视频是用苹果手机拍摄的4K视频。

CPU 编码采用的是 crf 模式,硬件编码采用 VBR 模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# H264编码,CPU编码 crf=23,0.18倍速,码率大约是37M
ffmpeg -i IMG_2051.MOV -c:v libx264 -crf 23 -preset medium -c:a copy IMG_2051_h264.mp4

# H265 HEVC编码,CPU编码 crf=28,0.077倍速,码率大约是8M
ffmpeg -i IMG_2051.MOV -c:v libx265 -tag:v hvc1 -crf 28 -preset medium -c:a copy IMG_2051_h265.mp4

# H264编码,硬件编码 h264_videotoolbox,码率37M,1.75倍速
ffmpeg -i IMG_2051.MOV -c:v h264_videotoolbox -profile:v high -level 5.1 -b:v 37000K -c:a copy IMG_2051_hh264.mp4

# H265 HEVC编码,硬件编码hevc_videotoolbox,码率15M,1.66倍速
ffmpeg -i IMG_2051.MOV -c:v hevc_videotoolbox -tag:v hvc1 -profile:v main -level 5.1 -b:v 15000K -c:a copy IMG_2051_hh265.mp4

经过试验得到的结论是,M1 芯片软件编码 4K 视频速度还是很慢,短视频还可以接受,长视频不建议用软件编码,除非你愿意花上10倍的时间,或者等待原生 arm 支持,或者等待 M2 芯片。

硬件编码H264和H265的速度都可以接受,但不能使用crf质量模式,必须指定码率。

附录