优化FFmpeg命令构建:提高代码可读性和效率
优化FFmpeg命令构建:提高代码可读性和效率
本文介绍如何优化FFmpeg命令构建,提高代码可读性和效率,通过合理使用条件语句和变量,简化命令生成过程,并提供示例代码。
原始代码:
# Build the FFmpeg command
ffmpeg_cmd = f"ffmpeg -hwaccel_output_format cuda -y -i {input_path} "
if add_watermark_flag:
ffmpeg_cmd += f"-i {watermark_path} "
if add_subtitle_flag and not change_resolution:
ffmpeg_cmd += f"-vf '{ass_filter}' "
if change_resolution and not add_subtitle_flag:
ffmpeg_cmd += f"-vf '{resize_filter}' "
if add_watermark_flag or (add_subtitle_flag and change_resolution) or (add_subtitle_flag and not change_resolution) or (change_resolution and not add_subtitle_flag):
ffmpeg_cmd += f"-filter_complex '"
filter_list = []
if add_watermark_flag:
filter_list.append(overlay_filter)
if add_subtitle_flag and change_resolution:
filter_list.append(ass_filter)
filter_list.append(resize_filter)
elif add_subtitle_flag and not change_resolution:
filter_list.append(ass_filter)
elif change_resolution and not add_subtitle_flag:
filter_list.append(resize_filter)
filter_complex_str = ";".join(filter_list)
ffmpeg_cmd += filter_complex_str + "' "
if not suppress_audio:
ffmpeg_cmd += f"-c:a copy "
ffmpeg_cmd += f"{codec_args} {cq_or_bitrate} -preset:v {preset} {audio_codec_args} {output_path}"
优化后的代码:
# Build the FFmpeg command
ffmpeg_cmd = f"ffmpeg -hwaccel_output_format cuda -y -i {input_path} "
if add_watermark_flag:
filter_list = [overlay_filter]
use_filter_complex = True
else:
use_filter_complex = False
if add_subtitle_flag and not change_resolution:
filter_list = [ass_filter]
use_vf = True
elif change_resolution and not add_subtitle_flag:
filter_list = [resize_filter]
use_vf = True
elif add_subtitle_flag and change_resolution:
filter_list = [ass_filter, resize_filter]
use_vf = True
else:
use_vf = False
if use_filter_complex:
filter_complex_str = ";".join(filter_list)
ffmpeg_cmd += f"-filter_complex '{filter_complex_str}' "
elif use_vf:
vf_str = ",".join(filter_list)
ffmpeg_cmd += f"-vf '{vf_str}' "
if not suppress_audio:
ffmpeg_cmd += f"-c:a copy "
ffmpeg_cmd += f"{codec_args} {cq_or_bitrate} -preset:v {preset} {audio_codec_args} {output_path}"
优化说明:
- 使用变量
use_filter_complex和use_vf来表示是否需要使用-filter_complex和-vf命令。 - 减少重复的条件判断,将多个条件合并到一起。
- 使用
filter_list变量存储所有需要使用的过滤器,然后根据需要使用-filter_complex或-vf命令。 - 提高代码的可读性和可维护性。
代码改进:
- 将双引号改为单引号,以提高代码可读性。
- 使用变量来存储命令参数,提高代码可维护性。
- 使用条件语句来控制命令参数的添加,简化代码逻辑。
示例:
input_path = "input.mp4"
watermark_path = "watermark.png"
output_path = "output.mp4"
add_watermark_flag = True
add_subtitle_flag = False
change_resolution = True
overlay_filter = "[0:v]overlay=10:10[out]"
ass_filter = "drawtext=fontfile=/path/to/font.ttf:text='Subtitle':x=10:y=10:fontsize=20:fontcolor=white"
resize_filter = "scale=1280:720"
# Build the FFmpeg command
# ... (optimized code)
print(ffmpeg_cmd)
输出:
ffmpeg -hwaccel_output_format cuda -y -i input.mp4 -i watermark.png -filter_complex '[0:v]overlay=10:10[out];scale=1280:720' -c:a copy {codec_args} {cq_or_bitrate} -preset:v {preset} {audio_codec_args} output.mp4
总结:
通过优化FFmpeg命令构建代码,可以提高代码的可读性和效率,使代码更易于维护和扩展。
原文地址: https://www.cveoy.top/t/topic/lQhU 著作权归作者所有。请勿转载和采集!