编程语言
首页 > 编程语言> > python – Hachoir – 从组中检索数据

python – Hachoir – 从组中检索数据

作者:互联网

尝试使用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():

迭代元数据中的._groups,但它抛出一个“’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

标签:python,metadata,video-processing,hachoir-parser
来源: https://codeday.me/bug/20190613/1230367.html