diff --git a/apps/api/app/services/cover_service.py b/apps/api/app/services/cover_service.py index b9453bee5..a99ca8961 100644 --- a/apps/api/app/services/cover_service.py +++ b/apps/api/app/services/cover_service.py @@ -215,7 +215,7 @@ class CoverService: import subprocess # scale + crop 实现 cover 裁剪 - vf = f"scale={width}:{height}:force_original_aspect_ratio=increase," f"crop={width}:{height}" + vf = f"scale={width}:{height}:force_original_aspect_ratio=increase," f"crop={width}:{height},format=yuvj420p" command = [ "ffmpeg", @@ -258,6 +258,8 @@ class CoverService: "1", "-q:v", str(quality), + "-pix_fmt", + "yuvj420p", "-f", "mjpeg", str(output_path), diff --git a/apps/worker/video_processing/cover_generator.py b/apps/worker/video_processing/cover_generator.py index 8e656e6d2..5d945c529 100755 --- a/apps/worker/video_processing/cover_generator.py +++ b/apps/worker/video_processing/cover_generator.py @@ -93,7 +93,7 @@ class CoverGenerator: time_sec = 0 # scale + crop 实现 cover 裁剪(铺满输出尺寸) - vf = f"scale={width}:{height}:force_original_aspect_ratio=increase," f"crop={width}:{height}" + vf = f"scale={width}:{height}:force_original_aspect_ratio=increase," f"crop={width}:{height},format=yuvj420p" command = [ FFMPEG_BIN, @@ -281,7 +281,7 @@ class CoverGenerator: output_path.parent.mkdir(parents=True, exist_ok=True) # scale + crop 实现 cover 裁剪 - vf = f"scale={width}:{height}:force_original_aspect_ratio=increase," f"crop={width}:{height}" + vf = f"scale={width}:{height}:force_original_aspect_ratio=increase," f"crop={width}:{height},format=yuvj420p" command = [ FFMPEG_BIN, diff --git a/apps/worker/video_processing/processor.py b/apps/worker/video_processing/processor.py index 5b2e3e7ca..af44a0d6e 100644 --- a/apps/worker/video_processing/processor.py +++ b/apps/worker/video_processing/processor.py @@ -159,7 +159,7 @@ class VideoProcessor: try: ( ffmpeg.input(video_path, ss=timestamp) - .output(output_path, vframes=1, format="image2", vcodec="mjpeg") + .output(output_path, vframes=1, format="image2", vcodec="mjpeg", pix_fmt="yuvj420p") .overwrite_output() .run(capture_stdout=True, capture_stderr=True) ) diff --git a/apps/worker/video_processing/thumbnail_generator.py b/apps/worker/video_processing/thumbnail_generator.py index 5429587cd..eecdc2244 100755 --- a/apps/worker/video_processing/thumbnail_generator.py +++ b/apps/worker/video_processing/thumbnail_generator.py @@ -60,7 +60,7 @@ def extract_first_frame( # -ss 放在 -i 前面(input seeking,更快但精度稍低,缩略图够用) # -vframes 1 只取一帧 # -q:v 2 jpeg 高质量 - scale_filter = f"scale={width}:{height}:force_original_aspect_ratio=decrease" + scale_filter = f"scale={width}:{height}:force_original_aspect_ratio=decrease,format=yuvj420p" cmd = [ FFMPEG_BIN, "-y", diff --git a/apps/worker/worker_app/tasks/asset_analyzer.py b/apps/worker/worker_app/tasks/asset_analyzer.py index 3899deb79..949d59819 100755 --- a/apps/worker/worker_app/tasks/asset_analyzer.py +++ b/apps/worker/worker_app/tasks/asset_analyzer.py @@ -157,6 +157,8 @@ class AssetAnalyzer: "1", "-q:v", "2", # 高质量 + "-pix_fmt", + "yuvj420p", # mjpeg 需要全范围 YUV "-f", "image2", output_path,