我正在尝试使用AVMutableMetadataItem更新文件的轨道数。除了AVMetadataFormatiTunesMetadata之外,我一直在取得一些成功。我似乎无法弄清楚我需要设置什么作为使其工作的值。我试图创建一个NSArray存档,如下所示
[NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:
[NSNumber numberWithUnsignedInt:13],
[NSNumber numberWithUnsignedInt:32],
nil]];
但我最终得到了一个跟踪和追踪的数字。我应该准确传递一个带有AVMetadataiTunesMetadataKeyTrackNumber键的AVMutableMetadataItem的值?
答案 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;