使用Python3和Mutagen处理iTunes MP4标签/元数据

3
我将使用Python的Mutagen模块为iTunes准备视频文件的MP4标签。它运行良好,但我缺少一个非常重要的标签,它称为“stik”,代表iTunes媒体类型。
这是我的当前代码:
mp4_video_tags = MP4(mp4_file)

mp4_video_tags['\xa9nam'] = 'Video Name'
mp4_video_tags['\xa9alb'] = 'DVD-Name'
mp4_video_tags['\xa9gen'] = 'Video-Training'
mp4_video_tags['\xa9day'] = '2015'
mp4_video_tags['\xa9ART'] = 'Company'
mp4_video_tags['aART'] = 'Company'
mp4_video_tags['\xa9wrt'] = 'Company'
mp4_video_tags['cprt'] = 'Copyright (c) Company'
mp4_video_tags['desc'] = 'description'
mp4_video_tags['tvsh'] = 'DVD-Name'
mp4_video_tags['trkn'] = [(1, 18)]
mp4_video_tags['disk'] = [(1, 1)]
mp4_video_tags['stik'] = 10

mp4_video_tags.save()

那段代码运行得非常好,但在“mp4_video_tags['stik'] = 10”处崩溃,因为此标签的值不能是整数。但根据这个列表:https://code.google.com/p/mp4v2/wiki/iTunesMetadata#Media_Type_%28stik%29,对于电视节目,它必须是一个值为10的整数。
我注意到Mutagen在其标签列表/文档中不显示“stik”标签,也许默认情况下不支持它:https://mutagen.readthedocs.org/en/latest/api/mp4.html 有人能解释一下如何使用Mutagen将MP4标签“stik”设置为10用于电视节目吗?
3个回答

5

我知道我来晚了一点,但我有一个礼物:


mp4_tags['stik'] = str(unichr(10))

我没有尝试过,但我认为您也可以使用 mp4_tags ['stik'] ='\ n',因为空格字符由二进制数10表示。

问题在于iTunes将该字段读取为二进制数,您可以将更多或更少的任何内容保存到其中。例如,我尝试设置 mp4_tags ['tvsn'] ='2'并将文件加载到iTunes中,它被显示为第50季,如果您查看ASCII表,则2字符的表示方式如此。

看起来是库中的一个错误。


谢谢,我可以确认你的解决方案完美地运行。 - Pascal Bajorat

1

我一直在使用Python3玩得很开心,但建议的答案似乎不起作用。然而,以下代码可以:

mp4_tags["stik"] = [10]

我在设置后使用exiftool进行了检查,它似乎读取了预期类型的媒体类型元数据。


0

如果它不能是整数,你尝试过用引号括起来的'10'吗?

如果那样不行,值得注意的是Python的整数对象绝对疯狂,永远不会翻转...它不是你平常见到的8位整数。

你可以使用ctypes将其转换为8位整数,如下所示 在Python中将字符串转换为8位有符号整数

from ctypes import cast, pointer, POINTER, c_char, c_int
def convert(c):
    return cast(pointer(c_char(c)), POINTER(c_int)).contents.value

我已经按照你的建议尝试了,但是它仍然抛出相同的错误:Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/mutagen/mp4/init.py", line 359, in save values.append(render_func(self, key, value)) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/mutagen/mp4/init.py", line 725, in __render_text for v in value: TypeError: 'int' object is not iterable - Pascal Bajorat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接