2010-03-15 3 views
2

저는 내장 마이크에서 오디오를 녹음 한 다음 처리 할 오디오 데이터를 서버로 보내야하는 iPhone 응용 프로그램을 작성하고 있습니다.NSOutputStream을 사용하여 iPhone에 오디오 녹음 및 네트워크를 통해 보내기

응용 프로그램은 소켓 연결을 사용하여 서버에 연결하고 오디오 대기열 서비스를 사용하여 녹음을 수행합니다. 내가 실제로 확신 할 수없는 것은 실제로 데이터를 보낼 때입니다. 오디오 대기열 서비스는 버퍼에 오디오 데이터가 채워질 때마다 콜백을 시작합니다. NSOutputStream은 사용 가능한 공간이있을 때마다 이벤트를 시작합니다.

필자가 가장 먼저 생각한 것은 Audio Queue 콜백 서버에 데이터를 보내는 것입니다. 하지만 NSOutputStream에 그 시간에 사용 가능한 공간이없는 경우이 문제가 발생하는 것 같습니다.

그런 다음 오디오 대기열에서 돌아오고 NSOutputStream이 공간 사용 가능 이벤트를 발생시킬 때마다 데이터를 버퍼링하는 것에 대해 생각했습니다. 그러나 서버에 보내는 것이 오디오 녹음보다 앞서면 사용 가능한 공간에 이벤트를 쓸 수없는 상황이 발생하므로 이벤트가 다시 발생하지 않고 데이터 전송이 중단되는 문제가있는 것 같습니다. 효과적으로 멈출 것이다.

그래서 이것을 처리하는 가장 좋은 방법은 무엇입니까? 반복적으로 발사되는 타이머가 있어야하며 사용 가능한 공간이 있는지, 전송해야하는 데이터가 있는지 확인하십시오. 또한 일부 스레드 동기화를 수행하여 네트워크를 통해 전송하기 위해 버퍼에서 데이터를 가져올 수 있지만 버퍼를 맹 글링하는 위험없이 레코딩이 진행됨에 따라 버퍼에 데이터 청크를 추가 할 수 있다고 생각합니다.

답변

3

버퍼가 특정 크기를 초과하면 링 버퍼를 사용하여 특정 수의 오디오 프레임을 유지하고 프레임을 드롭 할 수 있습니다. stream-has-space-available 콜백이 호출되면 링 버퍼에서 프레임을 가져와 전송합니다.

CHDataStructures은 몇 개의 링 버퍼 (순환 버퍼라고 함) 클래스를 제공합니다.

+0

감사합니다 피터, 나는 전에 이러한 데이터 구조를 발견하지 못했습니다. 서버 측에서 음성 인식을하고 있지만이 방법이 유용 할 것 같아 정확성에 영향을 미치지 않고 프레임을 안전하게 삭제할 수 있는지 알지 못합니다. objective-c에 대한 스레드 안전 큐 구조를 알고 있습니까? 나는 주변을 둘러 보았고 아무것도 발견하지 못했다. 내 자신을 써야 할지도 몰라. –

+0

링크 된 프레임 워크의 클래스에 대한 스레드 안전성에 대해서는 잘 모릅니다. 해당 설명서를 읽고 내용을 확인하십시오. –

+0

@PeterHosey 콜백 함수에서 서버로 데이터를 보낸 방법을 설명해 주시겠습니까? 해당 콜백 함수에서 obj-c 코드를 작성하여 버퍼에서 오디오 데이터를 추출하고 서버에 전송하는 방법을 이해할 수 없습니다. –