2011-04-07 2 views
0


나는 비트 조각처럼하고 싶다.AudioQueueBuffer에서 AudioQueueLevelMeterState가 발생하는 위치는 어디입니까?

주기적으로 AudioQueueLevelMeterState를 가져올 타이머를 설정할 수 있습니다.

그러나 AudioQueueLevelMeterState가 AudioQueueBuffer의 내용과 쿼리되는 시간을 관련시키는 방법이없는 것 같습니까?

예를 들어, 내 버퍼가 1 초라고 가정 해 봅시다. 초당 60 번 미터 상태를 쿼리하는 타이머를 실행합니다. 0.5 초가되면 원하는 레벨을 얻습니다. 결과적으로, 나는 레벨을 얻는 시점, 즉 나머지 0.5 초에서 그 오디오 버퍼의 덩어리를 가져 가고 싶다.

아이디어가 있으십니까? 말하자면 버퍼에서 모든 것을 할 수있는 방법은 무엇입니까?

많은 조언을 주시면 감사하겠습니다.

많은 감사, xj

답변

1

결국 알 수 있습니다. Audio를 녹음하는 방법으로 AudioQueue를 버리고 대신 AudioUnit을 사용했습니다. AudioQueue는 너무 어려워 결국 내가하고 싶은 일에 사용할 올바른 API인지 여부를 심각하게 질문해야했습니다. 일부 포럼에서 사람들은 AudioUnits가 작동하기가 어렵다고 말했지만, AudioQueue를 통해 모든 것을 끝내고 솔직히 말하면 AudioUnit은 매우 직설적이었습니다.

어쨌든, 내 자신의 질문에 대답하십시오. 결국 미터링 및 레코딩과의 동기화 문제를 해결해야했기 때문에 타이머 메커니즘을 사용하여 샘플링을 수행했습니다. 나는 여전히 AudioQueue를 사용하지만 측정을 위해서만 사용합니다. 녹음 콜백에서는 AudioQueue에서 kAudioQueueProperty_CurrentLevelMeter을 가져옵니다. 녹음 콜백은 프레임 수를 수신하므로 프레임 위치를 미터 샘플과 완벽하게 동기화 할 수 있습니다.

0

체크 아웃 사과 예제 프로젝트를 참조하십시오. 그들은 당신이 해킹 할 수있는 비슷한 설정을 가지고 있습니다.