2012-01-27 2 views
2

numberOfLoops 속성을 -1로 설정하여 AVAudioPlayer에서 반복되는 사운드를 재생 중입니다. 그리고 프로그래밍 루프 속도를 제어하려면, 그래서 이렇게 내 오디오 데이터를로드 해요 :AVAudioPlayer가 데이터 끝나기 전에 반복되지 않도록하려면 어떻게해야합니까?

int loopDuration = .5; // seconds 
int desiredDataLength = loopDuration * 2 * 44100; // this assumes 16-bit mono data 
[soundData setLength:desiredDataLength]; 
NSLog(@"data: %@", soundData); // this shows the data after our length change 
AVAudioPlayer soundPlayer = [[AVAudioPlayer alloc] initWithData:soundData error:NULL]; 
soundPlayer.numberOfLoops = -1; 
[soundPlayer play]; 

이 경우 완벽하게 작동합니다 : 오디오 플레이어를 초기화하기 전에 길이를 변경 한 후

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Click" ofType:@"aif"]; 
NSMutableData *soundData = [NSMutableData dataWithContentsOfFile:soundFilePath]; 

을 그리고 loop.Duration을 원래 파일의 지속 시간보다 작게 설정합니다. 추가 데이터가 잘리고 루프가 원하는 속도로 재생됩니다. 그러나 원래 파일보다 더 긴 loopDuration을 설정하면 루프가 너무 빨리 재생됩니다. 각 반복은 원본 파일의 지속 시간만큼 지속됩니다.

NSLog 줄에서 soundData가 올바른 길이로 패딩되었는지 확인할 수 있습니다.

NSData *filler = [@"1234" dataUsingEncoding:NSASCIIStringEncoding]; 
while (desiredDataLength > [soundData length]) { 
    [soundData appendData:filler]; 
} 

그러나 루프 : 나는 어쩌면 AVAudioPlayer, 나는 어떤 값을 패딩 시도 데이터에 후행 공의를 무시하고 모든 공의의를봤을 때 루프를 다시 시작, 그래서 대신에 단순히 데이터 길이를 설정 한 생각 원본 파일 데이터가 중지되는 지점에서 계속 다시 시작됩니다. 전성 검사로서, 나는 사운드 데이터 ...

[soundData appendData:soundData]; 

을 두 배로 시도 ... 그리고 데이터를 4 numberOfLoops을 설정하고 재생합니다. 소리가 8 번 들리 겠지만 4 번만 들었다고 들었습니다! 그러나 soundData를 로그하면 길이가 두 배로 늘어난 것을 볼 수 있습니다.

루핑 메커니즘에 내장 된 인텔리전스가 마치 데이터가 끝날 때가 아니라 루프를 다시 시작하게 만드는 것처럼 보입니다. 아무도 실제로 일어나고있는 일에 대해 통찰력을 갖고 있으며, 원하는 결과를 얻기 위해 어떻게 해결할 수 있습니까?

업데이트 : 원래의 사운드 파일을 오디오 편집기에서 열고 끝까지 조용히 넣으면 가장 느린 루프 속도에 충분히 오래 사용할 수 있도록 AVAudioPlayer가 원하는대로 처리합니다. 그러나 NSLog 출력을 볼 때이 데이터도 모두 0으로 끝나는 것을 볼 수 있습니다. 왜 AVAudioPlayer는 오디오 편집기에서 추가 한 묵음을 존중하지만 프로그래밍 방식으로 데이터를 패딩하여 추가 한 묵음을 존중하지 않습니까?

답변

0

사운드 데이터는 단순한 데이터가 아닙니다. 내용의 길이를 정의하는 헤더도 포함되어있는 AIF 파일입니다. AVAudioPlayer는 버퍼 길이가 아닌 헤더를 분명히보고 있습니다.

+0

그것은 내가 본 행동을 이해하고 일치시킵니다. 여기 AIFF 헤더에 대한 설명이 있습니다 : http://www-mmsp.ece.mcgill.ca/documents/audioformats/aiff/Docs/AIFF-C.9.26.91.pdf. 데이터 자체를 조작 할 때 크기 값을 조작하는 방법을 알아야합니다. 그 사이에 나는 이것이 일어나고 있다고 가정 할 것이다. – arlomedia

관련 문제