Python 音声付きの左右反転動画を作る「OpenCV」

 本記事では、Pythonで左右反転動画を作成する雛形コードを載せました。

www.youtube.comの

使用するライブラリは3つで、OpenCV, Pillow, MoviePyです。
それらのインストールはpipで次のようにします。

pip install opencv-python
pip install Pillow
pip install moviepy

 下図は本コード実行後のフォルダ内です。「movie6.py」は本プログラムで、「前田対上原_編集_MMFN0756.mp4」はオリジナルの動画ファイルです。そして、生成されたファイルは3つで、「zzz_反転動画.mp4」は音声なし反転動画ファイル、「zzz_音声.mp3」は音声のみファイル、「zzz_反転動画_完.mp4」は音声付き反転動画です。

f:id:HK29:20210403232516p:plain

その後、Windwosの標準動画編集ソフト「フォト」で編集したのが冒頭リンクの動画です。

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
from PIL import Image, ImageFont, ImageDraw
import moviepy.editor as mp


# 動画を左右反転する関数
def movie_inversion(input_file, out_file):
    # 動画とそのフレームワーク情報を取得
    video = cv2.VideoCapture(input_file)
    width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    size = (width, height)
    num_of_frame = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    fps = int(video.get(cv2.CAP_PROP_FPS))

    # 出力フォーマットの指定
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    writer = cv2.VideoWriter(out_file, fourcc, fps, (width, height))

    # フレーム1枚ずつ処理する
    for i in range(num_of_frame):
        ret, frame = video.read()
        dst = cv2.flip(frame, 1) # 第二引数「1」で左右反転する
        writer.write(dst)
        if i % 50 == 0:
            print(str(i) + "/" + str(num_of_frame))
            #cv2.imwrite('mosaic' + str(i) + '.jpg', dst)
            
    # 後処理
    writer.release()
    video.release()
    print("num_of_frame -> " + str(num_of_frame))
    print("fps -> " + str(fps))


# 音声を動画に加える関数(編集した動画は一旦、音声がなくなるため)
def extract_and_set_audio(input_video1, input_video2, out_file, out_audio):
    # オリジナル動画をメモリにクリップ
    clip_in = mp.VideoFileClip(input_video1).subclip()
    
    # オリジナル動画から音声ファイルを抽出して、ファイルに出力する
    clip_in.audio.write_audiofile(out_audio)
    
    # (音声を付与したい)動画をメモリにクリップする
    clip_out = mp.VideoFileClip(input_video2).subclip()
    
    # 音声を付与して、ファイルに出力する
    clip_out.write_videofile(out_file, audio = out_audio)
    
    
# メイン関数
if __name__ == '__main__':
    # 設定
    input_video = '前田対上原_編集_MMFN0756.mp4'
    out_video1 = 'zzz_01_反転動画.mp4'
    out_audio = 'zzz_02_音声.mp3'
    out_video2 = 'zzz_03_反転動画_完.mp4'
    
    # オリジナル動画を元に、左右反転動画を作成する
    movie_inversion(input_video, out_video1)
    
    # 作成した左右反転動画には音声がないため、音声を付与する
    input_video2 = out_video1
    extract_and_set_audio(input_video, input_video2, out_video2, out_audio)
    

以上

<広告>