ffmpeg 合并小米云台视频文件 (java生成)

1. 因为摄像头输出文件编码格式为 hevc 则需要把它转化为 h.264 格式在进行处理

命令: ffmpeg -i ./VID_20210818_201006.mp4 -map 0 -c:a copy -c:s copy -c:v libx264 ./0.mp4

 2. 需要再把 mp4 文件转化为 ts 文件在进行合并

命令: ffmpeg -i ./0.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts ./0.ts

3. 再把 ts 文件合并为 mp4 文件 

命令:  ffmpeg -i "concat:./0.ts|./1.ts|./2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

4. 如果需要分离音频和视频则需要在处理 

仅提取视频: ffmpeg -i output.mp4 -vcodec copy -an ext_video.mp4

仅提取音频: ffmpeg -i output.mp4 -acodec copy -vn ext_audio.m4a

如果需要吧m4a格式的音频转为mp3 则在转化一下就好

m4a ffmpeg -i ext_audio.m4a ext_audio.mp3

java代码生成脚本文件:  

package com.orion;

import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;

/**
 * @author Jiahang Li
 * @version 1.0.0
 * @since 2021/11/18 23:40
 */
public class Ffmpeg {

    @Test
    public void generatorConvert() throws Exception {
        // 获取视频文件夹
        File dir = new File("F:\\1yyp");
        // 读取文件夹内要转换的文件
        File[] files = dir.listFiles((n) -> n.getName().endsWith(".mp4"));
        String convertCommandTemplate = "ffmpeg -i ./%s -map 0 -c:a copy -c:s copy -c:v libx264 ./convert_%d.mp4";
        StringBuilder sb = new StringBuilder();
        // 拼接转换命令
        for (int i = 0; i < files.length; i++) {
            sb.append(String.format(convertCommandTemplate, files[i].getName(), i)).append("\n");
        }
        // 生成转换脚本
        FileOutputStream out = new FileOutputStream(new File(dir, "convert.cmd"));
        out.write(sb.toString().getBytes());
        out.flush();
    }

    @Test
    public void generatorConcat() throws Exception {
        // 获取视频文件夹
        File dir = new File("F:\\1yyp");
        // 读取文件夹内要转换的文件
        File[] files = dir.listFiles((n) -> n.getName().startsWith("convert") && n.getName().endsWith(".mp4"));
        String convertTsCommandTemplate = "ffmpeg -i ./%s -c copy -bsf:v h264_mp4toannexb -f mpegts ./ts_%d.ts";
        StringBuilder sb = new StringBuilder();
        // 拼接转换命令
        for (int i = 0; i < files.length; i++) {
            sb.append(String.format(convertTsCommandTemplate, files[i].getName(), i)).append("\n");
        }
        // 拼接拼接命令
        StringBuilder concatFiles = new StringBuilder();
        for (int i = 0; i < files.length; i++) {
            concatFiles.append("./ts_").append(i).append(".ts");
            if (i != files.length - 1) {
                concatFiles.append("|");
            }
        }
        sb.append("\nffmpeg -i \"concat:")
                .append(concatFiles.toString())
                .append("\" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4")
                .append("\n");
        // 生成转换脚本
        FileOutputStream out = new FileOutputStream(new File(dir, "concat.cmd"));
        out.write(sb.toString().getBytes());
        out.flush();
    }

}

食用方法:

1. 修改代码文件夹路径

2. 先执行  generatorConvert() 方法 生成 convert.cmd 文件

3. 执行  convert.cmd 文件, 生成 h.264 格式的 mp4 文件

4. 执行 generatorConcat() 方法 生成 concat.cmd 文件

5. 执行 concat.cmd 文件, 进行 mp4 文件的合并 

6. 目录下的 output.mp4 就是合并后的文件

截图: 

本人的 ffmpeg 版本为 4.4.1

生成的 convert.cmd 文件

生成的 concat.cmd 文件 (有删减)

 

最后: 

 本人亲测可放心食用, 如果有什么问题可以联系我, 我们一起讨论, 感谢!

FFmpeg是一个非常强大的开源多媒体处理工具,它能够处理各种音频、视频格式,包括合并、转码、剪辑等。它被广泛用于许多领域,包括视频编辑、流媒体传输、数字版权管理等。 要将多个视频合并并转码为Java应用程序,你可以使用FFmpeg的命令行工具。下面是一个简单的步骤指南: **步骤一:安装FFmpeg** 首先,你需要安装FFmpeg。在大多数Linux发行版中,你可以使用包管理器(如apt或yum)来安装它。在Windows上,你可以从FFmpeg的官方网站下载预编译的二进制文件。 **步骤二:使用FFmpeg命令行工具** 一旦你安装了FFmpeg,你就可以使用命令行工具来合并和转码视频。以下是一个基本的示例命令: ```bash ffmpeg -i input1.mp4 -i input2.mp4 -c:v libx264 -c:a aac output.mp4 ``` 这个命令将两个输入文件(input1.mp4和input2.mp4)合并为一个输出文件(output.mp4)。视频编码器使用libx264,音频编码器使用aac。 **步骤三:Java代码调用FFmpeg** 如果你想在Java应用程序中使用FFmpeg,你可以使用Java的ProcessBuilder类来调用FFmpeg的命令行工具。以下是一个简单的示例代码: ```java import java.io.*; public class FFmpegExample { public static void main(String[] args) throws IOException { ProcessBuilder processBuilder = new ProcessBuilder( "ffmpeg", "-i", "input1.mp4", "-i", "input2.mp4", "-c:v", "libx264", "-c:a", "aac", "output.mp4" ); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } } ``` 这个Java程序将调用FFmpeg命令行工具来合并和转码视频。注意,这个示例只是一个简单的演示,你可能需要根据你的具体需求进行修改。 请注意,在使用FFmpeg时,确保你的系统上已经安装了所有必要的依赖项,并且你有足够的权限来执行这些操作。此外,你可能需要根据你的具体需求调整FFmpeg命令或Java代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值