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

JAVA代碼調(diào)用ffmpeg程序進(jìn)行視頻轉(zhuǎn)碼和推流方式

 更新時(shí)間:2025年02月07日 09:29:29   作者:F0urtEEn  
本文介紹了如何通過Java代碼調(diào)用FFmpeg進(jìn)行多媒體視頻處理,包括兩種方式:使用第三方封裝的jar包和使用ProcessBuilder類創(chuàng)建進(jìn)程,兩種方式各有優(yōu)缺點(diǎn),選擇時(shí)需根據(jù)具體需求和場景

一、前言

FFmpeg是一款多媒體視頻處理工具,有非常強(qiáng)大的功能包括:視頻采集、視頻推流、視頻格式轉(zhuǎn)換、視頻抓圖、給視頻加水印等功能。

FFmpeg本身是一個(gè)命令行程序,需要通過執(zhí)行 ffmpeg命令來實(shí)現(xiàn)功能,如下:

ffmpeg -i 123.mp4 -c:a copy -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/test
ffmpeg -i 123.mp4 -c copy -f hls -hls_list_size 5 -hls_flags 50 -hls_time 10 D:\hls\test.m3u8

在實(shí)際開發(fā)工作中,會需要通過JAVA代碼去調(diào)用ffmpeg程序去完成功能,而不是手動去執(zhí)行ffmpeg命令。本篇文章將介紹如何通過JAVA代碼去調(diào)用執(zhí)行ffmpeg程序。

二、JAVA代碼調(diào)用ffmpeg

本篇文章將介紹兩種方式實(shí)現(xiàn) JAVA代碼去調(diào)用ffmpeg程序。

方式一:采用第三方封裝調(diào)用ffmpeg接口的jar包實(shí)現(xiàn)

1. 在Maven項(xiàng)目pom.xml文件中引入jar包依賴

<dependency>
    <groupId>net.bramp.ffmpeg</groupId>
    <artifactId>ffmpeg</artifactId>
    <version>0.6.2</version>
</dependency>

2. 編寫java代碼

//創(chuàng)建FFmpeg對象
FFmpeg ffmpeg = new FFmpeg("D:\\ffmpeg\\bin\\ffmpeg.exe");     //參數(shù)是:ffmpeg命令工具的安裝路徑
        
//創(chuàng)建FFmpegBuilder對象,設(shè)置推流/轉(zhuǎn)碼參數(shù)
FFmpegBuilder builder = new FFmpegBuilder()
        .setInput("D:\\111.mp4")                                   //輸入視頻源地址
        .overrideOutputFiles(true)                                //設(shè)置是否覆蓋已存在的輸出文件
        .addOutput("D:\\hls\\test.m3u8")                         //輸出流地址
        .setFormat("hls")                                       //輸出流格式 -f hls
        .setAudioCodec("copy")                                  //設(shè)置音頻轉(zhuǎn)碼  copy表示不轉(zhuǎn)碼
        .setVideoCodec("libx264")                               //設(shè)置視頻轉(zhuǎn)碼  copy表示不轉(zhuǎn)碼
        .setVideoQuality(1)                                     //設(shè)置視頻質(zhì)量,一般為1到5(1代表質(zhì)量最高)
        .setVideoFrameRate(25)                                  //設(shè)置視頻幀率
        .addExtraArgs("-t", "30")                               //設(shè)置推流持續(xù)時(shí)間
        .addExtraArgs("-hls_list_size", "5")                    //設(shè)置輸出文件個(gè)數(shù)(hls輸出流特有的參數(shù))
        .addExtraArgs("-hls_flags", "50")                       //設(shè)置輸出文件替換(hls輸出流特有的參數(shù))
        .addExtraArgs("-hls_time", "6")                        //設(shè)置輸出文件每個(gè)時(shí)長多少秒(hls輸出流特有的參數(shù))
        .done();                                               //最后調(diào)用done()完成參數(shù)配置


