2013-06-19 26 views
6

Próbowałem kodu poniżej.Wydanie na iOS 6 Konwersja MPMediaItem na NSData

-(void)mediaItemToData : (MPMediaItem *) curItem 
{ 
    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"; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * myDocumentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 

    NSString *exportFile = [myDocumentsDirectory stringByAppendingPathComponent: 
          @"exported.mp4"]; 

    NSURL *exportURL = [NSURL fileURLWithPath:exportFile]; 
    exporter.outputURL = exportURL; 

    // do the export 
    // (completion handler block omitted) 
    [exporter exportAsynchronouslyWithCompletionHandler: 
    ^{ 
     NSData *data = [NSData dataWithContentsOfFile: [myDocumentsDirectory 
                 stringByAppendingPathComponent: @"exported.mp4"]]; 

     DLog(@"Data %@",data); 
    }]; 
} 

ten kod działa poprawnie w iOS 5, ale teraz pracuje w iOS 6.

żadnych zmian dla iOS6 w AVAssetExportPresetPassthrough. ???

+1

rzucić okiem na ten link, nie wiem, może być pomocne http://www.subfurther.com/blog/2010/07/19/from-iphone-media-library-to-pcm-samples-in-dozen-of-confounding-potentially-lossy-epseps/ – Leena

+0

@Leena Dzięki y nasz link jest pomocny w rozwiązaniu tego problemu. – Hitarth

Odpowiedz

16

znalazłem rozwiązanie dla iOS 6.See poniżej zmodyfikować kod

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

Zobacz this link aby uzyskać więcej informacji.

+0

Działa świetnie! Wielkie dzięki! – digipeople

+0

działa dobrze, bardzo dziękuję –

+0

czy masz kod dla IOS 10? – Mehul

0

SWIFT 3 Wersja z @Hitarth

func save(mediaItem: MPMediaItem) -> String? { 
    let url = mediaItem.assetURL! 
    let hex = MD5Hex(string: url.absoluteString) 
    guard didMD5HexExist(string: hex) == false else { 
     return hex 
    } 
    let songAsset = AVURLAsset(url: url) 
    guard let exporter = AVAssetExportSession(asset: songAsset, presetName: AVAssetExportPresetAppleM4A) else { 
     assertionFailure() 
     return nil 
    } 
    exporter.outputFileType = "com.apple.m4a-audio" 

    let fileHexName = hex + ".m4a" 
    let fileURL = latFileManager.getResourceFolderPath().appendingPathComponent(fileHexName) 
    DLog("fileURL: \(fileURL)") 

    exporter.outputURL = fileURL 
    // do the export 
    exporter.exportAsynchronously { 
     let status = exporter.status 
     switch status { 
     case .failed: 
      assertionFailure(exporter.error as! String) 
     case .completed: 
      DLog("AVAssetExportSessionStatusCompleted") 
      self.fileHexArray.append(fileHexName) 
     default: 
      DLog("default") 
      break 
     } 
    } 
    return hex 
} 
+1

Dzięki @jerome, aby dodać szybki kod. – Hitarth

0

Spróbuj jeden napisany w Swift4 i powód korzystania AVAssetExportSession https://stackoverflow.com/a/36694392/5653015

func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) 
{ 
    //get media item first 
    guard let mediaItem = mediaItemCollection.items.first else 
    { 
     NSLog("No item selected.") 
     return 
    } 


    let songUrl = mediaItem.value(forProperty: MPMediaItemPropertyAssetURL) as! URL 
    print(songUrl) 

    // get file extension andmime type 
    let str = songUrl.absoluteString 
    let str2 = str.replacingOccurrences(of : "ipod-library://item/item", with: "") 
    let arr = str2.components(separatedBy: "?") 
    var mimeType = arr[0] 
    mimeType = mimeType.replacingOccurrences(of : ".", with: "") 

    let exportSession = AVAssetExportSession(asset: AVAsset(url: songUrl), presetName: AVAssetExportPresetAppleM4A) 
    exportSession?.shouldOptimizeForNetworkUse = true 
    exportSession?.outputFileType = AVFileType.m4a 

    //save it into your local directory 
    let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
    let outputURL = documentURL.appendingPathComponent(mediaItem.title!) 
    print(outputURL.absoluteString) 
    //Delete Existing file 
    do 
    { 
     try FileManager.default.removeItem(at: outputURL) 
    } 
    catch let error as NSError 
    { 
     print(error.debugDescription) 
    } 

    exportSession?.outputURL = outputURL 
    exportSession?.exportAsynchronously(completionHandler: {() -> Void in 

     if exportSession!.status == AVAssetExportSessionStatus.completed 
     { 
      print("Export Successfull") 
      // self.getAudio() 
     } 
     self.dismiss(animated: true, completion: nil) 
    }) 
}