iOS 6 issue Convert MPMediaItem to NSData

后端 未结 3 1278
星月不相逢
星月不相逢 2021-02-04 17:42

i had tried the below code.

   -(void)mediaItemToData : (MPMediaItem * ) curItem
{
    NSURL *url = [curItem valueForProperty: MPMediaItemPropertyAssetURL];

            


        
相关标签:
3条回答
  • 2021-02-04 18:07

    SWIFT 3 Version from @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
    }
    
    0 讨论(0)
  • 2021-02-04 18:15

    i have found the solution for iOS 6.See below modify code

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

    See this link for more info.

    0 讨论(0)
  • 2021-02-04 18:22

    Try this one written in Swift4 and reason of using 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)
        })
    }
    
    0 讨论(0)
提交回复
热议问题