问题
i had tried the below code.
-(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);
}];
}
this code is working fine in iOS 5 but now working in iOS 6.
Any changes for iOS6 in AVAssetExportPresetPassthrough
. ???
回答1:
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.
回答2:
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
}
回答3:
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)
})
}
来源:https://stackoverflow.com/questions/17192716/ios-6-issue-convert-mpmediaitem-to-nsdata