음악 응용 프로그램을 개발 중입니다. 나중에 사용하기 위해 변환 된 노래를 "문서 디렉토리"에 저장해야합니다. 어떤 이유로 든 저장된 디렉토리 URL에서 재생되지 않지만 나는 어떤 오류도 발생하지 않습니다. 나는 디렉토리 내부를 확인하고 그 안에 저장된 저장된 노래를 발견했습니다.노래가 장치 로컬 문서 url에서 AVAudioPlayer로 일관되게 재생되지 않음
동일한 노래 URL이 이전에 디렉토리에서 성공적으로 재생되었습니다.
mp3에서 m4a로 변환 한 후 노래를 저장하는 코드입니다. 현재 경로 내부
{
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);
}
}
}
이 M4A 디렉토리를 작성하는 데 사용되는 코드입니다
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-xxxxxxx-xxxxxxx-xxxxxxxxx"의 ID는 매번 실행될 때마다 계속 변경됩니다.
그래서 URL에 추가 된 제목과 확장명을 기반으로 어설 션 경로를 가져옵니다. 이제는 잘 작동합니다. 이 대답
이 문제를 해결하는 데 도움이 : Play local audio file with AVAudioPlayer
문서 사전 –
에서 재생중인 코드를 제공 할 수 있습니까? 내 보낸 노래를 재생하기위한 편집 코드 스 니펫을 찾아보십시오. –