【Easylive】项目常见问题解答(自用&持续更新中...) 汇总版
这两个方法是 transferVideoFile
中用于视频文件处理的核心辅助方法,下面我将结合它们在 transferVideoFile
中的使用场景进行详细解释。
1. convertVideo2Ts
方法解析
方法签名
java
private void convertVideo2Ts(String videoFilePath)
功能说明
该方法负责将视频文件转换为TS(Transport Stream)格式,主要用于HLS(HTTP Live Streaming)视频流的分片处理。
执行流程
-
获取视频文件信息:
javaFile videoFile = new File(videoFilePath); File tsFolder = videoFile.getParentFile(); String codec = fFmpegUtils.getVideoCodec(videoFilePath);
-
HEVC编码转换:
javaif (Constants.VIDEO_CODE_HEVC.equals(codec)) { String tempFileName = videoFilePath + Constants.VIDEO_CODE_TEMP_FILE_SUFFIX; new File(videoFilePath).renameTo(new File(tempFileName)); fFmpegUtils.convertHevc2Mp4(tempFileName, videoFilePath); new File(tempFileName).delete(); }
• 如果视频是HEVC编码(H.265),先转换为MP4格式(H.264)
• 使用临时文件进行转换,完成后删除临时文件
-
转换为TS格式:
javafFmpegUtils.convertVideo2Ts(tsFolder, videoFilePath);
-
删除原始视频文件:
javavideoFile.delete();
在 transferVideoFile
中的使用
java
this.convertVideo2Ts(completeVideo);
• 在文件转移完成后调用
• 确保视频格式适合流媒体播放
• 处理特殊编码格式的兼容性问题
2. union
方法解析
方法签名
java
private void union(String dirPath, String toFilePath, Boolean delSource)
功能说明
该方法用于合并分片视频文件,将多个分片文件合并为一个完整的视频文件。
执行流程
-
参数验证:
javaFile dir = new File(dirPath); if (!dir.exists()) { throw new BusinessException("目录不存在"); }
-
获取分片文件列表:
javaFile fileList[] = dir.listFiles();
-
创建目标文件:
javaFile targetFile = new File(toFilePath);
-
合并文件内容:
javatry (RandomAccessFile writeFile = new RandomAccessFile(targetFile, "rw")) { byte[] b = new byte[1024 * 10]; // 10KB缓冲区 for (int i = 0; i < fileList.length; i++) { File chunkFile = new File(dirPath + File.separator + i); try (RandomAccessFile readFile = new RandomAccessFile(chunkFile, "r")) { int len; while ((len = readFile.read(b)) != -1) { writeFile.write(b, 0, len); } } } }
• 使用随机访问文件高效读写
• 按顺序合并所有分片
• 使用try-with-resources确保资源释放
-
清理源文件(可选):
javaif (delSource) { for (File file : fileList) { file.delete(); } }
在 transferVideoFile
中的使用
java
this.union(targetFilePath, completeVideo, true);
• 用于合并分片上传的视频文件
• delSource=true
表示合并后删除分片文件
• 生成完整的视频文件供后续处理
3. 两个方法的协作关系
在 transferVideoFile
中的处理顺序:
- 文件转移:从临时目录移动到正式目录
- 文件合并 (
union
方法):
• 将分片合并为完整视频
• 删除分片文件 - 格式转换 (
convertVideo2Ts
方法):
• 检查并转换编码格式
• 转换为TS格式用于流媒体
• 删除原始文件
4. 设计考虑
-
分片处理 :
• 支持大文件分片上传
• 合并时确保文件顺序正确
-
格式兼容性 :
• 处理HEVC等特殊编码
• 转换为广泛支持的格式
-
资源管理 :
• 及时清理临时文件
• 使用缓冲区提高IO效率
• 确保文件句柄正确释放
-
错误处理 :
• 明确的异常抛出
• 资源清理放在finally块
5. 典型使用场景
-
分片上传处理流程 :
• 用户上传视频分片
• 所有分片上传完成后触发transferVideoFile
• 合并分片 → 转码 → 生成流媒体格式
-
视频处理流程 :
• 原始视频 → 检查编码 → 转换 → TS切片
• 为HLS流媒体做准备
6. 潜在优化点
-
并行处理 :
• 分片合并可以使用多线程加速
-
进度反馈 :
• 添加转码进度回调
-
错误恢复 :
• 记录处理进度,支持断点续处理
-
资源控制 :
• 限制并发转码任务数
• 监控系统负载
这两个方法共同构成了视频处理管道的核心环节,将上传的视频文件最终转换为可流式传输的标准格式。