本文已参与「新人创作礼」活动,一起开启掘金创作之路。
- 因为摄像头输出文件编码格式为 hevc 则需要把它转化为 h.264 格式在进行处理
命令: ffmpeg -i ./VID_20210818_201006.mp4 -map 0 -c:a copy -c:s copy -c:v libx264 ./0.mp4
- 需要再把 mp4 文件转化为 ts 文件在进行合并
命令: ffmpeg -i ./0.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts ./0.ts
- 再把 ts 文件合并为 mp4 文件
命令: ffmpeg -i "concat:./0.ts|./1.ts|./2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
- 如果需要分离音频和视频则需要在处理
仅提取视频: 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();
}
}
食用方法:
- 修改代码文件夹路径
2. 先执行 generatorConvert() 方法 生成 convert.cmd 文件
-
执行 convert.cmd 文件, 生成 h.264 格式的 mp4 文件
-
执行 generatorConcat() 方法 生成 concat.cmd 文件
-
执行 concat.cmd 文件, 进行 mp4 文件的合并
-
目录下的 output.mp4 就是合并后的文件
截图:
本人的 ffmpeg 版本为 4.4.1
生成的 convert.cmd 文件
生成的 concat.cmd 文件 (有删减)
最后:
本人亲测可放心食用, 如果有什么问题可以联系我, 我们一起讨论, 感谢!