手机摄像模组越做越好用了,但录制的视频也越来越大了。最近新换一手机,最高支持8K60P录制,但录好了现在也没设备播放。目前也就显示器是4K分辨率,最适合的还是录制4K60P,看了60fps加上防抖的视频再看以前录的普通30fps的视频差距就太大了。视频的质量上来了大小也上来了。x264编码的4K60P视频默认码率是100mbps,改成x265编码后也是50mbps,稍微录长一点文件就上GB了,再大的手机空间都不够装。

以前手机录制的视频也有这个问题,但前几年一般都是1080p@30fps视频,手机屏幕也是1080p左右,把原视频拷贝到电脑上,自己用ffmpeg重新压制一下,再放回手机里面就可以。一般用x264 4mbps压完在手机上看和原视频没啥区别。现在变成4K60P,为了尽量减小体积得用x265压,压起来也慢多了。

最后经过调试发现在2K分辨率的手机屏幕上4K60P的视频用x265 8mbps左右的码率看起来比较合适。用默认的medium就行,但x265的profile没有high,只有main,main10是针对10bit的视频,用不上。如果直接用 profile=main:level=5.1会报错,但用profile=high:level=5.1反而会通过,最后压完看视频信息仍然是Format profile : Main@L5.1@Main。

发一个自己用的批处理压制代码,为节约空间,用了x265,两次编码,音频128kbps就行。

if not exist converted (md trans)
for %%g in (*.mp4) do (
ffmpeg -y -i "%%g"  -c:v libx265 -x265-params "profile=high:level=5.1" -b:v 8M -maxrate 16M -bufsize 8M  -pass 1 -an -f mp4 NUL
ffmpeg -i "%%g"  -c:v libx265 -x265-params "profile=high:level=5.1" -b:v 8M -maxrate 16M -bufsize 8M  -pass 2 -c:a aac -b:a 128k "trans\%%~ng_trans.mp4"
)
rem delete ffmpeg temp files
del ffmpeg2pass*
exit /b 

上面是cmd版本的,因为压得比较慢,有时我也把视频丢到linux服务器上,linux版本的批处理代码如下:

#!/bin/bash -e
for i in *.mp4;
do 
	ffmpeg -y -i "${i%.*}.mp4" -c:v libx265 -x265-params "profile=high:level=5.1" -b:v 8M  -maxrate 16M -bufsize 8M -pass 1 -an -f mp4 /dev/null && \
	ffmpeg -i "${i%.*}.mp4" -c:v libx265 -x265-params "profile=high:level=5.1" -b:v 8M  -maxrate 16M -bufsize 8M -pass 2 -c:a aac -b:a 128k "${i%.*}trans.mp4"
	rm ffmpeg2pass*
done

这样处理完后再把视频拷回手机,在手机上看效果和原来几乎一样,而文件大小可以减少80%以上。

标签: , ,

一条评论 发表在“用ffmpeg批量压缩手机视频”上

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

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