0

음악 응용 프로그램을 개발 중입니다. 나중에 사용하기 위해 변환 된 노래를 "문서 디렉토리"에 저장해야합니다. 어떤 이유로 든 저장된 디렉토리 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

+0

문서 사전 –

+0

에서 재생중인 코드를 제공 할 수 있습니까? 내 보낸 노래를 재생하기위한 편집 코드 스 니펫을 찾아보십시오. –

답변

0
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]; 

참고 :

가 .H 파일에 "mp3player"를 정의합니다.

+0

여전히 오류가 발생합니다. NSOSStatusErrorDomain Code = 2003334207 "(null)"코드별로 변경 한 후 –

관련 문제