我花了很长时间才弄清楚这一点。感谢 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 在这里是可重用的。