AudioToolbox 에 AudioQueue 를 사용해서 레코딩을 하게 되는데,
AudioQueueInputCallback 를 통해서 인코딩된 음성 데이터를 얻어 올 수 있다.
이를 통해서 얻어온 오디오 데이터는 하나의 패킷이 아니라 여러 패킷이 하나로 뭉쳐있는 형태이다. 파일로 저장 할떄는 AudioFile.h 내의 메소드를 사용하면 큰 무리 없이 파일 저장이 가능하다.
하지만 데이터를 스트림 서버로 전달해야 하는 경우에는 달랐다.
일단 콜백을 통해서 전달되는 경우에는 데이터에 ADTS 데이터가 포함되어 있지 않다.
그 부분은 아래 포스팅 한 방식으로 어렵지 않게 추가가 가능하다.
하지만, 문제는 전달되는 데이터가 여러 패킷의 연속된 데이터라, 각 패킷마다 ADTS정보를
넣어 주어야 하는데 각 패킷의 자를 방법을 찾아야 했다.
콜백으로 전달된 데이터 중에 분명 해당 정보가 있을것이라 생각하고 파본 결과 역시나 존재하고 있었다.
void (*AudioQueueInputCallback)( void * inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp * inStartTime, UInt32 inNumberPacketDescriptions, const AudioStreamPacketDescription *inPacketDescs);
콜백의 원형은 위와 같다.
위 파라미터에서 inPacketDescs 이녀석을 주목하면 된다.
AudioStreamPacketDescription 구조체 타입이고 원형은 아래와 같다.
struct AudioStreamPacketDescription { SInt64 mStartOffset; UInt32 mVariableFramesInPacket; UInt32 mDataByteSize; }; typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;
보는것처럼 패킷의 offset과 size 정보가 들어 있다.
이를 통해서 packet을 나누어 주면 된다.
그리고 패킷은 inNumberPacketDescriptions개 이다.
inPacketDescs 은 보는것처럼 포인터로 배열 처럼 데이터가 저장되어 있다.
즉 inNumberPacketDescriptions 만큼 루프를 돌면서 inPacketDescs[1] 의 형태로 접근하면,
각각 패킷의 offset과 size정보를 얻어 올수 있게 된다.
이를 이용해서 각 패킷앞에 ADTS 데이터를 붙여주면 스트림으로 전달 가능한 완전한 오디오 데이터가 완성이 될수 있다.
반응형
'개발 > 미디어개발' 카테고리의 다른 글
[미디어] ACC ADTS 생성하기 (0) | 2017.02.25 |
---|