[英]Hachoir - Retrieving data from a group
嘗試使用Hachoir從視頻文件中檢索元數據。 工作得相當好,除非使用'get'或類似的方法來返回寬度和高度值。
我以為它會是:
metadata.get('width')
但是這會拋出一個錯誤(對象沒有'width'屬性)。
當我運行以下內容時:
for data in sorted(metadata):
if len(data.values ) > 0:
print data.key, data.values[0].value
返回的所有內容都是來自“Common”組的信息。
當我使用:
metadata.exportPlaintext
...返回來自“公共”,“視頻流”和“音頻流”的信息。 我可以簡單地解析生成的“文本”項並去掉高度和寬度值,但我寧願嘗試使用metadata.get('width')或類似方法正確地執行它。
看一下源代碼,我想我可以使用以下代碼:
for key, metadata in metadata.__groups.iteritems():
迭代元數據中的._ 組,但它拋出一個“'AsfMetadata'對象沒有屬性' _groups' - 我肯定不應該這樣,因為我認為'AsfMetadata'是MultipleMetadata的子類()確實有這樣一個變量。
可能缺少一些非常明顯的東西。
對於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
要從媒體文件中具有大小信息的第一個頂級元數據組獲取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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.