Java实现两个视频的上下拼接

我需要用Java实现两个视频的上下拼接代码和说明,谢谢各位博主了

参考这两个
ffmpeg视频剪切与拼接_z丶丶的博客-CSDN博客_ffmpeg 视频拼接

使用java调用ffmpeg命令合并音视频(解决时长不一致问题) - 知乎

一般不会直接用java来实现类似的功能,普遍是调用支持库,比如ffmpeg或者opencv之类的来处理。

一年前还是两年前使用手机在QB上看了“西游记之大闹天宫”电影,查看手机缓冲目录为n多个文件,copy到电脑上只有第一个能观看,其他的应该是没有视频文件头,记得当时好像用格式工厂也拼不到一块。于是就百度材料自己写了个小片段。现在快播青春已逝,将代码敲下来仅作纪念。
代码里面有个问题没有解决:再遍历文件的时候,如何才能按顺序读取?(就将源文件名字全改成一样的了,changeFileNameLength方法)

package utils.files_operate;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class FileCombine {
/**
* 对于较小的文件可以使用字节来处理,当文件较大时需要使用IO流来处理文件
* 两个文件src1和src2合并后生成新的文件tar
* @param src1
* @param src2
* @param tar
* @throws IOException
*/
public static void TwoFilecombine(String src1,String src2,String tar) throws IOException{
File f1 = new File(src1);
File f2 = new File(src2);
File f3 = new File(tar);
byte[] f1_len = FileUtils.readFileToByteArray(f1);
byte[] f2_len = FileUtils.readFileToByteArray(f2);
int all_len = f1_len.length + f2_len.length;
byte[] in_all = new byte[all_len];
for(int i=0; i<f1_len.length;i++){
in_all[i] = f1_len[i];
}
for(int i=0; i<f2_len.length;i++){
in_all[i+f1_len.length] = f2_len[i];
}
FileUtils.writeByteArrayToFile(f3, in_all);
System.out.println(f3.length());
}


/**
* 使用IO流来处理文件
* 两个文件src1和src2合并后生成新的文件tar
* @param src1
* @param src2
* @param tar
* @throws Exception 
*/
public void CombineFile(String path,String tar) throws Exception{


File dirFile = new File(path);
FileInputStream fis;
FileOutputStream fos = new FileOutputStream(tar);
byte buffer[] = new byte[1024*1024*2];
int len;
//如何才能按顺序读取?
for(File file:dirFile.listFiles()){
System.out.println(file.getAbsolutePath());
fis = new FileInputStream(file);
len = 0;
while((len = fis.read(buffer))!= -1){
fos.write(buffer,0,len);
}
fis.close();
}
fos.flush();
fos.close();
}


public static void main(String[] args) throws Exception {
String path = "F:/Media/西游记之大闹天宫";
String tarPath = "F:/Media/西游记之大闹天宫.rmvb";
FileCombine fc = new FileCombine();
fc.changeFileNameLength(path, 3);  //是的文件读取时按照顺序执行
fc.CombineFile(path,tarPath);
}

/**
* 更改文件名为三位,为什么要改文件名为三位呢,因为在指定目录下(比如:F:/Media/test)会按照文件名顺序读取文件。
* 如果不改成三位就会先读取01,然后010,文件拼接顺序不一致。
* 在这里已经把指定目录下的文件名全部变成了数字
*/
public void changeFileNameLength(String path,int length){
File dirFile = new File(path);
String fileName = null;
String extendName = null;
for(File file:dirFile.listFiles()){
fileName = file.getName().substring(0, file.getName().lastIndexOf("."));
extendName = file.getName().substring(file.getName().lastIndexOf("."));
while((fileName+"").length()<length){
fileName = "0"+fileName;
}
file.renameTo(new File(file.getParentFile().getAbsolutePath()+"\\"+fileName+extendName)); 
} 
}
}



```

请参考:https://blog.csdn.net/weixin_42352453/article/details/114663601

上下拼接?
那应该一帧一帧的来拼接
如果纯java来做的话,倒也不是不行,
每帧解码转成bitmap,然后两个bitmap来做拼接。但是速度肯定是慢的很
也可以用ffmpeg等工具辅助裁剪拼接

参考: