java生成視頻縮略圖


java生成視頻縮略圖

需要給前端返回視頻的縮略圖鏈接,本來使用的是阿里雲的OSS,它提供了縮略圖功能的,但是最近換成了Minio....就只有自己寫了;

要求:返回給前端一個連接,縮略圖實時生成,不會保存.

使用javacv包

參考:https://www.cnblogs.com/yy136/p/9608985.html

流程: 先從Minio中讀取視頻,然后使用javacv獲取某一幀的圖,最后使用thumbnailator將圖片壓縮

但是,視頻幾十上百M的時候很慢,大視頻1分鍾都出不來_(:з」∠)_
若是縮略圖會保存起來,使用的時候直接讀取縮略圖的話,這個方案還可以,但是實時讀取就不行了

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

使用

    public void getViewResize(GlobalAccessoryFile accessory) throws Exception  {
        // 獲取Minio服務
        MinioClient client = this.getOSSClient();
        //從服務器獲取圖片
        InputStream inputStream = client.getObject(GetObjectArgs.builder()
                                         .bucket(ossCfg.bucketName) //桶
                                         .object(accessory.getFileDirectoryPath()) //圖片在桶內位置
                                          .build());

            FFmpegFrameGrabber grabber;
            InputStream img = null;
            try {
                grabber = new FFmpegFrameGrabber(inputStream,0);

                grabber.start();
                // 視頻總幀數
                int videoLength = grabber.getLengthInFrames();

                Frame frame = null;
                int i = 0;

                while (i < videoLength) {
                    // 過濾前5幀,因為前5幀可能是全黑的
                    frame = grabber.grabFrame();
                    if (i>5&&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();
            }

            HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
            response.setContentType("multipart/form-data");

            int h = accessory.getTHeight() != null ? accessory.getTHeight() : 200;

            Thumbnails.Builder<? extends InputStream> tb = Thumbnails.of(img).height(h);
            if (accessory.getTWidth() != null) {
                tb.width(accessory.getTWidth());
            }

            tb.toOutputStream(response.getOutputStream());

    }
    /**
     * 將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;
    }

vidio查看--失敗了

本來用這種方法,看着沒有加載視頻以為是成功了,后來發現,是之前瀏覽器緩存了,強制刷新之后還是會加載整個視頻_(:з」∠)_

直接返回給前端查看視頻的鏈接,前端使用這個連接顯示縮略圖
比如我的視頻鏈接是 http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34

前端需要縮略圖展示的時候(這樣會自動展示縮略圖,並且沒有操作按鈕)

<video height="200px" width="200" src="http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34"/>

前端需要播放視頻的時候

<video controls   height="800px" width="1000" style="outline: none;width:100%" autoplay  src="http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34"/>

前端下載

<a href="http://192.168.3.179:9111/achieve8321280.mov?X-Amz-Algorithm=Aac6f7a9e6a34" download="achieve8321280.mov">視頻下載</a>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM