最近摄影公司不知道从哪里弄到了我们的电话号码,提出上门给宝宝拍摄新生儿艺术照留念,打着社区免费服务的幌子拍照后各种狮子大开口,收费3200,后来减去了一些照片,总算是800拿下来了。临走之前先让他们把照片发给我们了,文件夹有点大,想隔空投送给宝妈手机。但是宝妈手机这些天居然给宝宝拍了几十个视频沾满了手机空间,暂时还舍不得删除。
所以就想着把摄影师给咱的照片压缩一下,一开始是想着使用网页工具,但是照片有点多,一个个上传到网页,压缩后还需下载,非常多不方便。正好想起来了以前的视频编辑人员给我推荐的 ffmpeg 神器!详见教程:视频高清低损压缩命令行实现方案推荐
关键是超级方便,这个 ffmpeg 命令仅仅是需要一个 -i 的参数指定输入的高质量图片,就可以输出一个高清但是文件至少缩小90%大小的图片!
在mac下面安装 ffmpeg 只需要两行代码即可:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install ffmpeg
其实就是借用了brew来安装ffmpeg。
有意思的是,我使用下面的批量操作会报错:
mkdir -p ../yashuo/
ls *JPG |while read id;do ( ffmpeg -i "$id" ../yashuo/"$id");done
这个报错很奇怪,50%的失败率,如下所示:
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
C_5469.JPG: No such file or directory
ffmpeg version 4.1.3 Copyright (c) 2000-2019 the FFmpeg developers
如果是成功,会有:
Output #0, image2, to '../yashuo/DSC_5471.JPG':
Metadata:
encoder : Lavf58.20.100
Stream #0:0, 0, 1/25: Video: mjpeg, 1 reference frame, yuvj422p(pc, center), 7360x4912, 0/1, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc58.35.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
Clipping frame in rate conversion by 0.000008
[image2 @ 0x7fdf04809a00] Opening '../yashuo/DSC_5471.JPG' for writing
[file @ 0x7fdefec0dcc0] Setting default whitelist 'file,crypto'
[AVIOContext @ 0x7fdefec0df40] Statistics: 0 seeks, 5 writeouts
[out_0_0 @ 0x7fdf00b06f00] EOF on sink link out_0_0:default.
No more output streams to write to, finishing.
frame= 1 fps=0.0 q=14.9 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.0854x
video:1128kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (DSC_5471.JPG):
Input stream #0:0 (video): 1 packets read (22754101 bytes); 1 frames decoded;
Total: 1 packets (22754101 bytes) demuxed
Output file #0 (../yashuo/DSC_5471.JPG):
Output stream #0:0 (video): 1 frames encoded; 1 packets muxed (1154750 bytes);
Total: 1 packets (1154750 bytes) muxed
1 frames successfully decoded, 0 decoding errors
我换了一种方式:
ls *jpg |while read id;do ( echo ffmpeg -i "$id" ${id}_new.jpg);done > tmp.sh
bash tmp.sh
但是仍然是报错!
后来呢,只好复制这几百行命令,然后一股脑的粘贴到命令行客户端,然后就莫名其妙的成功了。
也仅仅是说单独的每个命令都是可以运行,但是组合成为了脚本就会出现部分失败!
压缩效果如下:
319M ./压缩版高清
5.6G ./底片
我看了看,亚群前后基本上没有肉眼可见的差别,轻轻松松就达到了20倍的压缩比例!