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使えないのが痛い
余談
使ったのは頼まれて作った字幕生成スクリプトです
動画の再生時間と作成時間を見て監視カメラ的な日時の字幕を自動生成する感じ