Просмотр исходного кода

优化提高视频分辨率的公共方法

lh 1 день назад
Родитель
Сommit
2863eaa55a
1 измененных файлов с 16 добавлено и 5 удалено
  1. 16 5
      app/Libs/Helpers.php

+ 16 - 5
app/Libs/Helpers.php

@@ -4484,15 +4484,26 @@ function upgrade480pTo720p($videoUrl, $prefix = 'videos')
             'size_mb' => round($inputFileSize / 1024 / 1024, 2) . 'MB'
         ]);
 
-        // 使用FFmpeg将视频升级到720p
-        // -vf "scale=-2:720": 保持宽高比,高度设置为720,宽度自动计算(-2确保是偶数)
+        // 使用FFmpeg将视频升级到720p,使用高质量的Lanczos算法和锐化滤镜
+        // 滤镜说明:
+        // 1. scale=-2:720:flags=lanczos: 使用Lanczos算法缩放,保持宽高比,高度720,宽度自动计算(-2确保是偶数)
+        // 2. unsharp=5:5:1.0:5:5:0.5: 锐化滤镜,增强细节
+        //    - 5:5:1.0 表示亮度锐化(luma_msize_x:luma_msize_y:luma_amount)
+        //    - 5:5:0.5 表示色度锐化(chroma_msize_x:chroma_msize_y:chroma_amount)
+        // 3. hqdn3d=1.5:1.5:6:6: 降噪滤镜,轻微降噪以改善画质
+        //    - 参数分别为亮度空间/时间和色度空间/时间
+        // 编码参数:
         // -c:v libx264: 使用H.264编码器
-        // -preset slow: 使用较慢的编码速度以保持更好的画质
-        // -crf 18: 恒定质量模式,18表示高质量(0-51,数值越小画质越好)
+        // -preset veryslow: 使用最慢的编码速度以获得最佳画质(适合对画质要求高的场景)
+        // -crf 16: 恒定质量模式,16表示极高质量(0-51,数值越小画质越好,18是高质量,16是极高质量)
+        // -tune film: 针对电影内容优化(适合AI生成的动画视频)
+        // -profile:v high: 使用H.264 High Profile,支持更高级的压缩特性
+        // -level 4.1: H.264 level 4.1,支持更高的码率和分辨率
+        // -pix_fmt yuv420p: 像素格式,确保兼容性
         // -c:a copy: 音频直接复制,不重新编码
         // -movflags +faststart: 优化网络播放
         $ffmpegPath = env('FFMPEG_PATH', 'ffmpeg');
-        $ffmpegCmd = "$ffmpegPath -i \"$inputFile\" -vf \"scale=-2:720\" -c:v libx264 -preset slow -crf 18 -c:a copy -movflags +faststart -y \"$outputFile\" 2>&1";
+        $ffmpegCmd = "$ffmpegPath -i \"$inputFile\" -vf \"scale=-2:720:flags=lanczos,unsharp=5:5:1.0:5:5:0.5,hqdn3d=1.5:1.5:6:6\" -c:v libx264 -preset veryslow -crf 16 -tune film -profile:v high -level 4.1 -pix_fmt yuv420p -c:a copy -movflags +faststart -y \"$outputFile\" 2>&1";
         
         dLog('video_upgrade')->info('开始升级视频到720p', ['command' => $ffmpegCmd]);
         $output = shell_exec($ffmpegCmd);