最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java工程使用ffmpeg進行音視頻格式轉換的實現(xiàn)

 更新時間:2024年02月07日 10:06:43   作者:和光同塵ss  
FFmpeg是一套可以用來記錄、轉換數(shù)字音頻、視頻,并能將其轉化為流的開源計算機程序,本文主要介紹了Java工程使用ffmpeg進行音視頻格式轉換的實現(xiàn)

ws.schild簡介

JAVE (Java Audio Video Encoder)是一個純Java的音視頻編碼器和解碼器庫,它是基于FFmpeg。JAVE庫提供了一些簡單易用的API,用于音頻和視頻格式的轉換、編碼、解碼等操作。它對于一些基本的音視頻處理任務來說是一個不錯的選擇。

這些庫都是基于FFmpeg的,并允許在Java中處理音頻和視頻文件。使用它們可以避免直接調用外部的FFmpeg命令行工具,而是通過Java API來實現(xiàn)音頻格式轉換等操作。

ws.schild是目前主流的對視頻和音頻進行轉碼、裁剪以及提取操作的JAVE工具包。

一、主要工具類簡介

1. VideoAttributes

VideoAttributes是ws.schild工具包中對視頻屬性設置的重要工具類,是ws.schild實現(xiàn)對視頻操作的重中之重,同時也是應用最多的一個類。

使用心得:(下文中video為該類的實例化對象)

1.video的Quality(視頻質量)屬性對轉碼后視頻的大小有很大的影響,并且對轉碼的時間也有一定的影響,主要影響視頻質量,參數(shù)類型是整形,數(shù)值越小表示質量越高。

2.video的size(視頻尺寸)屬性對轉碼后視頻的大小有較大的影響,并且對轉碼的時間也有一定的影響,參數(shù)類型是VideoSize。

3.video的BitRate(比特率)屬性對轉碼視頻的大小和時間都影響較大,主要影響視頻的流暢程度,一般設置的需要大一些,如100k(針對已測試過的視頻,不敢保證普遍性)。

4.video的Codec(編解碼器)屬性一般設置為mpeg4或者h264。

5.video的FrameRate(幀率)屬性不要設置的太低,一般設置為15及以上,如果設置太小視頻會不流暢。

2. AudioAttributes

AudioAttributes是ws.schild工具包中對音頻屬性設置的重要工具類。

二、使用步驟

1. 導入ws.schild的jar包

maven地址:https://mvnrepository.com/artifact/ws.schild/jave-all-deps

在maven庫里可以看到ws.schild其下有好幾個包

  • jave-core
  • jave-nativebin-win32
  • jave-nativebin-win64
  • jave-nativebin-linux32
  • jave-nativebin-linux64
  • jave-nativebin-osx64

jave-all-deps 是最完整的,它的pom.xml引用了所有版本的文件

看名字就能看出,jave-core是核心包,其它幾個是windows、linux、maxosx系統(tǒng)下的本地文件。其實nativebin里面就是一個類似ffmpeg.exe的文件,程序在運行時拼接參數(shù),再調用對應的ffmpeg去執(zhí)行。

首先在pom文件中導入第三方jar包:

	<dependency>
      <groupId>ws.schild</groupId>
      <artifactId>jave-all-deps</artifactId>
      <version>3.3.1</version>
    </dependency>

確定運行平臺后可以將其他包排除,如服務在Linux系統(tǒng)跑,就可以將Windows、macos平臺的包排除。

        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-all-deps</artifactId>
            <version>3.3.1</version>
            <exclusions>
                 <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-win32</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-win64</artifactId>
                </exclusion> 
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-osx64</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-osxm1</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2. 實現(xiàn)視頻的轉碼

將視頻轉碼為H.264編碼(包括音頻轉碼):

