From af9cc1a37a088b8ba325e2f2d0a94f663fde92c8 Mon Sep 17 00:00:00 2001 From: Henry Ruhs Date: Mon, 6 Apr 2026 17:56:43 +0200 Subject: [PATCH] Fix/ffmpeg sanitize (#1074) * fix sanitize for videos * fix macos * fix macos --- facefusion/ffmpeg.py | 7 ++++--- tests/test_ffmpeg.py | 15 +++------------ 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/facefusion/ffmpeg.py b/facefusion/ffmpeg.py index 54e77681..5305260f 100644 --- a/facefusion/ffmpeg.py +++ b/facefusion/ffmpeg.py @@ -339,11 +339,12 @@ def sanitize_image(media_chunk_reader : MediaChunkReader, asset_path : str) -> b def sanitize_video(media_chunk_reader : MediaChunkReader, asset_path : str, security_strategy : ApiSecurityStrategy) -> bool: if security_strategy == 'strict': + available_video_encoders = get_available_encoder_set().get('video') commands = ffmpeg_builder.chain( ffmpeg_builder.set_input('pipe:0'), - ffmpeg_builder.set_video_encoder('libx264'), #todo - remove hard coded - ffmpeg_builder.set_video_preset('libx264', 'ultrafast'), #todo - remove hard coded - ffmpeg_builder.set_pixel_format('libx264'), #todo - remove hard coded + ffmpeg_builder.set_video_encoder(available_video_encoders[0]), + ffmpeg_builder.set_video_preset(available_video_encoders[0], 'ultrafast'), + ffmpeg_builder.set_pixel_format(available_video_encoders[0]), ffmpeg_builder.deep_copy_video(), ffmpeg_builder.deep_copy_audio(), ffmpeg_builder.strip_metadata(), diff --git a/tests/test_ffmpeg.py b/tests/test_ffmpeg.py index 40870dff..538dd9c9 100644 --- a/tests/test_ffmpeg.py +++ b/tests/test_ffmpeg.py @@ -1,13 +1,11 @@ import os import subprocess -import sys import tempfile import pytest import facefusion.ffmpeg from facefusion import process_manager, state_manager -from facefusion.common_helper import is_linux from facefusion.download import conditional_download from facefusion.ffmpeg import concat_video, extract_frames, merge_video, read_audio_buffer, replace_audio, restore_audio, sanitize_audio, sanitize_image, sanitize_video, spawn_frames from facefusion.ffprobe import probe_entries @@ -35,10 +33,7 @@ def before_all() -> None: subprocess.run([ 'ffmpeg', '-i', get_test_example_file('source.mp3'), '-i', get_test_example_file('target-240p.mp4'), '-ar', '16000', get_test_example_file('target-240p-16khz.' + output_video_format) ]) subprocess.run([ 'ffmpeg', '-i', get_test_example_file('source.mp3'), '-i', get_test_example_file('target-240p.mp4'), '-ar', '48000', get_test_example_file('target-240p-48khz.mp4') ]) - if sys.platform == 'darwin': - subprocess.run([ 'ffmpeg', '-i', get_test_example_file('target-240p.mp4'), '-c:v', 'hevc_videotoolbox', '-an', get_test_example_file('target-240p-h265.mp4') ]) - else: - subprocess.run([ 'ffmpeg', '-i', get_test_example_file('target-240p.mp4'), '-c:v', 'libx265', '-an', get_test_example_file('target-240p-h265.mp4') ]) + subprocess.run([ 'ffmpeg', '-i', get_test_example_file('target-240p.mp4'), '-c:v', 'libx265', '-an', '-movflags', '+faststart', get_test_example_file('target-240p-h265.mp4') ]) state_manager.init_item('temp_path', tempfile.gettempdir()) state_manager.init_item('temp_frame_format', 'png') state_manager.init_item('output_audio_encoder', 'aac') @@ -250,12 +245,8 @@ def test_sanitize_video() -> None: get_test_output_path('test-sanitize-video-moderate.mp4') ] - if is_linux(): - assert sanitize_video(create_media_reader(file_path), output_paths[0], 'strict') is True - assert probe_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'h264' - else: - #todo: fix this test under windows - might be just proper preparation of testfile, as we need moov at the beginning - pytest.skip() + assert sanitize_video(create_media_reader(file_path), output_paths[0], 'strict') is True + assert probe_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'h264' assert sanitize_video(create_media_reader(file_path), output_paths[1], 'moderate') is True assert probe_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'hevc'