1 减少opencv-python输出MP4视频时的文件大小

几乎每个人都经常使用以下代码将经过某些处理的视频帧保存为MP4

video_writer_cap = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
video_writer_cap = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*'xvid'), fps, (width, height))

上述代码可以正确的将视频帧保存为mp4视频,但是其视频编码并不是h264,所以保存之后的视频往往很大,所以我们尝试使用以下代码进行替代

video_writer_cap = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*'avc1'), fps, (width, height))

这种方法保存后的视频编码是h264,并且大幅减少了输出视频大小,但是这还不是最优解。

1.1 使用moviepy减少输出MP4视频时的文件大小

最近一次偶然的机会,我使用了moviepy这个库将一个视频的编码转换为MP4,发现moviepy输出的视频比

video_writer_cap = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*'avc1'), fps, (width, height))

这种方式更小,并且质量上并没有任何区别,使用的是以下代码

from moviepy.editor import VideoFileClip

def convert_to_h264(input_video_path):
    if not os.path.exists(input_video_path):
        raise Exception(f'{input_video_path} is not exist')

    # 在output_video_path修改名称,文件名加上moviepy_前缀
    new_output_video_path = input_video_path.replace('.mp4', '_h264.mp4')

    # Load the input video
    video_clip = VideoFileClip(input_video_path)

    # Write the output video with H.264 encoding
    video_clip.write_videofile(new_output_video_path, codec='libx264')

原因可能是opencv内部的h264编码实现并没有采用ffmpeg的标准实现?