以前写过《用ffmpeg批量压缩手机视频》,对于4k60p的手机视频压缩后大约只占以前20%的空间。这对于手机内部存储来说非常有用,512G的手机也经不住存50mbps编码的视频。特别是我这手机还支持 4k120p,开启后编码100mbps,根本存不了多久的视频。而现在大家越来越在意视频拍摄,包括新出的一些无反相机都主推视频拍摄功能。真要加上花哨的10bit hdr拍摄,又不重新编码的话,很快手机就没空间了。

上回的转码本来也没大问题,但没加meta信息,很多手机厂商喜欢按视频修改时间排列视频,这使得后面查找不方便。另外,以前同等条件下cpu编码画质会比cuda等硬件编码效果好些,所以上回用的libx265。但考虑到手机上看完全没区别,而硬件编码又很省时间,故现在改成硬件编码。

if not exist converted (md converted)
for %%g in (*.mp4) do (
ffmpeg -noautorotate  -hwaccel cuvid -c:v hevc_cuvid -y -i "%%g"   -map_metadata 0 -c:v hevc_nvenc -b:v 8M -pass 1 -an -f mp4 NUL
ffmpeg -noautorotate  -hwaccel cuvid -c:v hevc_cuvid -i "%%g"   -map_metadata 0 -c:v hevc_nvenc -b:v 8M -pass 2  -c:a aac -strict experimental -b:a 128k "converted\%%~ng_trans.mp4"
)
rem delete ffmpeg temp files
del ffmpeg2pass*
exit /b 

同样的,2次编码带上 -map_metadata 。另外,这个版本ffmpeg的cuda编码有个坑,它不像libx265那样可以自动识别横竖视频,会造成竖排的视频倒过来。我开始想写个条件判断,自动识别并自动旋转,结果既复杂效果也不好,后来发现直接一个 -noautorotate 就搞定了。

当然这是nvidia的cuda,amd的用hevc_amf,方法类似。最终在手机上看效果和原来的几乎没区别,但文件只有以前20%的大小。相对3700X的libx265编码速度平均算下来只有0.1X-0.15X,而现在我3070编码基本上1.3X-1.8X,快了10几倍。

标签: , , , ,

留下回复(本站有评论邮件通知功能)