yyhhyy's blog

yyhhyy

解决MoviePy保存视频时的视频质量降低问题

70
2024-08-14

1. 起源

最近在折腾自动化剪辑视频的时候,发现我原视频视频质量看起来还ok,至少肉眼看过去还好,但是经过moviepy处理后保存下来的视频却质量降低了很多,会有很多噪点的产生。其实最直观的就是,传进去的视频大小是100MB,出来的视频就只有不到10MB。

2. 解决方案

moviepy导出时的编码需要指定,且文件后缀也有一定要求。

先简单阐述下:

不同的编码器支持不同的容器格式(也称为封装格式)。以下是一些常见的编码器及其通常支持的容器格式:

  1. H.264 无损模式 :通常使用 .mp4.mkv 容器。

  2. H.265/HEVC 无损模式 :通常使用 .mp4.mkv 容器。

  3. ProRes:通常使用 .mov 容器。

  4. DNxHD/DNxHR:通常使用 .mov 容器。

代码附上:

H.264 无损模式(.mp4 容器)

video_clip.write_videofile(
    output_file + ".mp4",
    audio_codec="aac",
    temp_audiofile_path=output_dir,
    threads=params.n_threads or 2,
    logger=None,
    codec="libx264",
    ffmpeg_params=["-qp", "0"],  # 无损模式
    fps=video_clip.fps
)

H.264 无损模式(.mkv 容器)

video_clip.write_videofile(
    output_file + ".mkv",
    audio_codec="aac",
    temp_audiofile_path=output_dir,
    threads=params.n_threads or 2,
    logger=None,
    codec="libx264",
    ffmpeg_params=["-qp", "0"],  # 无损模式
    fps=video_clip.fps
)

H.265/HEVC 无损模式(.mp4 容器)

video_clip.write_videofile(
    output_file + ".mp4",
    audio_codec="aac",
    temp_audiofile_path=output_dir,
    threads=params.n_threads or 2,
    logger=None,
    codec="libx265",
    ffmpeg_params=["-qp", "0"],  # 无损模式
    fps=video_clip.fps
)

H.265/HEVC 无损模式(.mkv 容器)

video_clip.write_videofile(
    output_file + ".mkv",
    audio_codec="aac",
    temp_audiofile_path=output_dir,
    threads=params.n_threads or 2,
    logger=None,
    codec="libx265",
    ffmpeg_params=["-qp", "0"],  # 无损模式
    fps=video_clip.fps
)

ProRes(.mov 容器)

video_clip.write_videofile(
    output_file + ".mov",
    audio_codec="aac",
    temp_audiofile_path=output_dir,
    threads=params.n_threads or 2,
    logger=None,
    codec="prores",
    fps=video_clip.fps
)

请根据自己的需求选择合适的编码器和容器格式。当然也可以考虑使用 .mp4 容器,因为它是常见的格式,并且大多数编码器都支持。(不过偶尔mp4不太好用,moviepy没法直接保存