개발/미디어개발

[iOS] AudioQueueInputCallback buffer 오디오 데이터 자르기

hagulu 하구루2017.02.25 16:45

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 데이터를 붙여주면 스트림으로 전달 가능한 완전한 오디오 데이터가 완성이 될수 있다.


신고

댓글

댓글쓰기 폼

hagulu.com

.....

VISITED

Today : 103

Total : 119,814

Lately Comment