2011-05-24 89 views
0

我想一個MPMediaItem轉換爲NSData對象,所以我可以用AVAudioPlayer玩。 以下的答案被張貼在一個類似的問題而回,有步驟如何到:轉換MPMediaItem到NSData的

MPMediaItems raw song data

當然,你可以訪問 MPMediaItem的數據。它在 曾經不是很清楚,但它的工作。具體方法如下:

獲取媒體項目的URL從它的 MPMediaItemPropertyAssetURL財產 初始化一個AVURLAsset這個URL 初始化一個AVAssetReader本 資產抓取AVAssetTrack你想 從AVURLAsset讀創建 AVAssetReaderTrackOutput本 跟蹤該輸出添加到 -startReading獲取與AVAssetReaderTrackOutput的 -copyNextSampleBuffer利潤的所有數據之前,創造了 AVAssetReader!

使用'copyNextSampleBuffer'獲取數據後,我現在有一個CMSampleBufferRef對象。我如何從這裏繼續?

感謝, 吉利

回答

-3

嘗試使用下面的代碼

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

不工作.... – Rajneesh071 2013-04-24 14:43:40

0

試試這個:

-(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; 
      } 
     } 
    }]; 
}