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

使用Java+FFmpeg實(shí)現(xiàn)視頻分片合并(生成list.txt自動(dòng)合并)

 更新時(shí)間:2026年02月03日 09:17:49   作者:Knight_AL  
在很多視頻處理場(chǎng)景中,我們會(huì)將一個(gè)錄制任務(wù)拆成多個(gè)小片段,多個(gè)分片合并成一個(gè)完整視頻是一個(gè)常見需求,所以本文給大家介紹了Java 調(diào)用 FFmpeg 生成用于合并的視頻列表文件 list.txt,并執(zhí)行合并命令生成最終視頻,需要的朋友可以參考下

在很多視頻處理場(chǎng)景中,我們會(huì)將一個(gè)錄制任務(wù)拆成多個(gè)小片段(如 seg1.mp4、 seg2.mp4、 seg3.mp4 等)。多個(gè)分片合并成一個(gè)完整視頻是一個(gè)常見需求。

Java 調(diào)用 FFmpeg 生成用于合并的視頻列表文件 list.txt,并執(zhí)行合并命令生成最終視頻。

一、FFmpeg 的 concat 合并機(jī)制

FFmpeg 支持一種簡(jiǎn)潔的合并方式 — concat demuxer,它要求:

? 所有分片編碼格式一致
? 生成的合并列表文件每行格式:

file 'path/to/seg1.mp4'
file 'path/to/seg2.mp4'
file 'path/to/seg3.mp4'

然后調(diào)用:

ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

即可將多個(gè)文件無損合并成一個(gè)文件。([簡(jiǎn)書][1])

實(shí)現(xiàn)思路

實(shí)現(xiàn)分為三步:

  1. 生成合并列表文件(list.txt)
  2. 調(diào)用 FFmpeg 進(jìn)行合并
  3. 輸出合并結(jié)果

二、核心 Java 代碼示例

下面是一個(gè)完整的 Java 類示例,通過 ProcessBuilder 調(diào)用 FFmpeg 完成合并。

package com.donglin.skyzlm.event;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class MergeVideos {

    // ffmpeg 可執(zhí)行命令(系統(tǒng) PATH 中必須能執(zhí)行 ffmpeg)
    private static final String FFMPEG = "ffmpeg";

    public static void main(String[] args) {
        // 1)分片視頻列表
        List<String> clips = List.of(
                "seg1.mp4",
                "seg2.mp4",
                "seg3.mp4"
        );

        // 2)生成合并列表文件
        String listFilePath = "videos/list.txt";
        try {
            createConcatListFile(clips, listFilePath);
        } catch (IOException e) {
            System.err.println("生成 list.txt 失敗: " + e.getMessage());
            return;
        }

        // 3)合并輸出
        String output = "videos/merged.mp4";
        boolean success = mergeWithFFmpeg(listFilePath, output);

        System.out.println("合并 " + (success ? "成功" : "失敗") + ", 輸出:" + output);
    }

    /**
     * 生成 concat 的 list.txt
     */
    private static void createConcatListFile(List<String> clips, String listFilePath) throws IOException {
        File file = new File(listFilePath);
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            for (String clip : clips) {
                // FFmpeg concat list.txt 格式:file '路徑'
                writer.write("file '" + clip.replace("\\", "/") + "'");
                writer.newLine();
            }
        }
        System.out.println("生成 list.txt: " + file.getAbsolutePath());
    }

    /**
     * 調(diào)用 FFmpeg concat 合并
     */
    private static boolean mergeWithFFmpeg(String listFilePath, String outputPath) {
        try {
            ProcessBuilder pb = new ProcessBuilder(
                    FFMPEG,
                    "-f", "concat",
                    "-safe", "0",
                    "-i", listFilePath,
                    "-fflags", "+genpts",
                    "-c:v", "libx264",     // 可根據(jù)需要調(diào)整 codec
                    "-preset", "veryfast",
                    "-crf", "20",
                    "-c:a", "aac",
                    "-b:a", "128k",
                    "-movflags", "+faststart",
                    outputPath
            );

            // 合并 stdout 和 stderr 輸出
            pb.redirectErrorStream(true);

            Process process = pb.start();
            // 打印 FFmpeg 輸出(可選)
            new Thread(() -> {
                try (var is = process.getInputStream()) {
                    is.transferTo(System.out);
                } catch (IOException ignored) {}
            }).start();

            int exit = process.waitFor();
            return exit == 0;

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            return false;
        }
    }
}

三、代碼詳解

1. 生成合并列表文件

writer.write("file '" + clip.replace("\\", "/") + "'");
  • FFmpeg 要求每行以 file '...' 開頭
  • 用單引號(hào)包裹路徑
  • 替換反斜杠為正斜杠,適配不同 OS 路徑規(guī)則

這樣生成的文件示例可能是:

file 'seg1.mp4'
file 'seg2.mp4'
file 'seg3.mp4'

2. 調(diào)用 FFmpeg 合并

ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac ...

這里:

? -f concat:指定使用 concat demuxer
? -safe 0:允許使用任意路徑
? -c copy:如果不轉(zhuǎn)碼可以直接復(fù)制,他們保持原始編碼(若需要可自己調(diào)整)
? -movflags +faststart:讓視頻可以在網(wǎng)絡(luò)上邊下邊播

注意:如果分片編碼、分辨率、幀率一致,使用 -c copy 是更快/無損的方法。

四、大小寫混合或排序問題

