正在将MPMediaItem转换为NSData



我正在尝试将MPMediaItem转换为NSData对象,以便可以使用AVAudioPlayer播放它。以下答案发布在不久前的一个类似问题上,并介绍了如何做到这一点的步骤:

MPMediaItems原始歌曲数据

当然,您可以访问MPMediaItem。不是很清楚一次,但有效。方法如下:

从中获取媒体项目的URLMPMediaItemPropertyAssetURL属性使用此URL初始化AVURLA资产使用此初始化AVAssetReaderasset获取所需的AVAssetTrack从AVURLAsset读取创建AVAssetReaderTrackOutputtrack将此输出添加到AVAssetReader创建于和之前-startReading使用AVAssetReaderTrackOutput获取所有数据-copyNextSampleBuffer利润!

在使用"copyNextSampleBuffer"获取数据后,我现在有了一个CMSampleBufferRef对象。我该如何从这里继续?

谢谢,Gili

试试这个:

-(void)mediaItemToData : (MPMediaItem * ) curItem
{
    NSURL *url = [curItem valueForProperty: MPMediaItemPropertyAssetURL];
    AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL: url options:nil];
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: songAsset
                                                                      presetName:AVAssetExportPresetAppleM4A];
    exporter.outputFileType =   @"com.apple.m4a-audio";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * myDocumentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    [[NSDate date] timeIntervalSince1970];
    NSTimeInterval seconds = [[NSDate date] timeIntervalSince1970];
    NSString *intervalSeconds = [NSString stringWithFormat:@"%0.0f",seconds];
    NSString * fileName = [NSString stringWithFormat:@"%@.m4a",intervalSeconds];
    NSString *exportFile = [myDocumentsDirectory stringByAppendingPathComponent:fileName];
    NSURL *exportURL = [NSURL fileURLWithPath:exportFile];
    exporter.outputURL = exportURL;
    // do the export
    // (completion handler block omitted)
    [exporter exportAsynchronouslyWithCompletionHandler:
     ^{
         int exportStatus = exporter.status;
         switch (exportStatus)
         {
             case AVAssetExportSessionStatusFailed:
             {
                 NSError *exportError = exporter.error;
                 NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
                 break;
             }
             case AVAssetExportSessionStatusCompleted:
             {
                 NSLog (@"AVAssetExportSessionStatusCompleted");
                 NSData *data = [NSData dataWithContentsOfFile: [myDocumentsDirectory
                                                                 stringByAppendingPathComponent:fileName]];
                 //DLog(@"Data %@",data);
                 data = nil;
                 break;
             }
             case AVAssetExportSessionStatusUnknown:
             {
                 NSLog (@"AVAssetExportSessionStatusUnknown"); break;
             }
             case AVAssetExportSessionStatusExporting:
             {
                 NSLog (@"AVAssetExportSessionStatusExporting"); break;
             }
             case AVAssetExportSessionStatusCancelled:
             {
                 NSLog (@"AVAssetExportSessionStatusCancelled"); break;
             }
             case AVAssetExportSessionStatusWaiting:
             {
                 NSLog (@"AVAssetExportSessionStatusWaiting"); break;
             }
             default:
             {
                 NSLog (@"didn't get export status"); break;
             }
         }
     }];
}

尝试使用以下代码

 MPMediaItem *item;
 NSData *dataMedia = [NSData dataWithContentsOfURL:[item valueForProperty:MPMediaItemPropertyAssetURL]];

相关内容

  • 没有找到相关文章

最新更新