2010-02-04 5 views
3

PCM 데이터를 녹음하고 재생하기 위해 Audio Toolbox를 사용하는 프로젝트에서 작업하고 있는데 재생에 문제가 있습니다. 시뮬레이터에서 필자는 오디오를 녹음하고 재생할 수 있습니다. 맞춤 클래스를 사용하여 필요에 따라 녹음 및 재생 버퍼의 PCM 바이트 저장 및 소싱을 처리 할 수 ​​있습니다. 기기에서 (iPhone (3.0.1) 및 iPod 2G (3.1.2)) 녹음은 정상적으로 작동하지만 제작 된 오디오 파일은 정확하지만 인앱 재생은 재생 버퍼의 일부만 재생하는 것처럼 재생됩니다. 내 버퍼는 1 초이며 3 버퍼가 있습니다.이 버퍼는 재생이 시작되기 전에 미리로드됩니다. 말더듬 문제가 발생하지 않는다고 생각하는 처음 3 초 동안에는 말더듬이가 발생합니다.Audio Toolbox 재생은 출력 버퍼의 일부만 재생합니다.

그 일을하기 전에 오디오 도구 상자의 코드를 작성했습니다, 그리고 내가 대신 AudioFileReadBytes의 소스 PCM 데이터()

내가 데이터를 알아 내 자신의 클래스를 사용하고 있습니다 것을 제외하고 내가 여기에 이상한 아무것도 아니에요 그게 내 소스에서 오는 좋은, 왜냐하면 그것은 시뮬레이션에서 바로 재생하고, 올바른 오디오 파일로 디스크에 씁니다.

저는 약간의 샘플 속도로 놀았습니다. 저는 보통 파일 크기를 줄이기 위해 11025Hz 샘플링을 사용하고 있습니다 (모든 음성이므로 괜찮습니다). 44100Hz이지만 버퍼의 크기가 같아도 똑같은 문제가 발생하지만 오디오 세그먼트는 약 4 배 빨라집니다. 그래서 각 버퍼의 일부만 재생하는 것 같습니다.

각 버퍼의 일부만 재생할 것이라고 생각하는 유일한 이유는 레이턴시 문제입니다. 오디오 도구 상자 코드에서 빈 버퍼를 채우는 동안 전체 버퍼가 부족한 것처럼 보입니다. 하지만 그게 미리로드 된 버퍼를 올바르게 재생할 수 있으며, 다음에이 끊기 시작합니다. 그런 일은 일어나지 않습니다. 전체적으로 더듬습니다.

10MB 버퍼와 같이 엄청난 버퍼를 시도했으며, 재생이 끝나면 무음과 오디오를 한 번 더 들려줍니다. 나는 또한 10 초 분량의 오디오처럼 일반적인 것보다 더 많은 버퍼를 미리로드 해 보았습니다. Audio Toolbox 호출이 아닌 AVAudioSession을 사용하여 오디오 세션을 설정하고 있으며 재생을위한 재생 범주로 설정 중입니다.

이 문제를 어떻게 시도하고 공격할지 모릅니다. 시뮬레이터에서는 잘 작동하지만 장치에서는 제대로 작동하지 않습니다.

재생 콜백 코드와 오디오 큐 서비스에 대한 설정은 : 길이 : 문제를 일으키는 http://pastebin.com/mfaa546c

+0

AudioServicesPlaySystemSound를 사용하여 오디오 파일을 재생하면 올바르게 재생됩니까? –

답변

0

이있는 NSData의 GetBytes의 사용이 밝혀졌습니다. 해당 메서드로 채워진 버퍼가 잘못 재생되었습니다. 그러나 해당 버퍼에서 다른 버퍼로 memcpy를 수행하면 문제가 방지됩니다.