办公设备维修网
资讯中心 您所在的位置:网站首页 资讯中心 Easy云盘:文件转码服务

Easy云盘:文件转码服务

2024-06-26 13:52:49| 来源: 网络整理

public class FileInfoServiceImpl extends ServiceImpl implements FileInfoService { private final AppConfig appConfig;

@Async public void transferFile(String fileId, String userId) { boolean transferSuccess = true; String targetFilePath = null; String cover = null; FileInfo fileInfo = getByMultiId(fileId, userId); if (fileInfo == null || !FileStatusEnums.TRANSFER.getStatus().equals(fileInfo.getStatus())) { return; } try { // 临时目录 String tempFolderName = appConfig.getProjectFolder() + Constants.FILE_FOLDER_TEMP; String currentUserFolderName = userId + fileId; File fileFolder = new File(tempFolderName + currentUserFolderName); String fileSuffix = StringTools.getFileSuffix(fileInfo.getFilename()); String month = fileInfo.getCreateTime().format(DateTimeFormatter.ofPattern(DateTimePatternEnum.YYYYMM.getPattern())); // 目标目录 String targetFolderName = appConfig.getProjectFolder() + Constants.FILE_FOLDER_FILE; File targetFolder = new File(targetFolderName + "/" + month); if (!targetFolder.exists()) { targetFolder.mkdirs(); } // 真实文件名 String realFilename = currentUserFolderName + fileSuffix; targetFilePath = targetFolder.getPath() + "/" + realFilename; // 合并文件 union(fileFolder.getPath(), targetFilePath, fileInfo.getFilename(), true); // 视频文件切割 Integer fileType = fileInfo.getFileType(); // 文件缩略图 if (FileTypeEnums.VIDEO.getType().equals(fileType)) { cutFile4Video(fileId, targetFilePath); // 视频缩略图 cover = month + "/" + currentUserFolderName + Constants.IMAGE_PNG_SUFFIX; String coverPath = targetFolderName + "/" + cover; FfmpegUtil.createTargetThumbnail(new File(targetFilePath), Constants.LENGTH_150, new File(coverPath)); } else if (FileTypeEnums.IMAGE.getType().equals(fileType)) { // 图片缩略图 cover = month + "/" + realFilename.replace(".", "_."); String coverPath = targetFolderName + "/" + cover; Boolean created = FfmpegUtil.createThumbnailWidthFFmpeg(new File(targetFilePath), Constants.LENGTH_150, new File(coverPath), false); if (!created) { FileUtils.copyFile(new File(targetFilePath), new File(coverPath)); } } } catch (Exception e) { log.error("文件转码失败, 文件ID: {}, userId: {}", fileId, userId, e); transferSuccess = false; } finally { // 更新文件Size和封面 FileInfo updateInfo = new FileInfo(); if (targetFilePath == null) { updateInfo.setFileSize(0L); } else { updateInfo.setFileSize(new File(targetFilePath).length()); } updateInfo.setFileCover(cover); updateInfo.setStatus(transferSuccess ? FileStatusEnums.USING.getStatus() : FileStatusEnums.TRANSFER_FAIL.getStatus()); updateByMultiId(updateInfo, fileId, userId); } }

/** * 多主键更新 * * @param id 文件ID * @param userId 用户ID */ private Boolean updateByMultiId(FileInfo fileInfo, String id, String userId) { return update(fileInfo, new LambdaUpdateWrapper().eq(FileInfo::getId, id).eq(FileInfo::getUserId, userId)); }

/** * 多主键查询 * * @param id 文件ID * @param userId 用户ID */ private FileInfo getByMultiId(String id, String userId) { return getOne(new LambdaQueryWrapper().eq(FileInfo::getId, id).eq(FileInfo::getUserId, userId)); }

/** * 文件合并 * * @param dirPath 分片所在目录 * @param toFilePath 合并目标文件 * @param filename 合并文件名 * @param delSource 是否删除分片文件 */ private void union(String dirPath, String toFilePath, String filename, Boolean delSource) { File dir = new File(dirPath); if (!dir.exists()) { throw new BizException("目录不存在"); } File[] files = dir.listFiles(); File targetFile = new File(toFilePath); RandomAccessFile writeFile = null; try { writeFile = new RandomAccessFile(targetFile, "rw"); byte[] b = new byte[1024 * 10]; for (int i = 0; i < files.length; i++) { int len = -1; File chunkFile = new File(dirPath + "/" + i); try (RandomAccessFile readFile = new RandomAccessFile(chunkFile, "r")) { while ((len = readFile.read(b)) != -1) { writeFile.write(b, 0, len); } } catch (Exception e) { log.error("合并分片失败", e); throw new BizException("合并分片失败"); } } } catch (Exception e) { log.error("合并文件:{}失败", filename, e); throw new BizException("合并文件" + filename + "出错了"); } finally { if (null != writeFile) { try { writeFile.close(); } catch (IOException e) { e.printStackTrace(); } } if (delSource && dir.exists()) { try { FileUtils.deleteDirectory(dir); } catch (IOException e) { e.printStackTrace(); } } } }

/** * 视频文件切片 * * @param fileId 文件ID * @param videoFilePath 分片到目录 */ private void cutFile4Video(String fileId, String videoFilePath) { // 创建同名切片目录 File tsFolder = new File(videoFilePath.substring(0, videoFilePath.lastIndexOf("."))); if (!tsFolder.exists()) { tsFolder.mkdirs(); } // 生成ts String tsPath = tsFolder + "/" + Constants.TS_NAME; FfmpegUtil.transfer2ts(videoFilePath, tsPath); // 生成索引文件.m3u8和切片.ts文件 String indexTs = tsFolder.getPath() + "/" + Constants.M3U8_NAME; FfmpegUtil.cutTs(tsPath, indexTs, tsFolder.getPath(), fileId); // 删除index.ts new File(tsPath).delete(); }}



【本文地址】 转载请注明 

最新文章

推荐文章

CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备16040606号-1