如果你的分片文件名不是按順序排列,F(xiàn)Fmpeg 會(huì)按照文本列表順序合并。因此 list.txt 必須:

?? 按你想合并的順序?qū)懭朊總€(gè)路徑
?? 不要漏掉任何分片項(xiàng)

五、何時(shí)該用這個(gè)合并方案?

適合場(chǎng)景:

? 多個(gè) MP4 分片按時(shí)間順序拼接
? 文件編碼一致(H.264 + AAC)
? 希望無損合并
? 使用 Java 批量處理視頻任務(wù)

六、總結(jié)

?? FFmpeg 程序必須已安裝且可在系統(tǒng) PATH 中找到
?? 分片視頻參數(shù)必須一致(否則會(huì)導(dǎo)致合并失敗或輸出異常)
?? 如果分片太多,建議動(dòng)態(tài)生成 list.txt 并逐步合并

以上就是使用Java+FFmpeg實(shí)現(xiàn)視頻分片合并(生成list.txt自動(dòng)合并)的詳細(xì)內(nèi)容,更多關(guān)于Java FFmpeg視頻分片合并的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot整合RocketMQ極速實(shí)戰(zhàn)教程

    SpringBoot整合RocketMQ極速實(shí)戰(zhàn)教程

    本文詳細(xì)介紹了SpringBoot集成RocketMQ的全過程,涵蓋普通、廣播、順序、延遲、批量、過濾、事務(wù)等多種消息模式,通過自動(dòng)裝配、全局配置、核心組件等介紹RocketMQ與SpringBoot的深入集成原理與實(shí)戰(zhàn)應(yīng)用,感興趣的朋友一起看看吧
    2026-06-06
  • java中使用Filter控制用戶登錄權(quán)限具體實(shí)例

    java中使用Filter控制用戶登錄權(quán)限具體實(shí)例

    java中使用Filter控制用戶登錄權(quán)限具體實(shí)例,需要的朋友可以參考一下
    2013-06-06
  • IDEA中如何查找jar包之間的依賴關(guān)系并忽略依賴的某個(gè)包

    IDEA中如何查找jar包之間的依賴關(guān)系并忽略依賴的某個(gè)包

    這篇文章主要介紹了IDEA中如何查找jar包之間的依賴關(guān)系并忽略依賴的某個(gè)包?本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • mybatis學(xué)習(xí)筆記之mybatis注解配置詳解

    mybatis學(xué)習(xí)筆記之mybatis注解配置詳解

    本篇文章主要介紹了mybatis學(xué)習(xí)筆記之mybatis注解配置詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解Java內(nèi)存泄露的示例代碼

    詳解Java內(nèi)存泄露的示例代碼

    這篇文章通過一個(gè)Demo來簡(jiǎn)要介紹下ThreadLocal和ClassLoader導(dǎo)致內(nèi)存泄露最終OutOfMemory的場(chǎng)景。下面通過示例代碼給大家分享Java內(nèi)存泄露的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-12-12
  • java基礎(chǔ)javeSE程序邏輯控制語法

    java基礎(chǔ)javeSE程序邏輯控制語法

    主要講解Java中程序的邏輯控制語句包括 Java中的輸入輸出方式 順序結(jié)構(gòu)循環(huán)結(jié)構(gòu)等,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Spring和SpringBoot之間的區(qū)別

    Spring和SpringBoot之間的區(qū)別

    這篇文章主要介紹了Spring和SpringBoot之間的區(qū)別,幫助大家更好的理解和學(xué)習(xí)使用這兩種框架,感興趣的朋友可以了解下
    2021-04-04
  • 在Java Web項(xiàng)目中添加定時(shí)任務(wù)的方法

    在Java Web項(xiàng)目中添加定時(shí)任務(wù)的方法

    在Java Web程序中加入定時(shí)任務(wù),這里介紹兩種方式使用監(jiān)聽器注入,使用Spring注解@Scheduled注入,需要的朋友可以參考下
    2018-01-01
  • SpringBoot搭建多數(shù)據(jù)源的實(shí)現(xiàn)方法

    SpringBoot搭建多數(shù)據(jù)源的實(shí)現(xiàn)方法

    說起多數(shù)據(jù)源,一般都來解決那些問題呢,主從模式或者業(yè)務(wù)比較復(fù)雜需要連接不同的分庫來支持業(yè)務(wù)。本文主要介紹了SpringBoot搭建多數(shù)據(jù)源的實(shí)現(xiàn)方法,感興趣的可以了解一下,感興趣的可以額了解一下
    2021-12-12
  • Springboot手動(dòng)連接庫并獲取指定表結(jié)構(gòu)的示例代碼

    Springboot手動(dòng)連接庫并獲取指定表結(jié)構(gòu)的示例代碼

    這篇文章主要介紹了Springboot手動(dòng)連接庫并獲取指定表結(jié)構(gòu)的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

通海县| 科技| 云安县| 寻乌县| 信丰县| 六安市| 广元市| 平安县| 衡阳县| 巴东县| 辽中县| 连云港市| 新巴尔虎左旗| 湘西| 垫江县| 吉安市| 攀枝花市| 卢氏县| 开化县| 东明县| 勃利县| 茌平县| 太原市| 河南省| 武夷山市| 德昌县| 三都| 山东省| 鄄城县| 水城县| 阜南县| 台安县| 封开县| 克拉玛依市| 错那县| 麻城市| 托里县| 平利县| 琼海市| 龙游县| 诸暨市|