转码流程:ffmpeg会自动选择适合的工具对目标文件进行解码解封装,还原成原始文件PCM或YUV,然后使用用户指定的编码器进行编码封装。
CPU软编码
一般使用 libx264、libx265、librav1e 之类的编码器编码,当然也有人用 OpenH264 或者其他自己定制的编码器。
libx264
- 可通过命令行查看相关参数
$ ffmpeg -h encoder=libx264
-
libx264 提供预置模板来解决设置编码参数太多,太琐碎的问题。默认用的是 medium 模板,也就是平衡画质与编码速度的最优选择。
如果使用性能调优类模版 zerolatency,它包含了很多低延迟编码参数,常应用于画面延迟低的直播流。
-sliced-threads,将每一帧图片分成多份,放到多线程去并发处理。
--sync-lookahead O、--rc-lookahead 0,不需要提前预存帧,也没有双向参考帧,最大限度降低画面延迟
恒定码率:nal-hrd cbr、maxrate、minrate 与 bufsize,一般 bufsize 控制比 maxrate 小大概 1/3 ~ 1/2
-
使用libx264编码器进行工作时,如果libx264的参数不能满足需求,可以使用ffmpeg的命令行,通过 -x264opts 设置 libx264中没有但x264中包含的参数,因为libx264本身就是x264的封装,所以不需要重新编译libx264,新设置的参数会透传到x264中。
-
转码命令
ffmpeg -i input.mp4 -pix_fmt yuv420p -vcodec libx264 -nal-hrd cbr -tune zerolatency -preset superfast -maxrate 900k -minrate 890k -bufsize 300k -x264opts "open-gop=1" output.ts
// 可通过 ffprobe -show_entries frame=pict_type -select_streams v -of xml a.mp4 查看 nal-hrd cbr 是否已经生效
GPU硬编码
// 查看mac的videotoolbox框架支持的视频编码器
ffmpeg -encoders | grep videotoolbox
// 使用 h264_videotoolbox 编码器进行转码操作
ffmpeg -i a.mp4 -vcodec h264_videotoolbox -b:v 2000k output.mp4
网友评论