javaCV实现视频帧转码保存为图片
最近使用到了javaCV进行视频帧转码,记录一下项目中使用javaCV的对h264/h265的视频帧的base64字符串转成jpg图片的一次实现
功能流程:
<javacpp.version>1.4.1</javacpp.version>
<ffmpeg.version>3.4.2-1.4.1</ffmpeg.version>
#### base64字符串decode为byte[]
base64Ifream 是从其他服务得到的视频帧数据
接口数据如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200908190035695.png#pic_center)
获取base64字符串
```java
String base64Ifream = iframeResponse.getData().getIframe();
base64转为byte[]:
base解码使用的是commons-codec
commons-codec
是Apache开源组织提供的用于摘要运算、编码解码的包。常见的编码解码工具Base64、MD5、Hex、SHA1、DES等。
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
//导包
import org.apache.commons.codec.binary.Base64;
// 实现方法
public static byte[] decode2Byte(String base64) {
return (new Base64()).decode(base64.getBytes());
}
转码获取图片
/**
* 使用javaCV包进行转换,转换成Resource
*
* @param iframe base64视频帧字符串
* @return
* @throws FrameGrabber.Exception
*/
public static BufferedImage getBufferedImageJavaCV(String iframe) {
byte[] bytes = Base64Util.decode2Byte(iframe);
InputStream inputStream = new ByteArrayInputStream(bytes);
FFmpegFrameGrabber frameGrabber = null;
BufferedImage bufferedImage = null;
try {
frameGrabber = new FFmpegFrameGrabber(inputStream);
log.info("开始读流");
frameGrabber.start();
log.info("开始获取帧读流");
Frame frame = frameGrabber.grabImage();
Java2DFrameConverter converter = new Java2DFrameConverter();
log.info("开始转换图片");
bufferedImage = converter.convert(frame);
} catch (Exception e) {
log.error("视频转码失败:{}",e.getMessage());
} finally {
if(inputStream!=null){
try {
log.info("关闭inputStream");
inputStream.close();
} catch (IOException e) {
log.info("inputStream关闭异常");
}
}
if (frameGrabber != null) {
try {
log.info("关闭frameGrabber");
frameGrabber.stop();
} catch (FrameGrabber.Exception e) {
log.error("关闭视频处理程序失败:{}",e.getMessage());
}
}
}
return bufferedImage;
}
最后就是处理bufferedImage的流程