Python 音声付きの逆再生動画を作成する

 本記事では、mp4動画から逆再生する動画ファイルを作成する雛形コードを載せました。使用するライブラリは4つで、OpenCV, Pillow, MoviePy, Pydubです。

それらのインストールはpipで次のようにします。

pip install opencv-python
pip install Pillow
pip install moviepy
pip install pydub

本コードで作成した逆再生動画は下記です。(文字の挿入はWindows10に標準搭載アプリの「フォト」を使用して作成しました)

www.youtube.com

下図は、本プログラム実行後のフォルダ内です。実行ファイルは「play_reverse.py」で、作成する逆再生動画の元動画ファイルは「メダカのうんこ綱引き.mp4」です。そして、「zzz_01~04」の4つのファイルを生成します。

f:id:HK29:20210915234318p:plain

 

■本プログラム

import cv2
from PIL import Image, ImageFont, ImageDraw
import moviepy.editor as mp
from pydub import AudioSegment


# 動画を逆再生保存する関数
def movie_reverse(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, 0, -1):
        video.set(cv2.CAP_PROP_POS_FRAMES, i)
        ret, frame = video.read()
        writer.write(frame)
        if i % 50 == 0:
            print(str(i) + "/" + str(num_of_frame))
        
    # 後処理
    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, out_audio2):
    # オリジナル動画をメモリにクリップ
    clip_in = mp.VideoFileClip(input_video1).subclip()
    
    # オリジナル動画から音声ファイルを抽出して、MP3ファイルに出力する
    clip_in.audio.write_audiofile(out_audio)
        
    # (pydubで)音声ファイルの読み込み
    sound = AudioSegment.from_file(out_audio, 'mp3')
    
    # (pydubで)反転音声(逆再生)のオブジェクト作成
    sound_reverse = sound.reverse()
    
    # (pydubで)反転音声をMP3ファイルに保存
    sound_reverse.export(out_audio2, format='mp3')
    
    # (音声を付与したい)動画をメモリにクリップする
    clip_out = mp.VideoFileClip(input_video2).subclip()
    
    # 音声を付与して、ファイルに出力する
    clip_out.write_videofile(out_file, audio = out_audio2)


if __name__ == '__main__':
    # 設定
    input_video = 'メダカのうんこ綱引き.mp4'
    out_video1 = 'zzz_01_逆再生動画.mp4'
    out_audio = 'zzz_02_音声.mp3'
    out_audio2 = 'zzz_03_逆再生音声.mp3'
    out_video2 = 'zzz_04_逆再生動画_完.mp4'
    
    # オリジナル動画を元に、逆再生動画を作成する
    movie_reverse(input_video, out_video1)
    
    # 作成した逆再生動画には音声がないため、
    # 逆再生音声を作成して、それを付与する
    input_video2 = out_video1
    extract_and_set_audio(input_video, input_video2, out_video2, out_audio, out_audio2)
    

以上

<広告>