Ios 从设备本地文档url到AVAudioPlayer播放的歌曲不一致
我正在开发音乐应用程序,其中我需要将转换后的歌曲存储到“文档目录”以供以后使用。由于某些原因,它不是从存储目录url播放的,但我也没有得到任何错误。我检查了一下目录,发现里面有同一首储存的歌曲 以前的目录中成功播放了同一首歌曲的url 我的代码存储从mp3到m4a转换后的歌曲Ios 从设备本地文档url到AVAudioPlayer播放的歌曲不一致,ios,objective-c,avaudioplayer,nsfilemanager,avassetexportsession,Ios,Objective C,Avaudioplayer,Nsfilemanager,Avassetexportsession,我正在开发音乐应用程序,其中我需要将转换后的歌曲存储到“文档目录”以供以后使用。由于某些原因,它不是从存储目录url播放的,但我也没有得到任何错误。我检查了一下目录,发现里面有同一首储存的歌曲 以前的目录中成功播放了同一首歌曲的url 我的代码存储从mp3到m4a转换后的歌曲 { NSURL *assetURL = [NSURL URLWithString:_assertURL]; AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:a
{
NSURL *assetURL = [NSURL URLWithString:_assertURL];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
/* approach 1: export just the song itself
*/
AVAssetExportSession *exporter = [[AVAssetExportSession alloc]
initWithAsset: songAsset
presetName: AVAssetExportPresetAppleM4A];
NSLog (@"created exporter. supportedFileTypes: %@", exporter.supportedFileTypes);
exporter.outputFileType = @"com.apple.m4a-audio";
NSString *exportFile = [myDocumentsM4aDirectory() stringByAppendingPathComponent: [NSString stringWithFormat:@"%@.m4a",_title]];
// end of approach 1
// set up export (hang on to exportURL so convert to PCM can find it)
[self myDeleteFile:exportFile];
//[exportURL release];
_exportURL = [NSURL fileURLWithPath:exportFile];
exporter.outputURL = _exportURL;
// do the export
[exporter exportAsynchronouslyWithCompletionHandler:^{
int exportStatus = exporter.status;
switch (exportStatus) {
case AVAssetExportSessionStatusFailed: {
// log error to view
NSError *exportError = exporter.error;
NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
break;
}
case AVAssetExportSessionStatusCompleted: {
NSLog (@"AVAssetExportSessionStatusCompleted");
//Final document url
NSURL *audioUrl = _exportURL;
NSLog(@"Audio Url=%@",audioUrl);
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)myDeleteFile:(NSString*)path{
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
NSError *deleteErr = nil;
[[NSFileManager defaultManager] removeItemAtPath:path error:&deleteErr];
if (deleteErr) {
NSLog (@"Can't delete %@: %@", path, deleteErr);
}
}
}
这是用于创建目录的代码:
NSString* myDocumentsM4aDirectory(){
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSError *error = nil;
NSString *dataPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"/m4aFolder"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
[[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error];
//Create folde
return dataPath;
}
如何解决此问题以永久播放本地存储的歌曲
编辑:
//以下函数用于调用以播放歌曲
- (void)playSong
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:_exportURL] options:nil];
NSError *error = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:asset.URL error:&error];
if(error == nil)
{
[player play]
}else
{
NSLog (@"Error during playing: %@", error);
}
}
谢谢
答复:
我找到了不从文档播放歌曲的解决方案,原因是我以前将整个断言URL存储到核心数据。文件“xxxxxx-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX”的ID将在每次发布时不断更改
因此,我将根据之前附加到URL的标题和扩展名获取断言路径。现在它可以正常工作了
这有助于解决这个问题:
注:
在.h文件中定义“mp3player”
注:
定义“mp3player”在.h文件中。能否提供从文档词典播放的代码请查找用于播放导出歌曲的已编辑代码段。能否提供从文档词典播放的代码请查找用于播放导出歌曲的已编辑代码段。仍然出现错误:NSOSStatusErrorDomain code=2003334207”(null)“在按照代码更改后,我仍然收到错误:NSOSStatusErrorDomain Code=2003334207”(null)“在按照代码更改后
You can play song directly from document directory
url = [NSURL fileURLWithPath:strFilePath];
NSError *error;
if(mp3player)
{
mp3player = nil;
}
mp3player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
mp3player.delegate = self;
[mp3player setVolume:1.0];
mp3player.numberOfLoops = 0;
[mp3player prepareToPlay];
[mp3player play];