Java截取视频第一帧返回InputStream,用于视频上传后作为封面

引入maven依赖

<dependency>
	<groupId>org.bytedeco</groupId>
	<artifactId>javacv-platform</artifactId>
	<version>1.4.3</version>
</dependency>

因为上面的依赖包含的jar包太多,所以我们需要排除一些东西

	<dependency>
		<groupId>org.bytedeco</groupId>
		<artifactId>javacv</artifactId>
		<version>1.4.3</version>
		<exclusions>
			<exclusion>
				<groupId>org.bytedeco</groupId>
				<artifactId>javacpp</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>flycapture</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>libdc1394</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>libfreenect</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>libfreenect2</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>librealsense</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>videoinput</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>opencv</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>tesseract</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>leptonica</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>flandmark</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>artoolkitplus</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	<dependency>
		<groupId>org.bytedeco</groupId>
		<artifactId>javacv-platform</artifactId>
		<version>1.4.3</version>
		<exclusions>
			<exclusion>
				<groupId>org.bytedeco</groupId>
				<artifactId>javacv</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>flycapture-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>libdc1394-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>libfreenect-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>libfreenect2-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>librealsense-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>videoinput-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>opencv-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>tesseract-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>leptonica-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>flandmark-platform</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.bytedeco.javacpp-presets</groupId>
				<artifactId>artoolkitplus-platform</artifactId>
			</exclusion>
		</exclusions>
	</dependency>

获取视频帧返回InputStream

public class getImgUtil {

    // 获取要取得的帧数
    private static final int fifthFrame= 5;

    /**
     * @param InputStream  需要截取帧的视频的字节输入流
     *
     * @return 
     */
    public static InputStream getImg(InputStream is) {
        FFmpegFrameGrabber grabber;
        InputStream img=null ;
        try {
            grabber = new FFmpegFrameGrabber(is);

            grabber.start();
            // 视频总帧数
            int videoLength = grabber.getLengthInFrames();

            Frame frame = null;
            int i = 0;
            while (i < videoLength) {
                // 过滤前5帧,因为前5帧可能是全黑的
                frame = grabber.grabFrame();
                if ((i > fifthFrame) && (frame.image != null)) {
                    break;
                }
                i++;
            }

            Java2DFrameConverter converter = new Java2DFrameConverter();
            // 绘制图片
            BufferedImage bi = converter.getBufferedImage(frame);
            img = bufferedImageToInputStream(bi);
            
            grabber.stop();
            grabber.close();
          

        } catch (IOException e) {
            e.printStackTrace();
        }

        return img;
    }
    /**
	 * 将BufferedImage转换为InputStream
	 * @param image
	 * @return
	 */
	public static InputStream bufferedImageToInputStream(BufferedImage image){
	    ByteArrayOutputStream os = new ByteArrayOutputStream();
	    try {
	        ImageIO.write(image, "png", os);
	        InputStream input = new ByteArrayInputStream(os.toByteArray());
	        return input;
	    } catch (IOException e) {
	    	
	    }
	    return null;
	}

猜你喜欢

转载自blog.csdn.net/u010210963/article/details/107457254