使用FFMPEG合并视频

因为最近要求AcDown加入视频合并功能的呼声非常高(几乎一半多的反馈都在说这个问题),所以下午花了些时间来研究怎样用最方便(不需要最快)的方法来进行视频合并。

AcDown之前的版本使用的是某个第三方的FlvCombine组件,这个软件的优点在于体积非常小(一共才200多KB),方便集成到AcDown中,使用很简单,而且合并速度非常快,但是缺点也是非常显而易见的,那就是不支持mp4容器格式。而现在视频网站上的高清视频大都是mp4格式的,基于这点考虑,AcDown一直没有加入下载后合并视频的功能。

使用FFMPEG来进行合并一直是我在考虑的,但是因为之前AcDown的软件架构,在不到1M的软件中嵌入好几十M的ffmpeg显然不是一个好的选择,再加上我对它也不是很熟悉,所以下载后转换的这个问题一直拖到了现在。

言归正传,这次研究出来的合并方法其实算是比较投机取巧的,本身并没有使用ffmpeg的众多参数,而是绕了个弯,先将待合并的视频转换为体积很大的mpeg格式,然后再将其二进制合并后重新压缩编码,最后得到输出文件。虽然看起来很麻烦,不过稳定性还是可以保证的 使用FFMPEG合并视频

以下是批处理文件:
目标是将位于桌面new文件夹中的1.flv和2.flv文件合并为combine.flv
cd " C:\Users\Kaedei\Desktop\new"
ffmpeg.exe -i "1.flv" -f mpeg -sameq -y -r 29.97 "1.flv.actemp"
ffmpeg.exe -i "2.flv" -f mpeg -sameq -y -r 29.97 "2.flv.actemp"
copy /b "1.flv.actemp"+"2.flv.actemp" "combine.flv.actemp" /y
ffmpeg.exe -i "combine.flv.actemp" -f mp4 -y "combine.flv"
del "1.flv.actemp"
del "2.flv.actemp"
del "combine.flv.actemp"


下面是各步骤的解释:
cd " C:\Users\Kaedei\Desktop\new"
进入桌面的new文件夹

ffmpeg.exe -i "1.flv" -f mpeg -sameq -y -r 29.97 "1.flv.actemp"
ffmpeg.exe -i "2.flv" -f mpeg -sameq -y -r 29.97 "2.flv.actemp"
将1.flv和2.flv转换为1.flv.actemp和2.flv.actemp文件,格式为mpeg,因为我用的FFMPEG貌似不支持输出1/15,1/20这样的帧率,所以强制设置帧率为标准的29.97,当然这样做会导致输出的文件体积变得略大。

copy /b "1.flv.actemp"+"2.flv.actemp" "combine.flv.actemp" /y
将输出的两个actemp文件通过二进制合并为combine.flv.actemp文件

ffmpeg.exe -i "combine.flv.actemp" -f mp4 -y "combine.flv"
将合并后的combine.flv.actemp文件转换为mp4编码的视频

del "1.flv.actemp"
del "2.flv.actemp"
del "combine.flv.actemp"
删除临时文件


已通过测试,不过暂时不知道这种方法对通过bug压缩的视频效果怎样……
转载:

### 如何在 Java 中使用 FFmpeg 合并多个视频文件 要在 Java 中利用 FFmpeg合并多个视频文件,可以采用调用外部命令的方式执行 FFmpeg 命令。以下是实现这一功能的具体方法: #### 使用 FFmpeg 的 concat 协议 FFmpeg 提供了一种简单的方法通过 `concat` 协议来合并多个视频文件。这种方法需要创建一个文本文件,其中列出了要合并视频文件路径。 1. **准备输入列表文件** 创建一个名为 `input.txt` 的文件,其内容如下所示: ``` file 'path/to/video1.mp4' file 'path/to/video2.mp4' file 'path/to/video3.mp4' ``` 2. **运行 FFmpeg 命令** 执行以下命令以合并这些视频文件: ```bash ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4 ``` 这里的 `-c copy` 表示直接复制流而不重新编码,从而加快处理速度[^2]。 #### 在 Java 中调用 FFmpeg 可以通过 Java 调用上述 FFmpeg 命令。下面是一个简单的代码示例,展示如何动态生成 `input.txt` 文件并通过 ProcessBuilder 或 Runtime 类启动 FFmpeg 处理流程。 ```java import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.InputStreamReader; public class FFMpegVideoMerger { public static void main(String[] args) { try { String ffmpegPath = "ffmpeg"; // 如果不在环境变量中,请指定完整路径 File inputFileList = createInputFileList(new String[]{ "/path/to/video1.mp4", "/path/to/video2.mp4" }); ProcessBuilder processBuilder = new ProcessBuilder( ffmpegPath, "-f", "concat", "-safe", "0", "-i", inputFileList.getAbsolutePath(), "-c", "copy", "/path/to/output.mp4"); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); // 输出日志以便调试 } int exitCode = process.waitFor(); if (exitCode == 0) { System.out.println("视频合并成功!"); } else { System.err.println("视频合并失败,退出码:" + exitCode); } } catch (Exception e) { e.printStackTrace(); } } private static File createInputFileList(String[] videoPaths) throws Exception { File tempFile = File.createTempFile("video_list_", ".txt"); BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile)); for (String path : videoPaths) { writer.write("file '" + path + "'\n"); } writer.close(); return tempFile; } } ``` 此程序会自动创建临时的 `input.txt` 列表文件,并将其传递给 FFmpeg 工具完成视频合并操作。 #### 注意事项 - 确保 FFmpeg 可执行文件已安装并且可以在系统的 PATH 环境变量中找到,或者提供完整的可执行文件路径。 - 输入视频应具有相同的分辨率、帧率和其他编解码器参数;否则可能需要先统一转换再进行拼接。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值