これはあくまで解説をする記事なので、具体的なサンプルコードなどは今度、別の記事で紹介します。
moviepyは使えない
moviepyはあまり使えません。理由は、長い動画だとバグっておかしくなるからです。そして自分がやりたいような具体的な編集ができないからです。
cv2,PILで動画編集をする手順
このような感じになります。1.FPS数などの情報を取得する
2.一コマ一コマ分ける
3.一コマ一コマ編集する
4.合体する
5.音声と合体する
1.FPS数などの情報を取得する
cap = cv2.VideoCapture(sys.argv[1]) 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))cv2を利用して動画の情報を取得できます。
FPS数の他に、解像度などを取得できます。縦、横、の長さです。
2と3.一コマ一コマ分ける / 編集する
これ見たらびっくりします。20FPSというのは、一秒間に20コマあるということになります。つまり1分の動画 だけでも、1200コマあるということです。
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') print(fps) out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height)) print("変換が完了しました。") print("字幕を付けます") i = 0 toTime = int(self.textctrl.GetValue()) fromTime = int(self.textctrl2.GetValue()) 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) #ここに処理 rgb_image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) out.write(rgb_image) i=i+1 else: breakこれで一コマ一コマ分断できました。それで一コマ一コマ編集していくわけですが
そんなんやってたら日が暮れるわ!ってなりますよね。
ですが、例えば、ずっと「あいうえお」と動画に表示させるようにするには繰り返し処理のなかで毎回drawTextなどでテキストを描画していればいいので、
そんなに時間はかかりません。
時間を指定してテキストを描画したい場合は、FPS × 字幕の表示開始時間(秒) と FPS × 字幕の表示終了時間(秒) という計算をつかって、
繰り返し処理の中でいかのようにします。
if i <= startTime*fps and i >= endTime*fps: font = ImageFont.truetype('C:\\Windows\\Fonts\\HGRGE.TTC', 40) draw.text((50, 300), self.textctrl3.GetValue(), font=font)このようにすれば期間を指定してテキストを描画できます。
4.合体する
一コマ一コマの編集が終わったら、あとはそれを合体して一つの動画にする必要がありますね。その処理は既にやっていて、この部分です。
out.write(rgb_image)この部分で書き込んでいます。
あとは
cap.release() out.release()これを書いて完了です。と思ったら、、、
5.音声と合体する
なんとこのままでは音声なしの動画となります。どうしてかというと、今やっているのは画像処理です。
その画像をつなげても音声のデータは入っていないため、ダメになります。
なので、ffmpaegなどを利用して音声と合体してやる必要があります。
subprocess.call("ffmpeg -i output.mp4 -i audio.wav -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output2.mp4")
ffmpegだけでの動画編集でできること
ffmpegでは簡単な基本的な動画編集がおこなえます。動画カットや、音声結合、動画結合、動画分断などは全てffmpeggやってくれます。
字幕をつけるのもがんばればできます。
これからの記事で詳しく紹介します。
0 件のコメント:
コメントを投稿