Ich nehme die Musikdatei mit MediaPickerController. Nachdem ich die Musikdatei aus dem Picker auswählen, dann speichere ich die Datei in das Dokumentverzeichnis.Musik kann nicht aus dem Dokumentenverzeichnis über AVPlayer in iOS wiedergegeben werden?
Im Folgenden Code für die Kommissionierung & Sparbuch der Musikdatei aus Dokumentenverzeichnis
//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;
}
}
}];
}
-Code zu dokumentieren
- (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"]];
}
}
Ich bin in der Lage zu spielen, um die Datei zu speichern & wenn Ich überprüfe, ob die Datei im Dokumentenverzeichnis existiert, dann kann ich die Datei finden. Aber ich kann die Datei nicht abspielen. Das habe ich nicht gemacht verstehe, was das Problem ist.Ist ein Problem mit der Musikdatei oder mit meinem Musik-Player-Code? ' EDIT: Ich habe diesen Code versucht, aber es macht App hängen & nicht mehr reagiert.
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];
EDIT:
ich glaube, das Problem mit der Umwandlung des MPMediaItem ist in NSData .Because, wenn ich die MPMediaItem zu NSData konvertieren dann ich in der Lage bin zu sende es server & es wird auf dem browser gespielt. Aber ich versuche mit AVPlayer zu spielen, dann stelle ich dieses Problem?
es ist nicht working.I Datei an den Server am Hochladen von ihr zu NSData konvertieren. – Techiee
hast du schon hier gelesen? http://StackOverflow.com/a/11164542/4069848 – Danilo
Wenn ich das Element auswählen, konvertiere ich es zu nsdata siehe meinen Code. Dann lade ich es auf server.When ich URL der Musik-Datei geben, dann ist es in Ordnung. Aber wenn Ich spiele die gleiche URL in meiner App, aber es spielt nicht. Aber wenn ich irgendeine andere URL in meiner App gebe, dann kann ich Musik spielen.Bitte sagen Sie mir, warum es passiert – Techiee