4

Hachoirを使用してビデオファイルからメタデータを取得しようとしています。'get'などを使用して幅と高さの値を返す場合を除いて、適切に機能します。

私はそれが次のようになると思いました:

metadata.get('width') 

ただし、これはエラーをスローします(オブジェクトには'width'プロパティがありません)。

私が以下を実行すると:

for data in sorted(metadata):
    if len(data.values ) > 0:
        print data.key, data.values[0].value

返されるのは、「共通」グループからの情報だけです。

私が使用するとき:

metadata.exportPlaintext 

...「共通」、「ビデオストリーム」、「オーディオストリーム」からの情報が返されます。結果の「text」アイテムを解析して、高さと幅の値を取り除くこともできますが、metadata.get('width')などを使用して適切に実行しようとします。

ソースコードを見て、私は次のものを使うことができると思いました:

for key, metadata in metadata.__groups.iteritems():

メタデータ内の._グループを反復処理しますが、「'AsfMetadata'オブジェクトには属性' _groups'がありません-'AsfMetadata'はMultipleMetadataのサブクラスであると思っていたので、そうではないはずです。 ()そのような変数を持っています。

おそらく、かなり明白な何かが欠けています。

4

2 に答える 2

4

これは、WMVファイルの場合はそれほど単純ではないようです。このような動画のメタデータをに変換しましたdefaultdict。画像の幅を取得する方が簡単です。

from collections import defaultdict
from pprint import pprint

from hachoir_metadata import metadata
from hachoir_core.cmd_line import unicodeFilename
from hachoir_parser import createParser

# using this example http://archive.org/details/WorkToFishtestwmv
filename = './test_wmv.wmv' 
filename, realname = unicodeFilename(filename), filename
parser = createParser(filename)

# See what keys you can extract
for k,v in metadata.extractMetadata(parser)._Metadata__data.iteritems():
    if v.values:
        print v.key, v.values[0].value

# Turn the tags into a defaultdict
metalist = metadata.extractMetadata(parser).exportPlaintext()
meta = defaultdict(defaultdict)
for item in metalist:
    if item.endswith(':'):
        k = item[:-1]
    else:
        tag, value = item.split(': ')
        tag = tag[2:]
        meta[k][tag] = value

print meta['Video stream #1']['Image width'] # 320 pixels
于 2013-01-27T13:00:14.707 に答える
4

プライベート属性にアクセスせず、テキスト出力を解析せずに、メディアファイルにサイズ情報を持つ最初のトップレベルのメタデータグループから取得するにwidth x heightは、次を使用できますfile_metadata.iterGroups()

#!/usr/bin/env python
import sys
from itertools import chain

# $ pip install hachoir-{core,parser,metadata}
from hachoir_core.cmd_line import unicodeFilename
from hachoir_metadata import extractMetadata
from hachoir_parser import createParser

file_metadata = extractMetadata(createParser(unicodeFilename(sys.argv[1])))
it = chain([file_metadata], file_metadata.iterGroups())
print("%sx%s" % next((metadata.get('width'), metadata.get('height'))
                     for metadata in it
                     if metadata.has('width') and metadata.get('height')))

辞書に変換するmetadataには(非再帰的に、つまり、必要に応じてグループを手動で反復します):

def metadata_as_dict(metadata):
    return {item.key: (len(item.values) > 1 and 
                       [v.value for v in item.values] or
                       item.values[0].value)
            for item in metadata if item.values}
于 2014-10-13T22:51:27.270 に答える