使用java进行视频文件拼接

本文介绍了一段用于修复视频文件合并顺序问题的代码,包括文件读取、合并及重命名操作。通过实例演示了如何解决视频文件合并时顺序混乱的问题,并提供了改进后的文件命名方法,确保合并后的视频文件顺序正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一年前还是两年前使用手机在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)); 
} 
}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值