优化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}"

优化说明:

  1. 使用变量 use_filter_complexuse_vf 来表示是否需要使用 -filter_complex-vf 命令。
  2. 减少重复的条件判断,将多个条件合并到一起。
  3. 使用 filter_list 变量存储所有需要使用的过滤器,然后根据需要使用 -filter_complex-vf 命令。
  4. 提高代码的可读性和可维护性。

代码改进:

  • 将双引号改为单引号,以提高代码可读性。
  • 使用变量来存储命令参数,提高代码可维护性。
  • 使用条件语句来控制命令参数的添加,简化代码逻辑。

示例:

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命令构建代码,可以提高代码的可读性和效率,使代码更易于维护和扩展。

优化FFmpeg命令构建:提高代码可读性和效率

原文地址: https://www.cveoy.top/t/topic/lQhU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录