2

我正在尝试使用 AVMutableMetadataItem 更新文件的轨道号。除了 AVMetadataFormatiTunesMetadata 之外,我已经取得了一些成功。我似乎无法弄清楚我需要设置什么值才能使其正常工作。我试图创建一个 NSArray 的存档,如下所示

[NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:
    [NSNumber numberWithUnsignedInt:13],
    [NSNumber numberWithUnsignedInt:32],
    nil]];

但我最终得到的 track 和 trackOf 数字很遥远。我到底应该传递什么作为 AVMutableMetadataItem 的值,键为 AVMetadataiTunesMetadataKeyTrackNumber?

4

2 回答 2

4

我花了很长时间才弄清楚这一点。感谢 Apple 的 Core Audio 文档,它完全没有说明如何处理它。或与此相关的任何其他键。在我理解之前,我必须检查一个带有曲目信息的 MP4 文件。

回答

您需要为它分配一个包含轨道信息的 NSData。

数据必须由四个 16 位大端值组成,而第二个是轨道号,第三个是集合中的总轨道。第一和第四应该是零。

所以基本上你需要这样做

int16_t trackNumber = 1; // track number
int16_t tracksInCollection = 12; // total number of tracks in collection
int16_t data[4] = { 0, trackNumber, tracksInCollection, 0 };

metadataItem.keySpace = AVMetadataKeySpaceiTunes;
metadataItem.key = AVMetadataiTunesMetadataKeyTrackNumber;
metadataItem.value = [NSData dataWithBytes:data length:sizeof(data)];

注意:同样的方法适用于AVMetadataiTunesMetadataKeyDiscNumber键。

关于字节序的注释

如果您不想担心字节顺序,可以从 Berkeley 套接字 API“借用”一个方法。或者它可能是一个宏。无论如何,它是这样工作的:

bigendianval = htons(val);

或者

int16_t trackNumber = htons(myTrackNumberVariable);

htons ( Host to network short ) 会将您的 16 位数字转换为大端 - 无论您自己系统的字节序如何。IP 网络也是大端的,因此 htons 在这里是可重用的。

于 2013-02-07T13:29:14.520 回答
0

同样,对于磁盘号:

AVMutableMetadataItem *metaItem = [AVMutableMetadataItem metadataItem];
metaItem.key=@1684632427;

int16_t diskNumber = htons([dict[@"discNumber"]intValue]);
int16_t disksInCollection = htons([dict[@"discCount"]intValue]);
int16_t data[3] = {0, diskNumber, disksInCollection};
metaItem.value=[NSData dataWithBytes:data length:sizeof(data)];
metaItem.keySpace=AVMetadataKeySpaceiTunes;
于 2016-06-11T17:30:57.217 回答