如何为AVMetadataFormatiTunesMetadata创建AVMutableMetadataItem

时间:2013-02-05 22:02:26

标签: objective-c cocoa avfoundation avmetadataitem

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

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

但我最终得到了一个跟踪和追踪的数字。我应该准确传递一个带有AVMetadataiTunesMetadataKeyTrackNumber键的AVMutableMetadataItem的值?

2 个答案:

答案 0 :(得分:3)

我花了很长时间才弄明白。感谢Apple的Core Audio文档,该文档完全没有说明如何处理它。或任何其他关键的事情。在我理解之前,我不得不检查带有轨道信息的MP4文件。

答案

您需要为其分配包含曲目信息的NSData。

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

所以基本上你需要这样做

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(主机到网络短路)会将您的16位数转换为大端 - 无论您自己的系统是什么字节顺序。 IP网络也是big-endian,因此htons可以重复使用。

答案 1 :(得分: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;