//創(chuàng)建FFmpegExecutor對象,用于執(zhí)行ffpmeg轉(zhuǎn)流任務(wù)
FFmpegExecutor executor=new FFmpegExecutor(ffmpeg);

//執(zhí)行ffpmeg轉(zhuǎn)流任務(wù),并添加了監(jiān)聽器ProgressListener,可以監(jiān)聽ffpmeg運(yùn)行狀態(tài)情況
executor.createJob(builder, new ProgressListener() {     
    @Override
    public void progress(Progress progress) {
        System.out.println("-----------");
        System.out.println(progress);
    }
}).run();

3. 第三方j(luò)ar包實(shí)現(xiàn)優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn):封裝好了ffmpeg調(diào)用功能,代碼實(shí)現(xiàn)簡單易用
  • 缺點(diǎn):沒有提供停止ffmpeg程序的方法,無法實(shí)現(xiàn)手動終止任務(wù)。就算手動殺死JAVA程序也無法終止ffmpeg程序的執(zhí)行,只有等ffmpeg轉(zhuǎn)流任務(wù)完成了程序自行停止。

方式二:采用ProcessBuilder類創(chuàng)建進(jìn)程的方式調(diào)用ffmpeg實(shí)現(xiàn)

ProcessBuilder 類是JDK中java.lang包下提供的用于創(chuàng)建操作系統(tǒng)進(jìn)程的類, 可以通過JDK API 文檔查看其用法。

1. 編寫java代碼

//創(chuàng)建一個(gè)命令List集合,用于存放ffmpeg執(zhí)行的命令參數(shù)
List<String> command = new ArrayList<>();
command.add("D:\\ffmpeg\\bin\\ffmpeg.exe");
command.add("-i");
command.add("D:\\123.mp4");         //輸入視頻源或者流地址
command.add("-c");
command.add("copy");
command.add("-f");
command.add("hls");
command.add("-hls_time");
command.add("10");
command.add("-hls_list_size");
command.add("5");
command.add("-hls_flags");
command.add("50");
command.add("D:\\hls\\test.m3u8");   //輸出流地址

//創(chuàng)建ProcessBuilder對象,傳入集合
ProcessBuilder builder = new ProcessBuilder(command);
//start()方法創(chuàng)建一個(gè)系統(tǒng)進(jìn)程,執(zhí)行ffmpeg命令工具
Process process = builder.start();


//注意:使用ProcessBuilder執(zhí)行任務(wù),必須要手動接收正常輸出信息和錯(cuò)誤輸出信息,不然ProcessBuilder任務(wù)會阻塞卡住

//多線程讀取正常輸出信息 process.getInputStream()
new Thread(() -> {
    try {
        InputStream is = process.getInputStream();
		//將正常輸出信息寫入到normal.txt文件中
		RandomAccessFile raf = new RandomAccessFile("D:\\normal.txt", "rw");
		
        byte[] data = new byte[128];
        int len = -1;
        while((len = is.read(data)) != -1) {
            raf.write(data, 0, len);
        }
        raf.close();
    } catch (IOException e) {
       e.printStackTrace();
    }
}, "Thread-Normal").start();


//多線程讀取錯(cuò)誤輸出信息 process.getErrorStream()
new Thread(() -> {
    try {
        InputStream is = process.getErrorStream();
		//將錯(cuò)誤輸出信息寫入到error.txt文件中
		RandomAccessFile raf = new RandomAccessFile("D:\\error.txt", "rw");
		
        byte[] data = new byte[128];
        int len = -1;
        while((len = is.read(data)) != -1) {
            raf.write(data, 0, len);
        }
        raf.close();
    } catch (IOException e) {
       e.printStackTrace();
    }
}, "Thread-Error").start();



//destroy()方法可以停止進(jìn)程,從而終止ffmpeg程序
//process.destroy();

