MPMediaItem原始歌曲数据

时间:2009-11-01 01:41:38

标签: iphone iphone-sdk-3.0 mpmediapickercontroller mpmediaitem

我想知道如何访问MPMediaItem的原始数据。

有什么想法吗?

3 个答案:

答案 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}}
  • 获取所有数据
  • PROFIT!

以下是我的一个项目的一些示例代码(这不是我的代码宝石,在我编码的黑暗时代写了一段时间):

-copyNextSampleBuffer

答案 2 :(得分:-3)

你不能,也没有解决方法。 MPMediaItem不是实际的媒体,它只是通过RPC从另一个进程传递给应用程序的媒体项的元数据。您的地址空间无法访问该项目本身的数据。

我应该注意,即使你有MPMediaItem,它的数据也可能没有加载到设备内存中。 iPhone上的闪光灯很慢而且内存很少。虽然Apple可能不希望您访问支持MPMediaItem的原始数据,但他们也不愿意处理它,因为他们不想投入处理API所需的时间。如果他们确实提供了访问这样的东西,它几乎肯定不会像NSData那样,但更有可能作为NSURL,他们会给你的应用程序允许它打开文件并流式传输数据。

无论如何,如果你想要这个功能,你应该file一个错误报告要求。

此外,作为旁注,请勿在发送给Apple的错误报告中提及您的年龄。我觉得你正在为手机编写应用程序非常酷,当我年纪的时候,我喜欢尝试使用计算机(当时我正在研究用Lisp编写的东西)。问题是你不能在法律上同意在美国的合同,这就是为什么开发商协议明确禁止你加入。从agreement的第一段开始:

  

您还证明您属于   法定成年年龄   您居住的司法管辖区(at   许多人中至少18岁   国家),你代表你   在法律上允许成为一个   注册的iPhone开发人员。

如果您向WWDR代表提及您未达到成年年龄,他们可能会发现您违反了协议并有义务终止您的开发者帐户。只是一个友好的警告。