문제

내장 마이크에서 오디오를 녹음 해야하는 iPhone 애플리케이션을 작성한 다음 해당 오디오 데이터를 프로세싱을 위해 서버로 보냅니다.

응용 프로그램은 소켓 연결을 사용하여 서버 및 오디오 큐 서비스에 연결하여 녹음을 수행합니다. 내가 확실하지 않은 것은 실제로 데이터를 실제로 보내야 할 것입니다. 오디오 큐 서비스는 일부 오디오 데이터로 버퍼를 채울 때마다 콜백을 시작합니다. NSOUTPUTSTREAM 공간이있을 때마다 이벤트를 발사합니다.

첫 번째 생각은 오디오 큐 콜백에서 데이터를 서버로 보내는 것이 었습니다. 그러나 NSoutputStream에 그 당시 공간이 없으면 문제가 발생할 것 같습니다.

그런 다음 오디오 대기열에서 돌아 오면 데이터를 버퍼링하고 NSoutputStream이 사용 가능한 이벤트를 발사 할 때마다 일부를 보낼 수 있다고 생각했습니다. 그러나 서버로 보내는 것이 오디오 녹음보다 앞서 나오면 문제가있는 것처럼 보일 것입니다. 이벤트가 가능한 이벤트에 쓸 수있는 상황이 없으므로 이벤트가 다시 발생하지 않고 데이터 전송이 발생합니다. 효과적으로 멈출 것입니다.

그렇다면 이것을 처리하는 가장 좋은 방법은 무엇입니까? 반복적으로 발사되는 타이머가 있어야하고 사용할 수있는 공간이 있고 전송 해야하는 데이터가 있는지 확인해야합니까? 또한 버퍼에서 데이터 덩어리를 가져와 네트워크를 전송하기 위해 버퍼에서 데이터 덩어리를 가져와 버퍼에 데이터 청크를 추가 할 수 있도록 버퍼에 데이터 청크를 추가 할 수 있도록 스레드 동기화를 수행해야한다고 생각합니다.

도움이 되었습니까?

해결책

버퍼가 특정 크기를 초과하는 경우 링 버퍼를 사용하여 특정 수의 오디오 프레임과 드롭 프레임을 보유 할 수 있습니다. 스트림-하스 공간을 이용할 수있는 콜백이 호출되면 링 버퍼에서 프레임을 잡아 당겨 보내십시오.

chdatrastructure 몇 가지 링 버퍼 ( "원형 버퍼") 클래스를 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top