1视频合块代码,正确代码无错
//测试文件合块方法
@Test
public void mergeChunk() throws Exception {
//指定块文件所在目录
String chunkFileDirPath = "D:\\Temp\\zentisa\\chunk\\";
File chunkDirFile = new File(chunkFileDirPath); // 创建文件列表对象
// 通过文件列表对象,获取块文件列表信息
File[] files = chunkDirFile.listFiles();
// 给视频排序,超过10块的视频 会从1直接到10,所以要排序保证 合块的视频顺序正确
List<File> fileList = new ArrayList<File>(Arrays.asList(files));
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File file1, File file2) {
if(Integer.parseInt(file1.getName())>Integer.parseInt(file2.getName())){
return 1;
}
return -1;
}
});
//指定合并文件所在路径
String mergeFilePath = "D:\\Temp\\zentisa\\hekuai\\bys.mp4";
File mergeFile = new File(mergeFilePath);
//创建输出流
RandomAccessFile rw = new RandomAccessFile(mergeFile, "rw");
rw.seek(0); // 指定从文件的那个位置开始写,0,从头开始写
//创建缓冲区
byte[] bytes = new byte[1024];
int len = -1;
//遍历块文件,写入输出流
for(File file:fileList){
//创建输入流
RandomAccessFile r = new RandomAccessFile(file, "r");
while((len = r.read(bytes)) != -1){ // 不等于 -1 的时候就 继续读
rw.write(bytes,0,len);
}
r.close();
}
rw.close();
}
2.错误问题总结
2.1:问题:合块代码执行后,代码运行正常,合块正常,视频大小和拆分前一样。就是不能播放。因为视频是以数字来命名的,所以在合块的时候 0 过后就是10 之后 11,跳过了 1~9,视频合块不超过十块的时候是能正常执行的,超过十块后,就会出现这个问题。
解决方法一:这是业务问题,不是技术问题。添加一个集合让有序排列就好了
// 给视频排序,超过10块的视频 会从1直接到10,所以要排序保证 合块的视频顺序正确
List<File> fileList = new ArrayList<File>(Arrays.asList(files));
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File file1, File file2) {
if(Integer.parseInt(file1.getName())>Integer.parseInt(file2.getName())){
return 1;
}
return -1;
}
});
解决方法二:
//测试文件合块方法二
@Test
public void mergeChunk1() throws Exception {
//指定块文件所在目录
String chunkFileDirPath = "F:\\video\\chunk\\";
File chunkDirFile = new File(chunkFileDirPath);
//获取块文件列表信息
File[] files = chunkDirFile.listFiles();
//指定合并文件所在路径
String mergeFilePath = "F:\\video\\bys1.mp4";
File mergeFile = new File(mergeFilePath);
//创建输出流
RandomAccessFile rw = new RandomAccessFile(mergeFile, "rw");
rw.seek(0);
//创建缓冲区
byte[] bytes = new byte[1024];
int len = -1;
//遍历块文件,写入输出流
for(int i=0;i<files.length;i++){
File file = new File(chunkFileDirPath + i);
//创建输入流
RandomAccessFile r = new RandomAccessFile(file, "r");
while((len = r.read(bytes)) != -1){
rw.write(bytes,0,len);
}
r.close();
}
rw.close();
}