2013-06-19 7 views
6

私は以下のコードを試してみました。iOS 6の問題NSDataにMPMediaItemを変換する

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

このコードは、iOS 5で細かい作業が、今のiOS 6

AVAssetExportPresetPassthroughでiOS6のためのすべての変更を進めています。 ???

+1

を使用する理由は役に立つかもしれませんわからない、このリンクを見て試してみてくださいhttp://www.subfurther.com/blog/2010/07/19/from-iphone-media-library-to-pcm-samples-in-dozens-of-confounding-pentially-lossy-steps/ – Leena

+0

@Leenaありがとうy私たちのリンクはこれを解決するのに役立ちます。 – Hitarth

答えて

16

私は以下のiOS 6.Seeためのソリューションは、詳細情報を参照してくださいthis linkコード

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

を修正発見しました。

+0

素晴らしい作品!どうもありがとう! – digipeople

+0

うまく動作します、ありがとうたくさん –

+0

IOS 10のコードはありますか? – Mehul

0

@Hitarth

からSWIFT 3バージョン
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

素早くコードを追加するために@ジェロームに感謝.. – Hitarth

0

はこのSwift4で書かれた1と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) 
    }) 
} 
関連する問題