【发布时间】:2015-09-15 04:53:22
【问题描述】:
我正在使用 MediaPickerController 选择音乐文件。从选择器中选择音乐文件后,我将文件保存到文档目录。
以下是选择并保存到文档目录的代码
//code to click on music button
- (IBAction)addMusic:(id)sender
{
MPMediaPickerController *soundPicker=[[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
soundPicker.delegate=self;
soundPicker.allowsPickingMultipleItems=NO;
[self presentViewController:soundPicker animated:YES completion:nil];
}
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
NSLog(@"music files delegate called");
MPMediaItem *item = [[mediaItemCollection items] objectAtIndex:0];
[self uploadMusicFile:item];
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void) uploadMusicFile:(MPMediaItem *)song
{
NSURL *url = [song 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:@"%@.mp4",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");
//music data is NSdata
music_data = [NSData dataWithContentsOfFile: [myDocumentsDirectory
stringByAppendingPathComponent:fileName]];
// NSLog(@"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;
}
}
}];
}
从文档目录播放音乐文件的代码
- (void)musicPlay:(UIGestureRecognizer *)recognizer
{
if(!isMusicPlaying)
{
if([musicFile isEqualToString:@"none"])
{
NSLog(@"INSIDE IF");
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"No music exist" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
}
else
{
NSURL *fileURL;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
bc.music_upload=[bc.music_upload lastPathComponent];
NSLog(@"music uplaod is %@",bc.music_upload);
NSString* path = [documentsDirectory stringByAppendingPathComponent:bc.music_upload];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
if(fileExists)
{
NSLog(@"file already exist");
fileURL = [NSURL fileURLWithPath:path];
NSLog(@"file url is %@",fileURL);
}
else
{
NSLog(@"file already not exist");
if(![musicFile containsString:@"http://"])
{
musicFile=[IMAGE_BASE_URL stringByAppendingString:musicFile];
}
fileURL = [NSURL URLWithString:[IMAGE_BASE_URL stringByAppendingString:musicFile]];
}
NSLog(@"file url is %@",fileURL);
isMusicPlaying=true;
[self.img_music setImage:[UIImage imageNamed:@"play_stop.png"]];
playerItem = [AVPlayerItem playerItemWithURL:fileURL];
player = [AVPlayer playerWithPlayerItem:playerItem];
//player = [AVPlayer playerWithURL:path];
[player play];
}
}
else
{
isMusicPlaying=false;
[player pause];
[self.img_music setImage:[UIImage imageNamed:@"music-icon.png"]];
}
}
我可以保存文件,当我检查文件目录中是否存在文件时,我可以找到该文件。但我无法播放该文件。我不明白问题出在哪里。是音乐文件或我的音乐播放器代码有问题? ' 编辑: 我已尝试过此代码,但它使应用程序挂起且无响应。
NSURL *url = [NSURL URLWithString:@"http://sound18.mp3pk.com/pop_remix/ebodf11/ebodf11-15(www.songs.pk).mp3"];
NSData *data = [NSData dataWithContentsOfURL:url];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:nil];
[audioPlayer play];
编辑:
我认为问题在于将 MPMediaItem 转换为 NSdata。因为当我将 MPMediaItem 转换为 NSData 然后我可以将它发送到服务器并在浏览器上播放。但是我尝试使用 AVPlayer 玩然后我遇到了这个问题?
【问题讨论】:
标签: ios objective-c iphone avplayer