预备接手表情包处理业务,前期处理并不复杂,流程包括 : GIF动图与视频的解帧 , 逐帧处理, 组合各帧得到新的GIF. 经过调研, 整合了ffmpeg的Java CV 可完美处理解帧 , animated-gif-lib 组件包含gif生成的成熟方案 , 进而问题解决.
animated-gif-lib + Java CV
animated-gif-lib.jar是用来拆分和合成GIF的工具包,主要用到其中的GifDecoder/AnimatedGifEncoder.
Java CV 常用于音频/图片等处理,其中整合了常用的c++类库,例如音频处理的ffmpeg,且可与Open CV配合使用.这里主要用到FFmpegFrameGrabber来取帧/Java2DFrameConverter来类型转换.
其实,GifDecoder也可以完成对GIF的解帧,但无法对视频进行操作,且实际使用中发现各帧颜色处理上有偏差,但并不影响最后新GIF的合成.综上,为了代码的复用性,采用Java CV来解帧,只使用其中AnimatedGifEncoder来完成合成GIF的操作.
代码实现
解帧,FFmpegFrameGrabber获取GIF总帧数时异常(),故而采用GifDecoder获取
String gifPath = "/home/lab/test/11.gif";
String dirPath= "/home/lab/test/gif/";//用以解帧
FFmpegFrameGrabber grabberGif = newFFmpegFrameGrabber(gifPath);
grabberGif.start();
Frame frame ;//用以获取GIF总帧数
GifDecoder decoder = newGifDecoder();int status =decoder.read(gifPa