大家好,又见面了,我是你们的朋友全栈君。
介绍在FFmpeg环境下使用libx264进行H.264(AVC)软编码的操作,H.265(HEVC)的编码操作使用的是libx265,但是参数基本类似。
FFmpeg软编码H.264与H.265
当前网络中常见的视频编码格式要数H.264最为火热,支持H.264的封装格式有很多,如FLV、MP4、HLS(M3U8)、MKV、TS等格式
FFmpeg本身并不支持H.264的编码器,而是由第三方模块对其进行支持,例如x264和OpenH264。使用x264进行H.264编码时,所支持的像素格式主要包含yuv420p、yuvj420p、yuv422p、yuvh422p、yuv444p、yuvj444p、nv12、nv16、nv21.
- x264编码参数
- H.264编码举例
- 编码器预设参数设置preset.ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo.随着所设置参数的不同,所编写出来的清晰度也会有所不同,设置相关的预设参数之后,有很多参数也会被设置所影响。
- H.264编码优化参数tune.使用tune参数调优H.264编码时,可以包含如下几个场景:film,animation,grain,stillimage,psnr,ssim,fastecode,zerolatency。在使用FFmpeg与x264进行H264直播编码并进行推流时,只用tune参数的zerolatency将会提升效率,因为其降低了因编码导致的延迟。
- H.264的Profile与level设置。x264编码器支持Baseline,Extented,Main,High,High10,High422,High444共7种profile参数设置。
- 控制场景切换关键帧插入参数sc_threshold。在FFmpeg中,通过命令行的-g参数设置以帧数间隔为GOP的长度,但是当遇到场景切换时,例如从一个画面突然变成另外一个画面时,会强行插入一个关键帧,这时GOP的间隔将会重新开始,为了避免这种情况的产生,可以通过使用sc_threshold参数进行设定以决定是否在场景切换时插入关键帧。
- 设置x264内部参数x264opts。由于FFmpeg设置x264参数时增加的参数比较多,所以FFmpeg开放了x264opts,可以通过这个参数设置x264内部私有参数,如设置I帧、P帧、B帧的顺序及规律等。视频中的B帧越多,同等码率时的清晰度将会越高,但是B帧越多,编码与解码所带来的复杂度也就越高,所以合理使用B帧非常重要,尤其是在进行清晰度与码率衡量时。
- CBR恒定码率设置参数nal-hrd。编码能够设置VBR,CBR的编码模式,VBR为可变码率,CBR为恒定码率。
FFmmpeg硬编解码
当使用FFmpeg进行软编码时,常见的基于CPU进行H.264或H.265编码其相对成本会比较高,CPU编码时的性能也很低,所以出于编码效率及成本考虑,很多时候都会考虑采用硬编码,常见的硬编码包含Nvidia GPU与Intel QSV两种,还有嵌入式平台,如树莓派、瑞芯微等。
- Nvida GPU 硬编解码。FFmpeg集成Nvida显卡视频处理模块后,使用FFmpeg能够将Nvidia的视频编解码功能快速使用起来。
- Nvidia硬编码参数
- Nvidia硬编解码参数使用举例 - Intel QSV硬编码。Intel QSV也是一种不错的方案,FFmpeg对于Intel的QSV支持相对也比较灵活。
- - Intel QSV H.264参数说明
- 树莓派硬编码
FFmpeg输出MP3
FFmpeg使用第三方库libmp3lame即可编码MP3格式。而且MP3的编码还是低延迟的编码,可以支持的采样率比较多,采样格式也多。
- MP3编码参数介绍。查看FFmpeg对于MP3的参数支持,可以通过ffmpeg-h encoder=libmp3lane得到MP3的参数。
- MP3的编码质量设置。在FFmpeg中进行MP3编码采用的是第三方库libmp3lame,所以进行编码时,需要设置编码参数acodec为libmp3lame,
- 平均码率编码参数ABR.是VBR与CBR的混合产物,表示平均码率编码,使用ABR参数之后,编码速度将会比VBR高,但是质量会比VBR的编码稍逊一些,比CBR编码好一些,在FFmpeg中使用参数-abr来控制MP3编码为ABR编码方式。
FFmpeg输出AAC
AAC是一种编码效率更高、编码音质更好的音频编码格式,常见的使用AAC编码后的文件存储格式为m4a。FFmpeg可以支持AAC的三种编码器:1).aac:FFmpeg本身的AAC编码实现;2).libfaac:第三方的AAC编码器;3).libfdk_aac:第三方的AAC编码器
- FFmpeg中的AAC编码器使用
- FDK AAC第三方的AAC编解码Codec库
- 恒定码率(CBR)模式
- 动态码率(VBR)模式
系统资源使用情况
音视频转码与音视频转封装的不同之处在于音视频转码会占用大量的计算资源,而转封装则主要是将音频数据或者视频数据取出,然后转而封装(MUX)成另外一种封装格式,转封装主要占用IO资源,而转码主要占用CPU资源,同时转码也会使用更多的内存资源。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/153393.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...