我想知道如何访问MPMediaItem的原始数据。
有什么想法吗?
答案 0 :(得分:30)
您可以通过以下方式获取媒体项目的数据:
-(void)mediaItemToData
{
// Implement in your project the media item picker
MPMediaItem *curItem = musicPlayer.nowPlayingItem;
NSURL *url = [curItem valueForProperty: MPMediaItemPropertyAssetURL];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL: url options:nil];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: songAsset
presetName: AVAssetExportPresetPassthrough];
exporter.outputFileType = @"public.mpeg-4";
NSString *exportFile = [[self myDocumentsDirectory] stringByAppendingPathComponent:
@"exported.mp4"];
NSURL *exportURL = [[NSURL fileURLWithPath:exportFile] retain];
exporter.outputURL = exportURL;
// do the export
// (completion handler block omitted)
[exporter exportAsynchronouslyWithCompletionHandler:
^{
NSData *data = [NSData dataWithContentsOfFile: [[self myDocumentsDirectory]
stringByAppendingPathComponent: @"exported.mp4"]];
// Do with data something
}];
}
此代码仅适用于ios 4.0及更高版本
祝你好运!答案 1 :(得分:18)
当然,您可以访问MPMediaItem
的数据。它一下子不透明,但它有效。方法如下:
MPMediaItemPropertyAssetURL
属性AVURLAsset
AVAssetReader
AVAssetTrack
AVURLAsset
AVAssetReaderTrackOutput
AVAssetReader
和-startReading
AVAssetReaderTrackOutput
的{{1}} 以下是我的一个项目的一些示例代码(这不是我的代码宝石,在我编码的黑暗时代写了一段时间):
-copyNextSampleBuffer
答案 2 :(得分:-3)
你不能,也没有解决方法。 MPMediaItem不是实际的媒体,它只是通过RPC从另一个进程传递给应用程序的媒体项的元数据。您的地址空间无法访问该项目本身的数据。
我应该注意,即使你有MPMediaItem,它的数据也可能没有加载到设备内存中。 iPhone上的闪光灯很慢而且内存很少。虽然Apple可能不希望您访问支持MPMediaItem的原始数据,但他们也不愿意处理它,因为他们不想投入处理API所需的时间。如果他们确实提供了访问这样的东西,它几乎肯定不会像NSData那样,但更有可能作为NSURL,他们会给你的应用程序允许它打开文件并流式传输数据。
无论如何,如果你想要这个功能,你应该file一个错误报告要求。
此外,作为旁注,请勿在发送给Apple的错误报告中提及您的年龄。我觉得你正在为手机编写应用程序非常酷,当我年纪的时候,我喜欢尝试使用计算机(当时我正在研究用Lisp编写的东西)。问题是你不能在法律上同意在美国的合同,这就是为什么开发商协议明确禁止你加入。从agreement的第一段开始:
您还证明您属于 法定成年年龄 您居住的司法管辖区(at 许多人中至少18岁 国家),你代表你 在法律上允许成为一个 注册的iPhone开发人员。
如果您向WWDR代表提及您未达到成年年龄,他们可能会发现您违反了协议并有义务终止您的开发者帐户。只是一个友好的警告。