【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. 资源控制 :

    • 限制并发转码任务数

    • 监控系统负载

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

相关推荐
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw7 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号8 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠9 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David10 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放10 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户37215742613510 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长11 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节