Pythonで動画情報を取得する

はじめに

Pythonで動画情報の取得をしたかった時に色々モジュール試してみたけど大抵どれも裏でffmpegかffprobe使っててPythonで完結してるものを見つけられなかったのでメモがてら使い方を書いておく

hachoir

ファイルのメタデータの取得・編集が出来る
対応ファイルフォーマットは以下参考
http://hachoir3.readthedocs.io/metadata.html

Python2

インストール

pipで入れる
幾つかにパッケージが分かれてて既に厄介 今回はhachoir_metadataを使うので

1$ pip install hachoir_core hachoir_metadata hachoir_parser

使い方

 1# -*- coding: utf-8 -*-
 2
 3from hachoir_parser import createParser
 4from hachoir_metadata import extractMetadata
 5
 6filepath = u"ファイルパス"
 7parser = createParser(filepath)
 8
 9meta = extractMetadata(parser)
10print meta.exportPlaintext()
11print meta.get("duration")

再生時間はtimedeltaで返ってくる

素直に添字で取れれば良いのにgetメソッド使わないといけなかったりで微妙に使いづらい
meta.dict["_Metadata__data"].keys()
とか使えば一応添字の一覧が見れる なぜkeysメソッドとかがないのか
Githubで探すとexportPlaintextの結果を「:」でsplitしたりしててみんな困ったんだろうなって
ドキュメント見ても良い感じのやり方を見つけられなかったのでぼちぼち元のコードを見つつ・・・

Python3

インストール

pipでは入らないのでソースコードを直接落として使う
レポジトリは
https://bitbucket.org/haypo/hachoir3/overview
にあるのでcloneするかファイル→ダウンロードで最新のコードを落としてくる
必要なのはhachoirディレクトリだけ今回は試すだけなのでそれだけディレクトリにコピーした

使い方

1from hachoir.metadata import extractMetadata
2from hachoir.parser import createParser
3
4filepath = u"ファイルパス"
5parser = createParser(filepath)
6meta = extractMetadata(parser)
7duration = meta.get("duration")
8print(duration)

構造が変わってたから少し困った
ドキュメント見ても3のドキュメントを名乗ってるわりに中のコードは2のサンプルだったりで辛い

ffprobe

一応試したのでメモ

Python2

2では試してないけど3とほぼ同じはず

Python3

インストール

公式から落としてきてパスがあるとこに置くだけ(Win

使い方

subprocessを使って出力結果をパースする
本当は[FORMAT][/FORMAT]で囲まれてるとこだけ正規表現とかで抜いた方が良い

 1import subprocess
 2cmd = "ffprobe"
 3filepath = "ファイルパス"
 4p = subprocess.Popen(
 5    "%s %s -hide_banner -show_entries format" % (cmd, filepath),
 6    stdout=subprocess.PIPE,
 7    stderr=subprocess.PIPE
 8)
 9out, err = p.communicate()
10
11d = {}
12for i in out.split(b"\n")[1:-1]:
13    if i:
14        tmp = [x.decode("utf-8") for x in i.strip().split(b"=")]
15        d[tmp[0]] = "".join(tmp[1:])

戻り値がbytes型なので扱いがちょっと面倒
辞書内包表記で書こうとしたけど綺麗に書けなかったのでやめた

1d = datetime.timedelta(
2  seconds=int(d["duration"])),
3)

とかでdeltatimeにできる

まとめ

結局ffprobe使うことにしました
前者は対応フォーマットさえ多ければ良かった・・・mp4使えないのが痛い

余談

使ったのは頼まれて作った字幕生成スクリプトです
動画の再生時間と作成時間を見て監視カメラ的な日時の字幕を自動生成する感じ