欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF

 更新時(shí)間:2022年11月21日 11:46:15   作者:yelangking1  
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。本文主要介紹了在Java中如何基于FFmpeg進(jìn)行Mp4視頻到Gif動(dòng)圖的轉(zhuǎn)換,感興趣的小伙伴可以了解一下

背景

在一些業(yè)務(wù)場(chǎng)景中,會(huì)有如下的一些要求:比如有用戶需要將Mp4視頻轉(zhuǎn)為Gif動(dòng)圖。當(dāng)然有一些小伙伴說可以使用系統(tǒng)截圖,然后使用之前提到過的技術(shù):GIF圖像動(dòng)態(tài)生成-JAVA后臺(tái)生成。需要處理的素材比較少,就一兩個(gè)視頻,確實(shí)可以通過這種方式來處理。試想一下,如果需要處理上百個(gè),做處理的小伙伴是不是就抓狂了,這完全是實(shí)打?qū)嵉墓ぷ髁俊D怯袥]有直接從Mp4轉(zhuǎn)成gif動(dòng)態(tài)圖的技術(shù)呢?運(yùn)營的小伙伴就能按時(shí)下班了。

經(jīng)過一番查詢,找到一些思路,Mp4視頻的組成也是一幀一幀的圖像組成的。如果有什么技術(shù)可以去動(dòng)態(tài)獲取這些數(shù)據(jù),通過動(dòng)態(tài)截取每一幀,最后再合成圖片。不久解決了嗎?FFmpeg變進(jìn)入技術(shù)選型的視野。本文主要講解如何在Java中,使用FFmpeg進(jìn)行視頻的幀讀取,并最終合并成Gif動(dòng)態(tài)圖。

一、FFmpeg是什么

1、簡介

FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。FFmpeg在Linux平臺(tái)下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Max Os等。這個(gè)項(xiàng)目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)。許多FFmpeg的開發(fā)人員都來自項(xiàng)目MPlayer,而且當(dāng)前FFmpeg也是放在MPlayer項(xiàng)目組的服務(wù)器上。

2、FFmpeg功能列表

FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。它包括了領(lǐng)先的音/視頻編碼庫libavcodec等。

  • libavformat:用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能;
  • libavcodec:用于各種類型聲音/圖像編解碼;
  • libavutil:包含一些公共的工具函數(shù);
  • libswscale:用于視頻場(chǎng)景比例縮放、色彩映射轉(zhuǎn)換;
  • libpostproc:用于后期效果處理;
  • ffmpeg:該項(xiàng)目提供的一個(gè)工具,可用于格式轉(zhuǎn)換、解碼;
  • ffsever:一個(gè) HTTP 多媒體即時(shí)廣播串流服務(wù)器;
  • ffplay:是一個(gè)簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;

二、Java集成JavaCV調(diào)用FFmpeg

1、JavaCv引入

JavaCv是基于openCv的一個(gè)非常強(qiáng)大的庫,關(guān)于javaCv以后計(jì)劃做幾次講解,這里不深入,有興趣的小伙伴可以先行學(xué)習(xí)。在工程中新建一個(gè)Maven工程,在Pom.xml中引入支持,需要注意的是,這里為了演示簡單,引入了完整的JavaCv的包,在實(shí)際項(xiàng)目中不需要如此,按需引入即可。

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yelang</groupId>
    <artifactId>mp42gif</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.madgag/animated-gif-lib -->
        <dependency>
            <groupId>com.madgag</groupId>
            <artifactId>animated-gif-lib</artifactId>
            <version>1.4</version>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        
        <!-- lombok 代碼自動(dòng)生成組件 add by wuzuhu on 2022-11-01 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

2、視頻轉(zhuǎn)換讀取

public static void main(String[] args) {
    // 將指定目錄的 MP4 文件生成同名的 gif 文件
    File videoDir = new File("E:/testv");
    for (File file : videoDir.listFiles()) {
        String videoPath = file.getPath();
        if (videoPath.endsWith(".mp4")) {
            String gifPath = videoPath.substring(0, videoPath.lastIndexOf(".")) + ".gif";
            try {
                video2Gif(videoPath, gifPath);
                System.out.println("轉(zhuǎn)換完成");
            } catch (Exception e) {
                System.out.println("文件 [" + videoPath + "] 處理異常!");
                e.printStackTrace();
            }
        }
    }
}

上面定義了一個(gè)main函數(shù)調(diào)用,只是一個(gè)簡單的示例,實(shí)際項(xiàng)目需要自己擴(kuò)展。核心的視頻轉(zhuǎn)換函數(shù)如下:

private static void video2Gif(String videoPath, String gifPath) throws Exception {
    try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);
            FileOutputStream targetFile = new FileOutputStream(gifPath)) {
        grabber.start();
        int frames = grabber.getLengthInFrames();
        System.out.println(frames);
        AnimatedGifEncoder encoder = new AnimatedGifEncoder();
        encoder.setFrameRate(frames);
        encoder.start(targetFile);
        Java2DFrameConverter converter = new Java2DFrameConverter();
        for (int i = 0; i < frames; i += 8) {// 8幀合成1幀?(反正越大動(dòng)圖越小、越快)
            encoder.setDelay((int) grabber.getDelayedTime());
            encoder.addFrame(converter.convert(grabber.grabImage()));
            grabber.setFrameNumber(i);
        }
            
        encoder.finish();
    }
}

通過FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);獲取視頻信息,同時(shí)調(diào)用grabber.start();進(jìn)行視頻讀?。ㄟ@一步必須要設(shè)置,否則會(huì)影響后面的結(jié)果)。通過int frames = grabber.getLengthInFrames();獲取Mp4視頻的幀數(shù),再循環(huán)幀,即可。上述的代碼中不是讀取每一幀,這樣生成的結(jié)果會(huì)非常大,建議不要全部讀取。

for (int i = 0; i < frames; i += 8) {// 8幀合成1幀)
    encoder.setDelay((int) grabber.getDelayedTime());
    encoder.addFrame(converter.convert(grabber.grabImage()));
    grabber.setFrameNumber(i);
}

3、運(yùn)行結(jié)果

使用一段視頻來測(cè)試相應(yīng)的功能能否正常生效,在E盤新建一個(gè)mp4視頻文件。

使用上述視頻來驗(yàn)證代碼是否正確運(yùn)行,通過Debug來觀察程序的運(yùn)行。

最后在測(cè)試的目錄中,發(fā)現(xiàn)已經(jīng)成功生成對(duì)應(yīng)的gif圖片,拖到瀏覽器中可以正常展示。

三、總結(jié)

本文主要簡單介紹了在Java中如何基于FFmpeg進(jìn)行Mp4視頻到Gif動(dòng)圖的轉(zhuǎn)換。首先簡單講解FFmpeg的定義,常用的方法,然后重點(diǎn)介紹JavaCv中FFmpeg具體使用,如果在工作中有這種需要,不妨采用這種方式。

以上就是Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF的詳細(xì)內(nèi)容,更多關(guān)于Java FFmpeg Mp4轉(zhuǎn)GIF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論