From b8ebcf9fe3c7231ee98c212c6e34435da8a7f2fc Mon Sep 17 00:00:00 2001 From: henryruhs Date: Mon, 13 Jan 2025 11:46:56 +0100 Subject: [PATCH] Fix set audio quality --- facefusion/ffmpeg_builder.py | 11 +++++++---- tests/test_curl_builder.py | 9 +++++---- tests/test_ffmpeg_builder.py | 36 ++++++++++++++++++++++++++---------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/facefusion/ffmpeg_builder.py b/facefusion/ffmpeg_builder.py index 755f0e1..e956750 100644 --- a/facefusion/ffmpeg_builder.py +++ b/facefusion/ffmpeg_builder.py @@ -124,13 +124,16 @@ def set_audio_channel_total(audio_channel_total : int) -> Commands: def set_audio_quality(audio_encoder : AudioEncoder, audio_quality : int) -> Commands: if audio_encoder == 'aac': - audio_compression = round(10 - (audio_quality * 0.9)) + audio_compression = round(2.0 - ((audio_quality / 100) * 1.9), 1) return [ '-q:a', str(audio_compression) ] if audio_encoder == 'libmp3lame': - audio_compression = round(9 - (audio_quality * 0.9)) + audio_compression = round(9 - (audio_quality / 100) * 9) return [ '-q:a', str(audio_compression) ] - if audio_encoder in [ 'libopus', 'libvorbis' ]: - audio_compression = round((100 - audio_quality) / 10) + if audio_encoder == 'libopus': + audio_bit_rate = round(64 + (audio_quality / 100) * (320 - 64)) + return [ '-b:a', str(audio_bit_rate) + 'k' ] + if audio_encoder == 'libvorbis': + audio_compression = round(-1.0 + (audio_quality / 100) * 11, 1) return [ '-q:a', str(audio_compression) ] return [] diff --git a/tests/test_curl_builder.py b/tests/test_curl_builder.py index 21367e2..d80d58b 100644 --- a/tests/test_curl_builder.py +++ b/tests/test_curl_builder.py @@ -1,17 +1,18 @@ from shutil import which -from facefusion import curl_builder, metadata +from facefusion import metadata +from facefusion.curl_builder import chain, head, run def test_run() -> None: user_agent = metadata.get('name') + '/' + metadata.get('version') - assert curl_builder.run([]) == [ which('curl'), '--user-agent', user_agent, '--insecure', '--location', '--silent' ] + assert run([]) == [ which('curl'), '--user-agent', user_agent, '--insecure', '--location', '--silent' ] def test_chain() -> None: - commands = curl_builder.chain( - curl_builder.head(metadata.get('url')) + commands = chain( + head(metadata.get('url')) ) assert commands == [ '-I', metadata.get('url') ] diff --git a/tests/test_ffmpeg_builder.py b/tests/test_ffmpeg_builder.py index e180a86..1ff0b25 100644 --- a/tests/test_ffmpeg_builder.py +++ b/tests/test_ffmpeg_builder.py @@ -1,14 +1,15 @@ from shutil import which from facefusion import ffmpeg_builder +from facefusion.ffmpeg_builder import chain, run, select_frame_range, set_audio_quality, set_audio_sample_size, set_stream_mode def test_run() -> None: - assert ffmpeg_builder.run([]) == [ which('ffmpeg'), '-loglevel', 'error' ] + assert run([]) == [ which('ffmpeg'), '-loglevel', 'error' ] def test_chain() -> None: - commands = ffmpeg_builder.chain( + commands = chain( ffmpeg_builder.set_progress() ) @@ -16,17 +17,32 @@ def test_chain() -> None: def test_stream_mode() -> None: - assert ffmpeg_builder.set_stream_mode('udp') == [ '-f', 'mpegts' ] - assert ffmpeg_builder.set_stream_mode('v4l2') == [ '-f', 'v4l2' ] + assert set_stream_mode('udp') == [ '-f', 'mpegts' ] + assert set_stream_mode('v4l2') == [ '-f', 'v4l2' ] def test_select_frame_range() -> None: - assert ffmpeg_builder.select_frame_range(0, None, 30) == [ '-vf', 'trim=start_frame=0,fps=30' ] - assert ffmpeg_builder.select_frame_range(None, 100, 30) == [ '-vf', 'trim=end_frame=100,fps=30' ] - assert ffmpeg_builder.select_frame_range(0, 100, 30) == [ '-vf', 'trim=start_frame=0:end_frame=100,fps=30' ] - assert ffmpeg_builder.select_frame_range(None, None, 30) == [ '-vf', 'fps=30' ] + assert select_frame_range(0, None, 30) == [ '-vf', 'trim=start_frame=0,fps=30' ] + assert select_frame_range(None, 100, 30) == [ '-vf', 'trim=end_frame=100,fps=30' ] + assert select_frame_range(0, 100, 30) == [ '-vf', 'trim=start_frame=0:end_frame=100,fps=30' ] + assert select_frame_range(None, None, 30) == [ '-vf', 'fps=30' ] def test_audio_sample_size() -> None: - assert ffmpeg_builder.set_audio_sample_size(16) == [ '-f', 's16le', '-acodec', 'pcm_s16le' ] - assert ffmpeg_builder.set_audio_sample_size(32) == [ '-f', 's32le', '-acodec', 'pcm_s32le' ] + assert set_audio_sample_size(16) == [ '-f', 's16le', '-acodec', 'pcm_s16le' ] + assert set_audio_sample_size(32) == [ '-f', 's32le', '-acodec', 'pcm_s32le' ] + + +def test_set_audio_quality() -> None: + assert set_audio_quality('aac', 0) == [ '-q:a', '2.0' ] + assert set_audio_quality('aac', 50) == [ '-q:a', '1.1' ] + assert set_audio_quality('aac', 100) == [ '-q:a', '0.1' ] + assert set_audio_quality('libmp3lame', 0) == [ '-q:a', '9' ] + assert set_audio_quality('libmp3lame', 50) == [ '-q:a', '4' ] + assert set_audio_quality('libmp3lame', 100) == [ '-q:a', '0' ] + assert set_audio_quality('libopus', 0) == [ '-b:a', '64k' ] + assert set_audio_quality('libopus', 50) == [ '-b:a', '192k' ] + assert set_audio_quality('libopus', 100) == [ '-b:a', '320k' ] + assert set_audio_quality('libvorbis', 0) == [ '-q:a', '-1.0' ] + assert set_audio_quality('libvorbis', 50) == [ '-q:a', '4.5' ] + assert set_audio_quality('libvorbis', 100) == [ '-q:a', '10.0' ]