【Easylive】convertVideo2Ts 和 union 方法解析

【Easylive】项目常见问题解答(自用&持续更新中...) 汇总版

这两个方法是 transferVideoFile 中用于视频文件处理的核心辅助方法,下面我将结合它们在 transferVideoFile 中的使用场景进行详细解释。

1. convertVideo2Ts 方法解析

方法签名

java 复制代码
private void convertVideo2Ts(String videoFilePath)

功能说明

该方法负责将视频文件转换为TS(Transport Stream)格式,主要用于HLS(HTTP Live Streaming)视频流的分片处理。

执行流程

  1. 获取视频文件信息

    java 复制代码
    File videoFile = new File(videoFilePath);
    File tsFolder = videoFile.getParentFile();
    String codec = fFmpegUtils.getVideoCodec(videoFilePath);
  2. HEVC编码转换

    java 复制代码
    if (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)

    • 使用临时文件进行转换,完成后删除临时文件

  3. 转换为TS格式

    java 复制代码
    fFmpegUtils.convertVideo2Ts(tsFolder, videoFilePath);
  4. 删除原始视频文件

    java 复制代码
    videoFile.delete();

transferVideoFile 中的使用

java 复制代码
this.convertVideo2Ts(completeVideo);

• 在文件转移完成后调用

• 确保视频格式适合流媒体播放

• 处理特殊编码格式的兼容性问题

2. union 方法解析

方法签名

java 复制代码
private void union(String dirPath, String toFilePath, Boolean delSource)

功能说明

该方法用于合并分片视频文件,将多个分片文件合并为一个完整的视频文件。

执行流程

  1. 参数验证

    java 复制代码
    File dir = new File(dirPath);
    if (!dir.exists()) {
        throw new BusinessException("目录不存在");
    }
  2. 获取分片文件列表

    java 复制代码
    File fileList[] = dir.listFiles();
  3. 创建目标文件

    java 复制代码
    File targetFile = new File(toFilePath);
  4. 合并文件内容

    java 复制代码
    try (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确保资源释放

  5. 清理源文件(可选):

    java 复制代码
    if (delSource) {
        for (File file : fileList) {
            file.delete();
        }
    }

transferVideoFile 中的使用

java 复制代码
this.union(targetFilePath, completeVideo, true);

• 用于合并分片上传的视频文件

delSource=true 表示合并后删除分片文件

• 生成完整的视频文件供后续处理

3. 两个方法的协作关系

transferVideoFile 中的处理顺序:

  1. 文件转移:从临时目录移动到正式目录
  2. 文件合并union方法):
    • 将分片合并为完整视频
    • 删除分片文件
  3. 格式转换convertVideo2Ts方法):
    • 检查并转换编码格式
    • 转换为TS格式用于流媒体
    • 删除原始文件

4. 设计考虑

  1. 分片处理

    • 支持大文件分片上传

    • 合并时确保文件顺序正确

  2. 格式兼容性

    • 处理HEVC等特殊编码

    • 转换为广泛支持的格式

  3. 资源管理

    • 及时清理临时文件

    • 使用缓冲区提高IO效率

    • 确保文件句柄正确释放

  4. 错误处理

    • 明确的异常抛出

    • 资源清理放在finally块

5. 典型使用场景

  1. 分片上传处理流程

    • 用户上传视频分片

    • 所有分片上传完成后触发transferVideoFile

    • 合并分片 → 转码 → 生成流媒体格式

  2. 视频处理流程

    • 原始视频 → 检查编码 → 转换 → TS切片

    • 为HLS流媒体做准备

6. 潜在优化点

  1. 并行处理

    • 分片合并可以使用多线程加速

  2. 进度反馈

    • 添加转码进度回调

  3. 错误恢复

    • 记录处理进度,支持断点续处理

  4. 资源控制

    • 限制并发转码任务数

    • 监控系统负载

这两个方法共同构成了视频处理管道的核心环节,将上传的视频文件最终转换为可流式传输的标准格式。

相关推荐
2501_933923252 分钟前
Spring Bean作用域揭秘:单例、原型、请求与会话的区别
java·后端·spring·java-ee
学编程就要猛19 分钟前
基于Spring AI 的智能聊天机器人
java·spring ai·chat robot
修炼室21 分钟前
Java开发工程师笔试经验贴【高频知识】
java
木井巳34 分钟前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
杨杨杨大侠41 分钟前
知识库已经有了,Java 程序员还要做什么?Spring AI RAG 实战
java·openai·ai编程
伊信1 小时前
Spring AI 基础学习与应用
java·后端
夜郎king1 小时前
基于 Java + Playwright 实现网站自动访问与数据采集(以腾讯云开发者社区为例)
java·playwright·网页数据获取
Anastasiozzzz1 小时前
重新定义 Agent 基建:Redis 在现代 AI 与智能体系统中的工程实践
java·人工智能·redis·ai
careathers1 小时前
【数据结构】队列
java·数据结构
步行cgn1 小时前
Spring 通过 factory-method 实例化 Bean 详解与常见错误排查
java·后端