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 文件 (有删减)
最后:
本人亲测可放心食用, 如果有什么问题可以联系我, 我们一起讨论, 感谢!