Pythonを使用した動画処理は、多くの場面で役立つスキルです。本記事では、動画の読み込みから高度な編集、ストリーミング実装までを徹底解説します。
動画の読み込みと再生
動画を読み込んで再生するには、cv2
(OpenCV)ライブラリを使用します。
import cv2
video_path = "sample_video.mp4"
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
ポイント
- 動画ファイルのパスを指定し、フレームごとに読み取ります。
cv2.imshow
を使って動画を表示します。
動画フレームの抽出
動画をフレームごとに画像として保存する方法を説明します。
import cv2
video_path = "sample_video.mp4"
output_dir = "frames/"
cap = cv2.VideoCapture(video_path)
frame_number = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2.imwrite(f"{output_dir}frame_{frame_number}.jpg", frame)
frame_number += 1
cap.release()
ポイント
- 各フレームを画像ファイルとして保存可能です。
- フォルダパスを事前に作成しておきましょう。
動画の形式変換
動画の形式を変換するには、moviepy
を使用します。
from moviepy.editor import VideoFileClip
clip = VideoFileClip("sample_video.mp4")
clip.write_videofile("output_video.avi", codec="libx264")
ポイント
moviepy
は簡単に動画の形式を変換できます。- 出力形式に応じて適切なコーデックを選択してください。
動画のトリミング
動画の一部を切り出す方法です。
from moviepy.editor import VideoFileClip
clip = VideoFileClip("sample_video.mp4")
trimmed_clip = clip.subclip(10, 20)
trimmed_clip.write_videofile("trimmed_video.mp4")
ポイント
subclip
メソッドを使用して開始時間と終了時間を指定します。
動画の結合
複数の動画を結合する方法です。
from moviepy.editor import concatenate_videoclips, VideoFileClip
clip1 = VideoFileClip("video1.mp4")
clip2 = VideoFileClip("video2.mp4")
final_clip = concatenate_videoclips([clip1, clip2])
final_clip.write_videofile("merged_video.mp4")
ポイント
- 動画クリップのリストを
concatenate_videoclips
に渡します。
動画に字幕を追加
動画に字幕を追加する方法です。
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
clip = VideoFileClip("sample_video.mp4")
text = TextClip("Hello, World!", fontsize=70, color="white")
text = text.set_position("bottom").set_duration(clip.duration)
final_clip = CompositeVideoClip([clip, text])
final_clip.write_videofile("subtitled_video.mp4")
ポイント
TextClip
でテキストを作成し、CompositeVideoClip
で合成します。
解像度の変更
動画の解像度を変更する方法です。
import cv2
cap = cv2.VideoCapture("sample_video.mp4")
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("resized_video.avi", fourcc, 30.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
resized_frame = cv2.resize(frame, (640, 480))
out.write(resized_frame)
cap.release()
out.release()
ポイント
cv2.resize
でフレームのサイズを変更します。
動画の回転
動画を回転させる方法です。
import cv2
cap = cv2.VideoCapture("sample_video.mp4")
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("rotated_video.avi", fourcc, 30.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
rotated_frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE)
out.write(rotated_frame)
cap.release()
out.release()
ポイント
cv2.rotate
を使用してフレームを回転させます。
動画ストリーミングの実装
動画ストリーミングを実装するには、Flask
とOpenCV
を使用します。
from flask import Flask, Response
import cv2
app = Flask(__name__)
@app.route("/video")
def video_stream():
cap = cv2.VideoCapture("sample_video.mp4")
def generate():
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
_, buffer = cv2.imencode('.jpg', frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')
cap.release()
return Response(generate(), mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == "__main__":
app.run(debug=True)
ポイント
Flask
を使ってストリーミングサーバーを構築します。
動画データ解析
動画データを解析して特定の情報を抽出します。
import cv2
cap = cv2.VideoCapture("sample_video.mp4")
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
frame_rate = cap.get(cv2.CAP_PROP_FPS)
duration = frame_count / frame_rate
print(f"Frame Count: {frame_count}")
print(f"Frame Rate: {frame_rate}")
print(f"Duration: {duration} seconds")
cap.release()
ポイント
- 動画のフレーム数や再生時間を計算します。
まとめ
Pythonを使用した動画処理は、シンプルなタスクから高度な編集、ストリーミングまで多岐にわたります。本記事で紹介したテクニックを活用して、独自の動画プロジェクトに挑戦してください。Pythonのライブラリを駆使することで、効率的かつ柔軟な動画処理が可能です。
コメント