javaCV实现视频帧转码保存为图片

最近使用到了javaCV进行视频帧转码,记录一下项目中使用javaCV的对h264/h265的视频帧的base64字符串转成jpg图片的一次实现

功能流程:




<javacpp.version>1.4.1</javacpp.version>

<ffmpeg.version>3.4.2-1.4.1</ffmpeg.version>




org.bytedeco
javacpp
${javacpp.version}



org.bytedeco
javacv
${javacpp.version}



org.bytedeco.javacpp-presets
ffmpeg-platform
${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的流程

posted @ 2022-07-22 10:01  狮子挽歌丿  阅读(2374)  评论(0编辑  收藏  举报