2. ProcessBuilder實(shí)現(xiàn)優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn):可以手動調(diào)用destory()方法隨時(shí)停止ffmpeg程序的執(zhí)行
  • 缺點(diǎn):需要手動寫代碼去主動接收任務(wù)進(jìn)程產(chǎn)生的正常輸出信息和錯(cuò)誤信息,不然進(jìn)程會被卡住。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解如何修改idea配置文件位置從C盤更改到D盤

    詳解如何修改idea配置文件位置從C盤更改到D盤

    這篇文章主要給大家介紹了關(guān)于如何將idea的配置文件從默認(rèn)的C盤調(diào)整到D盤,從而節(jié)省C盤使用空間,具有很好的參考價(jià)值,希望對大家有所幫助,需要的朋友可以參考下
    2023-10-10
  • Java排序算法總結(jié)之堆排序

    Java排序算法總結(jié)之堆排序

    這篇文章主要介紹了Java排序算法總結(jié)之堆排序,詳細(xì)分析了堆排序的原理與java實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • Java異常 Exception類及其子類(實(shí)例講解)

    Java異常 Exception類及其子類(實(shí)例講解)

    下面小編就為大家?guī)硪黄狫ava異常 Exception類及其子類(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Spring啟動后獲取所有擁有特定注解的Bean實(shí)例代碼

    Spring啟動后獲取所有擁有特定注解的Bean實(shí)例代碼

    這篇文章主要介紹了Spring啟動后獲取所有擁有特定注解的Bean實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • springboot靜態(tài)資源的配置方式

    springboot靜態(tài)資源的配置方式

    這篇文章主要介紹了springboot靜態(tài)資源的配置方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java 坐標(biāo)系相互轉(zhuǎn)換方式

    Java 坐標(biāo)系相互轉(zhuǎn)換方式

    這篇文章主要介紹了Java中的坐標(biāo)系相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解Springboot整合Dubbo之代碼集成和發(fā)布

    詳解Springboot整合Dubbo之代碼集成和發(fā)布

    本篇文章主要介紹了Springboot整合Dubbo之代碼集成和發(fā)布,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • 關(guān)于Spring MVC同名參數(shù)綁定問題的解決方法

    關(guān)于Spring MVC同名參數(shù)綁定問題的解決方法

    Spring MVC中的參數(shù)綁定還是蠻重要的,最近在使用中遇到了同名參數(shù)綁定的問題,想著總結(jié)分享出來,下面這篇文章主要給大家介紹了關(guān)于Spring MVC同名參數(shù)綁定問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • 解讀HttpServletRequestWrapper處理request數(shù)據(jù)流多次讀取問題

    解讀HttpServletRequestWrapper處理request數(shù)據(jù)流多次讀取問題

    在Java Web開發(fā)中,獲取HTTP請求參數(shù)是常見需求,本文詳細(xì)討論了通過POST方式獲取參數(shù)的兩種主要方法:使用request.getParameter()適用于application/x-www-form-urlencoded和multipart/form-data內(nèi)容類型;而對于application/json類型的數(shù)據(jù)
    2024-10-10
  • java反射_改變private中的變量及方法的簡單實(shí)例

    java反射_改變private中的變量及方法的簡單實(shí)例

    下面小編就為大家?guī)硪黄猨ava反射_改變private中的變量及方法的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論

新源县| 湖北省| 浦东新区| 石渠县| 黑水县| 沙坪坝区| 乌审旗| 洛阳市| 浙江省| 思茅市| 洛川县| 永安市| 新巴尔虎左旗| 京山县| 景泰县| 双牌县| 固镇县| 白玉县| 东平县| 昌图县| 遂宁市| 阿拉善左旗| 汝州市| 兴文县| 白银市| 邹平县| 虞城县| 齐齐哈尔市| 炎陵县| 绥滨县| 布尔津县| 博客| 清远市| 衢州市| 河池市| 黄山市| 彝良县| 孟连| 江川县| 佛山市| 望江县|