/**
     * 視頻轉碼
     * @param videoSource
     * @param videoTarget
     * @return true or false
     */
    public static boolean videoToVideo(String videoSource, String videoTarget) {
//        Date time = new Date();
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
//        System.out.println(simpleDateFormat.format(time));

        long start = System.currentTimeMillis();

        File source = new File(videoSource);
        File target = new File(videoTarget);

        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("aac");
        audio.setBitRate(236000 / 2);
        audio.setChannels(2);
        audio.setSamplingRate(8000);

        VideoAttributes video = new VideoAttributes();
        video.setCodec("h264");
        video.setBitRate(1000000);
        video.setFrameRate(25);
        video.setQuality(4);
//        video.setSize(new VideoSize(720, 480));

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setOutputFormat("mp4");
        attrs.setAudioAttributes(audio);
        attrs.setVideoAttributes(video);


        Encoder encoder = new Encoder();
        try {
            encoder.encode(new MultimediaObject(source), target, attrs);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(encoder.getUnhandledMessages());
            return false;
        }finally {
//            time = new Date();
//            System.out.println(simpleDateFormat.format(time));
            long end = System.currentTimeMillis();
            System.out.println("總耗時:"+ (end-start) +"ms");
        }
    }

3. 實現(xiàn)音頻的轉碼

將音頻轉碼為mp3編碼:

audioPath可以為amr、wav、m4r等其他音頻格式的文件。

