2013-07-08 4 views
9

을 재생할 수 .M4A 파일을 생성하지 않는 다른 iOS 장비에 (안전/암호화). AVAudioRecorder를 사용하여 오디오 파일을 녹음하고 AVAudioPlayer를 사용하여 수신 된 모든 오디오 파일을 재생합니다. AVAudioRecorder 열고 나는 오디오 파일을 보낼 수있는 iOS 앱을 수정하려고

는 지금 만들고 안드로이드와 호환되는 파일을 보낼 수있는 앱을 수정하려합니다. 하지만 안드로이드 기기, iOS 기기에서이 만든

[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; 
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitRateKey]; 
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; 
[settings setValue:[NSNumber numberWithFloat:48000.0] forKey:AVSampleRateKey]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *dirPath = [paths objectAtIndex:0]; 

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"yyyy-MM-dd HH-mm"]; 

NSString *filename = [NSString stringWithFormat:@"%@.aac", [format stringFromDate:NSDate.date]]; 

파일은 Mac에서 재생할 수 있습니다 : 나는이에 대한 기존의 AVAudioRecorder 코드를 수정했습니다. 파일 확장자가 ".m4a"로 끝나도록 수동으로 변경된 경우 파일이 Android에서 재생됩니다.

(이하 "는 .aac"형식의 장점은 응용 프로그램의 이전 버전이 파일을 수신하고 재생할 수 있다는 것입니다 - 나는 이전 버전과의 호환성을 유지했습니다.)

그래서 나는이 변화를 만들어 :

NSString *filename = [NSString stringWithFormat:@"%@.m4a", [format stringFromDate:NSDate.date]]; 

그러나 결과 파일 (AVAudioRecorder에서 오류없이 생성됨)은 Mac이나 iOS 장치에서 재생할 수 없습니다. Android에서 작동하는지 여부를 기다리고 있습니다.

AVAudioPlayer 해당 파일을 열려고 할 때, 그것은 출력 :

오류 도메인 = NSOSStatusErrorDomain 코드 = 1685348671 ". 작업 을 완료 할 수 없습니다 (OSStatus 오류 1685348671.)"코드 1685348671 -> "dta?": 파일 형식이 잘못되었거나 형식이 잘못된 오디오 파일의 인스턴스가 아니거나 오디오 파일로 인식되지 않습니다.

파일 이름을 ".aac"로 다시 변경해도 Mac 또는 iOS에서 아무것도로드 할 수 없다는 사실은 변경되지 않습니다.

지금은 ".aac"파일을 만든 다음 Android 끝에서 ".aac"을 ".m4a"로 바꾸고 재생하려고하는 것이 가장 좋은 해결책 인 것 같습니다.

질문 1 : 파일 이름 확장자 AVAudioPLayer이 실패 할 수 있습니다를 변경하는 사람이 왜 알고 있나요? BTW, 내가 위에서 만든 ".M4A"파일, 나는 그래서이 문제는 파일 형식 또는이 파일 형식을 읽을 수있는 iOS 또는 맥의 무능력인지 말할 수 없다 Mac에서이 아무것도 열 수 없습니다 .

https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2013-24.m4a https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2010-11.aac

질문 2 :

궁금 누군가를 위해, 여기에 "는 .aac"의 사본 및 AVAudioRecorder에서 ".M4A"파일을 넣어 나는 하나 AVAudioRecorder를 설정하는 동안 결과 파일은 스테레오입니다. 왜? 무손실 인코딩 AAC-LC를 지정하는 어쨌든 거기 :

질문 3 (적어도 그 VLC 메타 데이터에 대한 말씀입니다)? 또는 AVAudioRecorder에서 낮은 수준의 API로 이동하는 경우에만 그렇게 할 수 있습니까?

+1

이 정보는 도움이됩니다. http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format –

+0

해당 질문에 대한 대답은 완전히 잘못되었습니다. 파일은 실제 AAC 파일이 아닙니다. 그냥 m4a에 싸여 있습니다. 다른 대답 중 하나가 정확합니다. 또한 더 도움이 답변 : http://stackoverflow.com/a/12698691/86020 – mahboudz

답변

8

1 질문에 대한 답변은, 올바르게 오디오 세션을 설정해야한다는 그렇지 않으면 M4A 파일이 올바르게 포맷되지 않습니다이다.지금 내가 녹음을 시작하기 직전에 설정 오디오 세션 코드는 다음과 같습니다 오디오 파일을 재생할 수 있도록 녹화가 끝난 후

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryRecord error:nil]; 
[session setActive:YES error:nil]; 

내가 재생을 위해 다시 세션을 설정합니다.

질문 2는 잘못된 채널 수를 표시하는 VLC의 문제입니다. MacOS Finder의 정보 입수 창에있는 오디오 파일은 단일 채널로 표시됩니다.

질문 3 답변되지 않았습니다.

+0

mahboubz 포인트 1 위대한 호출 내 문제를 완전히 해결! –

3

녹음 오디오는 안드로이드뿐 아니라 아이폰 OS에서 재생 ".M4A"파일에, 내가 다음 코드를 사용하십시오 만들고 :

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; 

[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 


AudioRecorder = [[AVAudioRecorder alloc] initWithURL:fileOutPutUrl settings:recordSetting error:nil]; 
[AudioRecorder setDelegate:self]; 
[AudioRecorder recordForDuration:RecordLimitTime]; // Record Limit if require 
if ([AudioRecorder prepareToRecord]) { 
    [AudioRecorder record]; 
} 

안드로이드 측면에서, 나는를 변경할 필요가 없습니다 앤드 로이드에서 .mp3 파일 만 재생하려면 "fileName.m4a"에서 "fileName.mp3"로 확장명을 변경하면됩니다. 놀랍게도 작동합니다. iOS 파일 = "fileName.m4a"는 부드럽게 재생됩니다.

관련 문제