学成在线-第13天-讲义-在线学习 HLS 1 在线学习需求分析
配置ffmpeg
将视频进行转码
下面开始转成m3u8进行MP4的格式转换
生成么m3u8切割成功
这块地址再次埋下坑,没有hls做为子路径,视频会找不到,并且这里面还有个坑,就是host要配置video.xuecheng,com这点视频里面没有说,请结合文档
成功通过域名配置访问成功
接下来就是典型的复制代码,然后粘贴代码,最后讲师,在讲解一下,感觉这个项目真的很水很水
文件分块的代码测试
public void testChunk() throws IOException {
//源文件
File sourceFile = new File("D:\\video\\lucene.avi");
//块文件目录
String chunkFileFolder = "D:\\video\\chunks\\";
//先定义块文件大小
long chunkFileSize = 1 * 1024 * 1024;
//块数
long chunkFileNum = (long) Math.ceil(sourceFile.length() * 1.0 /chunkFileSize);
//创建读文件的对象
RandomAccessFile raf_read = new RandomAccessFile(sourceFile,"r");
//缓冲区
byte[] b = new byte[1024];
for(int i=0;i<chunkFileNum;i++){
//块文件
File chunkFile = new File(chunkFileFolder+i);
//创建向块文件的写对象
RandomAccessFile raf_write = new RandomAccessFile(chunkFile,"rw");
int len = -1;
while((len = raf_read.read(b))!=-1){
raf_write.write(b,0,len);
//如果块文件的大小达到 1M开始写下一块儿
if(chunkFile.length()>=chunkFileSize){
break;
}
}
raf_write.close();
}
raf_read.close();
}
//测试文件合并
@Test
public void testMergeFile() throws IOException {
//块文件目录
String chunkFileFolderPath = "D:\\video\\chunks\\";
//块文件目录对象
File chunkFileFolder = new File(chunkFileFolderPath);
//块文件列表
File[] files = chunkFileFolder.listFiles();
//将块文件排序,按名称升序
List<File> fileList = Arrays.asList(files);
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
if(Integer.parseInt(o1.getName())>Integer.parseInt(o2.getName())){
return 1;
}
return -1;
}
});
//合并文件
File mergeFile = new File("D:\\video\\lucene_merge.avi");
//创建新文件
boolean newFile = mergeFile.createNewFile();
//创建写对象
RandomAccessFile raf_write = new RandomAccessFile(mergeFile,"rw");
byte[] b = new byte[1024];
for(File chunkFile:fileList){
//创建一个读块文件的对象
RandomAccessFile raf_read = new RandomAccessFile(chunkFile,"r");
int len = -1;
while((len = raf_read.read(b))!=-1){
raf_write.write(b,0,len);
}
raf_read.close();
}
raf_write.close();
}
文件上传
//得到块文件所属目录路径
private String getChunkFileFolderPath(String fileMd5){
return upload_location + fileMd5.substring(0,1) + "/" + fileMd5.substring(1,2) + "/" + fileMd5 + "/chunk/";
}
/**
* 文件上传前的注册,检查文件是否存在
* 根据文件md5得到文件路径
* 规则:
* 一级目录:md5的第一个字符
* 二级目录:md5的第二个字符
* 三级目录:md5
* 文件名:md5+文件扩展名
* @param fileMd5 文件md5值
* @param fileExt 文件扩展名
* @return 文件路径
*/
public ResponseResult register(String fileMd5, String fileName, Long fileSize, String mimetype, String fileExt) {
//1 检查文件在磁盘上是否存在
//文件所属目录的路径
String fileFolderPath = this.getFileFolderPath(fileMd5);
//文件的路径
String filePath =this.getFilePath(fileMd5,fileExt);
File file = new File(filePath);
//文件是否存在
boolean exists = file.exists();
//2 检查文件信息在mongodb中是否存在
Optional<MediaFile> optional = mediaFileRepository.findById(fileMd5);
if(exists && optional.isPresent()){
//文件存在
ExceptionCast.cast(MediaCode.UPLOAD_FILE_REGISTER_EXIST);
}
//文件不存在时作一些准备工作,检查文件所在目录是否存在,如果不存在则创建
File fileFolder = new File(fileFolderPath);
if(!fileFolder.exists()){
fileFolder.mkdirs();
}
return new ResponseResult(CommonCode.SUCCESS);
}
个人感觉后面几集的代码完全就是应付用的基本都是复制代码,完全没有看的意义写的话都是基本路径,没有什么意义,建议需要的同学好好看看,在写代码
\
这个代码到后面就是文件流的操作还是比较难的,建议直接复制代码吧,这个工程实在是没有意义了!!!