gpt4 book ai didi

ios - 无法通过 iOS 中的 AVPlayer 播放文档目录中的音乐?

转载 作者:可可西里 更新时间:2023-11-01 03:56:46 27 4
gpt4 key购买 nike

我正在使用 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 然后我遇到这个问题?

最佳答案

来自 Apple article

As with assets and items, initializing the player does not mean it’s ready for playback. You should observe the player’s status property, which changes to AVPlayerStatusReadyToPlay when it is ready to play. You can also observe the currentItem property to access the player item created for the stream.

将观察者添加到您的播放器

- (void)musicPlay:(UIGestureRecognizer *)recognizer {
// your player code
[player addObserver:self forKeyPath:@"status" options:0 context:nil];
}

// Observe for the player status
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {


if (object == _player && [keyPath isEqualToString:@"status"]) {
if (_player.status == AVPlayerStatusFailed) {
NSLog(@"AVPlayer Failed");

} else if (_player.status == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayerStatusReadyToPlay");
[_player play];


} else if (_player.status == AVPlayerItemStatusUnknown) {
NSLog(@"AVPlayer Unknown");

}
}
}

关于ios - 无法通过 iOS 中的 AVPlayer 播放文档目录中的音乐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32577976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com