/**
     * 音頻轉換為mp3格式,audioPath可更換為要轉換的音頻格式
     * @param audioPath
     * @param mp3Path
     */
    public static void toMp3(String audioPath,String mp3Path){
        File source = new File(audioPath);
        File target = new File(mp3Path);
        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("libmp3lame");
        audio.setBitRate(128000);
        audio.setChannels(2);
        audio.setSamplingRate(44100);

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setOutputFormat("mp3");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        try {
            encoder.encode(new MultimediaObject(source), target, attrs);
        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }

4. 實現(xiàn)視頻文件轉為音頻文件

將視頻轉為音頻:

/**
     * 視頻文件轉音頻文件
     * @param videoPath
     * @param audioPath
     * return true or false
     */
    public static boolean videoToAudio(String videoPath, String audioPath){
        File fileMp4 = new File(videoPath);
        File fileMp3 = new File(audioPath);

        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("libmp3lame");
        audio.setBitRate(128000);
        audio.setChannels(2);
        audio.setSamplingRate(44100);

        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setOutputFormat("mp3");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        MultimediaObject mediaObject = new MultimediaObject(fileMp4);
        try{
            encoder.encode(mediaObject,fileMp3,attrs);
            Log.info("File MP4 convertito MP3");
            return true;
        }catch (Exception e){
            Log.error("File non convertito");
            Log.error(e.getMessage());
            return false;
        }
    }

總結

執(zhí)行原理大致是:

1、服務啟動后ws.schild工具包會將與運行系統(tǒng)匹配的ffmpeg可執(zhí)行文件,一般Windows系統(tǒng)是將ffmpeg-amd64-3.3.1.exe下載到此路徑下:C:\Users\xxx\AppData\Local\Temp\jave (xxx是你的用戶文件)。

2、用java代碼拼接ffmpeg指令的參數(shù),以及源文件路徑和目標文件路徑,而后調用encode語句將指令發(fā)給ffmpeg執(zhí)行。

ffmpeg指令的參數(shù)講解可以看看上一篇文章:ffmpeg安裝及音頻轉換指令應用(win10)

綜上,ws.schild 工具包可以非常方便的幫助我們實現(xiàn)對視頻和音頻的轉碼和裁剪等操作,并且可以通過設置不同參數(shù)來滿足不同的需求。但是就目前的測試結果而言,不同的編碼格式對于參數(shù)的敏感度可能不同,具體場景應該具體分析。

參考鏈接:

https://github.com/a-schild/jave2

http://www.fzitv.net/program/315429ev9.htm

https://blog.csdn.net/liuchongming/article/details/106994861

到此這篇關于Java工程使用ffmpeg進行音視頻格式轉換的實現(xiàn)的文章就介紹到這了,更多相關Java ffmpeg音視頻轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析對Spring?aware接口理解

    淺析對Spring?aware接口理解

    通過aware接口可以獲取Spring容器相關信息,但這樣會與Spring容器耦合,這篇文章主要介紹了Spring?aware接口理解,需要的朋友可以參考下
    2022-08-08
  • Springboot中JWT登錄校驗及其攔截器實現(xiàn)方法

    Springboot中JWT登錄校驗及其攔截器實現(xiàn)方法

    這篇文章主要介紹了Springboot中JWT登錄校驗及其攔截器實現(xiàn)方法的相關資料,包括引入Maven坐標、獲取Token、JWT攔截器的實現(xiàn)和配置,通過這些步驟可以實現(xiàn)后端對用戶登錄的身份校驗,需要的朋友可以參考下
    2025-11-11
  • Java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法

    Java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法

    我們開發(fā)微信小程序的過程中,我們的服務端有時需要獲取微信提供的開放數(shù)據(jù)。微信會對這些開放數(shù)據(jù)做簽名和加密處理,本文通過實例代碼給大家介紹Java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法,感興趣的朋友一起看看吧
    2021-11-11
  • JavaWeb 實現(xiàn)驗證碼功能(demo)

    JavaWeb 實現(xiàn)驗證碼功能(demo)

    在 WEB-APP 中一般應用于:登錄、注冊、買某票、秒殺等場景,大家都接觸過這個驗證碼操作,今天小編通過實例代碼給大家講解javaweb實現(xiàn)驗證碼功能,需要的朋友參考下
    2017-02-02
  • java藍橋杯歷年真題及答案整理(小結)

    java藍橋杯歷年真題及答案整理(小結)

    這篇文章主要介紹了java藍橋杯歷年真題及答案整理(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • RocketMQ實現(xiàn)消息分發(fā)的步驟

    RocketMQ實現(xiàn)消息分發(fā)的步驟

    RocketMQ 實現(xiàn)消息分發(fā)的核心機制是通過 Topic、Queue 和 Consumer Group 的配合實現(xiàn)的,下面給大家介紹RocketMQ實現(xiàn)消息分發(fā)的步驟,感興趣的朋友一起看看吧
    2024-03-03
  • JVM(Java虛擬機)簡介(動力節(jié)點Java學院整理)

    JVM(Java虛擬機)簡介(動力節(jié)點Java學院整理)

    Java虛擬機(Jvm)是可運行Java代碼的假想計算機。Java虛擬機包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。對java jvm 虛擬機感興趣的朋友通過本文一起學習吧
    2017-04-04
  • Java設計模式之java策略模式詳解

    Java設計模式之java策略模式詳解

    這篇文章主要介紹了Java經(jīng)典設計模式之策略模式,簡單說明了策略模式的概念、原理并結合實例形式分析了java策略模式的具有用法與相關注意事項,需要的朋友可以參考下
    2021-09-09
  • Java ArrayList與LinkedList使用方法詳解

    Java ArrayList與LinkedList使用方法詳解

    Java中容器對象主要用來存儲其他對象,根據(jù)實現(xiàn)原理不同,主要有3類常用的容器對象:ArrayList使用數(shù)組結構存儲容器中的元素、LinkedList使用鏈表結構存儲容器中的元素
    2022-11-11
  • Mybatis批處理、Mysql深分頁操作

    Mybatis批處理、Mysql深分頁操作

    這篇文章主要介紹了Mybatis批處理、Mysql深分頁操作,Mybatis批量操作包括Foreach方式和ExecutorType.BATCH插入操作,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08

最新評論

遂昌县| 土默特左旗| 奉贤区| 册亨县| 宿松县| 鹤峰县| 长顺县| 自贡市| 绍兴县| 美姑县| 衡阳县| 宁化县| 朝阳市| 嘉善县| 皮山县| 吴桥县| 宜兴市| 新巴尔虎右旗| 阿荣旗| 芦山县| 辛集市| 合肥市| 通海县| 客服| 正镶白旗| 同心县| 安仁县| 大冶市| 渝北区| 五家渠市| 同仁县| 嘉鱼县| 镇宁| 兴国县| 全椒县| 上饶市| 东宁县| 太仆寺旗| 满城县| 松潘县| 阿克苏市|