From 3cafa6931c06922479097efeb4ee542d9fc56636 Mon Sep 17 00:00:00 2001 From: jmal Date: Mon, 29 Apr 2024 18:03:16 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E8=A7=86=E9=A2=91=E8=BD=AC=E7=A0=81?= =?UTF-8?q?=E9=80=82=E9=85=8Dnvidia=E6=98=BE=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/video/VideoProcessService.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/main/java/com/jmal/clouddisk/service/video/VideoProcessService.java b/src/main/java/com/jmal/clouddisk/service/video/VideoProcessService.java index d79a12ee..0c03122d 100644 --- a/src/main/java/com/jmal/clouddisk/service/video/VideoProcessService.java +++ b/src/main/java/com/jmal/clouddisk/service/video/VideoProcessService.java @@ -238,6 +238,12 @@ private void videoToM3U8(String fileId, String username, String relativePath, St "-hls_segment_filename", Paths.get(videoCacheDir, fileId + "-%03d.ts").toString(), outputPath ); + // 检测是硬件加速 + processBuilder = checkHardwareAcceleration(fileId, processBuilder, fileAbsolutePath, bitrate, videoCacheDir, outputPath); + + // 打印ffmpeg命令 + processBuilder.command().forEach(command -> System.out.println(command + " \\")); + processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); boolean pushMessage = false; @@ -272,6 +278,71 @@ private void videoToM3U8(String fileId, String username, String relativePath, St } } + private ProcessBuilder checkHardwareAcceleration(String fileId, ProcessBuilder processBuilder, Path fileAbsolutePath, int bitrate, String videoCacheDir, String outputPath) { + if (checkCUDA() && checkNVENC()) { + // 使用CUDA硬件加速和NVENC编码器 + processBuilder = new ProcessBuilder( + Constants.FFMPEG, + "-hwaccel", "cuda", + "-hwaccel_output_format", "cuda", + "-i", fileAbsolutePath.toString(), + "-vf", "scale_cuda=-2:" + 720, + "-c:v", "h264_nvenc", + "-b:v", bitrate + "k", + "-preset", "medium", + "-profile:v", "main", + "-level", "4.0", + "-start_number", "0", + "-hls_time", "10", + "-hls_list_size", "0", + "-g", "48", + "-sc_threshold", "0", + "-f", "hls", + "-hls_segment_filename", Paths.get(videoCacheDir, fileId + "-%03d.ts").toString(), + outputPath + ); + } + return processBuilder; + } + + /** + * 检测是否支持cuda硬件加速 + */ + private boolean checkCUDA() { + try { + Process process = Runtime.getRuntime().exec("ffmpeg -hwaccels"); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + if (line.contains("cuda")) { + return true; + } + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return false; + } + + /** + * 检测是否支持nvenc编码器 + */ + private boolean checkNVENC() { + try { + Process process = Runtime.getRuntime().exec("ffmpeg -hide_banner -encoders | grep nvenc"); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + if (line.contains("nvenc")) { + return true; + } + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return false; + } + /** * 判断是否需要转码 * @param videoInfo 视频信息