objective-c - 如何为 AVMetadataFormatiTunesMetadata 创建 AVMutableMetadataItem

标签 objective-c cocoa avfoundation avmetadataitem

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

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

但我最终得到的 track 和 trackOf 数字相差甚远。我到底应该传入什么作为键为 AVMetadataiTunesMetadataKeyTrackNumber 的 AVMutableMetadataItem 的值?

最佳答案

我花了很长时间才弄清楚这一点。感谢苹果的核心音频文档,其中完全没有说明如何处理它。或者任何其他与此相关的键。在我理解之前,我必须检查包含轨道信息的 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(主机到网络短)会将您的 16 位数字转换为大字节序 - 无论您自己系统的字节序如何。 IP 网络也是大尾数法,因此 htons 在这里可以重用。

关于objective-c - 如何为 AVMetadataFormatiTunesMetadata 创建 AVMutableMetadataItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14717833/

相关文章:

cocoa - 为什么 AVPlayerItem 不支持 AVAudioTimePitchAlgorithmVarispeed 设置?

ios - 获取 NSMutableArray 的平均值

ios - UITableViewCell accessoryType UITableViewCellAccessoryCheckmark 重复

ios - 管理一堆具有依赖关系的 NSOperation

macos - 在 Cocoa 中以编程方式添加收藏夹的快捷方式

cocoa - 如何保持MVC!! :)

cocoa - 2014 年,有哪些 AppKit 组件用于构建现代 Mac 基于文档的应用程序?

mysql - 是在 xCode 中编写应用程序还是在 PHP/mySQL 中使其成为 webApp

ios - 在 installTapOnBus () 方法中我不能做什么?

video - 我可以测试 IOS4 AVPlayer seekToTime 何时完成吗?