今回の内容
今回はPythonで字幕をつけたいと思います。動画編集編は、この記事に他にもあるので、ぜひ見に行ってください!
使うライブラリ
今回はffmpegを使わずにcv2やPillowをつかって編集します。import sys import numpy as np import os import ffmpeg from PIL import ImageFont, ImageDraw, Image from pydub import AudioSegment import cv2 import subprocess text = "SubTitle" file_path = "input.mp4" save_path = "output.mp4" toTime = 2 fromTime = 10 #動画の情報を取得する cap = cv2.VideoCapture(file_path) fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter("tmp.mp4" ,fourcc, fps, (width, height)) i = 0 #一コマ一コマ取り出し、Pillowで画像として編集 while True: ret, frame = cap.read() if ret: frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pil_image = Image.fromarray(frame_rgb) draw = ImageDraw.Draw(pil_image) if i <= fromTime*fps and i >= toTime*fps: font = ImageFont.truetype('C:\\Windows\\Fonts\\HGRGE.TTC', 40) draw.text((50, 300), text, font=font) rgb_image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) out.write(rgb_image) i=i+1 print(cap.get(cv2.CAP_PROP_FRAME_COUNT),"/",i) else: break cap.release() out.release() #このままだと音声がないため、音声と合体する subprocess.run("ffmpeg -i " + file_path + " audio.wav -c copy") print("音声への変換完了") s1 = ffmpeg.input("tmp.mp4") s2 = ffmpeg.input("audio.wav") s = ffmpeg.output(s1,s2,save_path, vcodec="copy", acodec="aac") ffmpeg.run(s) os.remove("audio.wav") os.remove("tmp.mp4") print("全て完了")
解説
#一コマ一コマ取り出し、Pillowで画像として編集 while True: ret, frame = cap.read() if ret: frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pil_image = Image.fromarray(frame_rgb) draw = ImageDraw.Draw(pil_image) if i <= fromTime*fps and i >= toTime*fps: font = ImageFont.truetype('C:\\Windows\\Fonts\\HGRGE.TTC', 40) draw.text((50, 300), text, font=font) rgb_image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) out.write(rgb_image) i=i+1 print(cap.get(cv2.CAP_PROP_FRAME_COUNT),"/",i) else: break一コマ一コマ分けるコードの中でも
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pil_image = Image.fromarray(frame_rgb) draw = ImageDraw.Draw(pil_image) if i <= fromTime*fps and i >= toTime*fps: font = ImageFont.truetype('C:\\Windows\\Fonts\\HGRGE.TTC', 40) draw.text((50, 300), text, font=font) rgb_image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) out.write(rgb_image)この部分です。最初にPillowの画像に変換し、そのあとにその画像を編集します。
draw.textでテキストを挿入できます。
やろうと思えば画像も描画できるので、今度別の記事で紹介したいと思います。
truetypeでフォントも指定できます。
そして、音声とかのコード
#このままだと音声がないため、音声と合体する subprocess.run("ffmpeg -i " + file_path + " audio.wav -c copy") print("音声への変換完了") s1 = ffmpeg.input("tmp.mp4") s2 = ffmpeg.input("audio.wav") s = ffmpeg.output(s1,s2,save_path, vcodec="copy", acodec="aac") ffmpeg.run(s) os.remove("audio.wav") os.remove("tmp.mp4")の部分では最初に動画をwav形式に変換します。(subprocessでやらないとなぜかできない)
そしてから、音声と動画を合体させています。
とりあえずここまで。うまくいかなかったらコメントよろしく!
0 件のコメント:
コメントを投稿