XENEXE

Python 3 + OpenCV を用いて動画の長さを取得する


heroImage

1. はじめに

OpenCV は,画像解析や機械学習などの機能が実装されている FLOSS のライブラリです。C/C++ 以外にも,Java や Python など,様々なプログラミング言語向けのラッパーが開発,配布されています。また,OpenCV は画像だけでなく動画も操作することが出来ます。本記事は,Python 3 + OpenCV を用いて動画の長さを取得する手順について記述します。

また,本記事内で行っている作業は以下の環境下で実行したものです。Python や OpenCV はインストール済みの前提で記述しており,インストール手順は割愛していることをご了承ください。

2. 解析用動画準備

解析用の動画として,Pixabay で公開されている動画を活用します。Pixabay からダウンロードした動画を,任意のディレクトリに sample.mp4 として保存します。Mediainfo コマンドを用いて,ダウンロードした動画のメディア情報を取得すると,30 秒 15 ミリ秒の動画であることがわかります。

Terminal window
1
$ ls
2
sample.mp4
3
$ mediainfo sample.mp4
4
General
5
Complete name : sample.mp4
6
Format : MPEG-4
7
Format profile : Base Media / Version 2
8
Codec ID : mp42 (mp42/mp41/isom/avc1)
9
File size : 6.11 MiB
10
Duration : 30 s 15 ms
11
Overall bit rate : 1 708 kb/s
12
(省略)
13
Stream size : 928 KiB (15%)
14
Encoded date : UTC 2020-12-15 00:38:33
15
Tagged date : UTC 2020-12-15 00:38:33

3. スクリプト

以下のスクリプトを,上記でダウンロードした動画と同じディレクトリ内に app.py というファイル名で保存します。OpenCV によって,動画のフレーム数 (8 行目) とフレームレート (9 行目) を取得するが出来ます。取得したフレーム数をフレームレートで割ることで,動画の長さ (秒) を取得することが出来ます。

1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
import cv2
5
6
if __name__ == '__main__':
7
cap = cv2.VideoCapture("sample.mp4") # 動画を読み込む
8
video_frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT) # フレーム数を取得する
9
video_fps = cap.get(cv2.CAP_PROP_FPS) # フレームレートを取得する
10
video_len_sec = video_frame_count / video_fps # 長さ(秒)を計算する
11
print(video_len_sec) # 長さ(秒)を出力する

4. 動作確認

上記で保存した app.py を実行します。秒数が表示されれば正常に動作しています。Mediainfo コマンドを用いた解析結果では,30 秒 15 ミリ秒でしたが,OpenCV を用いた解析結果では 30 秒と,ミリ秒以下が切り捨てられていることがわかります。そのため,OpenCV を用いて詳細な解析を行う際は注意が必要です。

Terminal window
1
$ python3 app.py
2
30.0

5. おわりに

ここまで,Python 3 + OpenCV を用いて動画の長さを取得する手順について記述してきました。第 4 章でも述べた通り,OpenCV を用いた解析ではミリ秒以下が切り捨てられているため,OpenCV を用いて詳細な解析を行う際は注意が必要です。