压缩视频并保留元信息

  • Post author:
  • Post category:其他




背景

手机拍摄的视频往往比特率极高,空间占用极大,在整理照片备份时,如果可以对某些特别大、但又不要求画质极高的视频进行压缩,从而达到节省空间的目的,同时又不会丢失回忆。

常用的HandBrake在压缩视频后便抹去了所有元数据,包括修改日期、GPS位置、拍摄设备等。

所以需要寻求一个合适解决方法。



方案

使用到的工具有两个:ffmpeg和exiftool,是两个非常著名的开源软件。

ffmpeg作为一个常用的视频处理开源程序,被诸如HandBrake等软件用作底层代码的核心。其提供了各类的压缩方式。

exiftool可以处理各类音视频的metadata。

VBR(variable bit rate)

bitrate固定目标码率模式默认采用的是VBR动态(可变)比特率的方式进行编码,简单的内容少给点码率,复杂的内容多给点码率。

VBR例子:ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow output.mp4

ABR(average bit rate)

现在的网络视频基本上都是采用ABR平均比特率的编码方式,如果VBR的码率变化太大,用户的设备或网络状况又不好的情况下很容易变成花屏或者黑屏。

ABR例子:ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow -b:v 3000k output.mp4

CBR(constant bit rate)

CBR恒定比特率,他其实就是在ABR的基础上加上一些指令(…-b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k…)让码率尽可能固定在一个数值上。

对于大多数情况,我们可以采用VBR进行动态压缩。cd到照片所在文件夹,以下命令将会对所有视频文件进行压缩,并将压缩后的文件重新命名,加上-compressed的后缀。这样压缩后的视频,虽然元数据都得到了保存,但文件的修改时间缺没有得到保留。故需要之后的第二行代码进行操作。

for i in *[^-compressed].*; do ffmpeg -i "$i" -movflags use_metadata_tags -vcodec libx264 -preset fast "${i%.*}-compressed.mp4"; done
\
for i in *[^-compressed].*; do touch -r "$i" "${i%.*}-compressed.mp4"; done  #批量拷贝视频的修改时间

在使用前可以先哪一个视频来做测试,压缩和修改完日期后利用另一个开源工具

exiftool

查看元数据,看是否是正确的修改日期、GPS位置、拍摄设备等。



参考文献

https://blog.csdn.net/ETalien_/article/details/102931065



版权声明:本文为weixin_40812994原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。