"라이브"(버퍼링 된) 오디오 데이터를 OggVorbis 형식으로 인코딩하려고하지만 단지 저를 위해 작동하지 않습니다. 내가하는 일과 관계없이 출력 스트림에는 Vorbis 헤더 만 포함됩니다 (Ogg 데이터 없음).libOgg/libVorbis 및 AudioBufferList
동일한 방식으로 libLAME을 사용하여 MP3 스트림에 성공적으로 인코딩되었습니다 (분명히 ogg 기능을 LAME으로 대체).
PCM 데이터를 가져 와서 libOgg에 입력하고 출력을 검색하고 버퍼링하는 코드를 포함 시켰습니다. 지금 나는 "Buffer Overflow"단계에서 깨고 Xcode를 사용하여 outputBuffer에 포함 된 메모리를 봅니다.
위에서 말했듯이이 기능은 libLAME을 사용하는 MP3에서 작동하므로 멀리 떨어져있을 수는 없습니다. ogg.header 및 ogg.body을 보면 데이터가 포함되어 있고 ogg.header_length는 282이고 ogg.body_length는 255입니다.
필요하면 필자는 볼 수 있도록 outputBuffer를 붙여 넣을 수 있습니다.
UInt32 ioLengthInFrames = 256;//ioBufferDuration * self.audioFormat->mSampleRate;
AudioBufferList *ioData = AllocateABL(self.audioFormat->mChannelsPerFrame, self.audioFormat->mBytesPerFrame, NO, ioLengthInFrames);
AudioBufferList *floatData = AllocateABL(self.audioFormat->mChannelsPerFrame, self.audioFormat->mBytesPerFrame, NO, ioLengthInFrames);
UInt32 retVal = TPCircularBufferPeek(inputBuffer, NULL, self.audioFormat);
if (!retVal > 0)
return;
//NSLog (@"Frames Available: %ld", retVal);
TPCircularBufferDequeueBufferListFrames(inputBuffer, &ioLengthInFrames, ioData, NULL, self.audioFormat);
AEFloatConverterToFloatBufferList(self.floatConverter, ioData, floatData, ioLengthInFrames);
if (ioLengthInFrames <= 0)
{
NSLog(@"Not enough frames");
return;
}
float **buffer = vorbis_analysis_buffer(&vd, ioLengthInFrames * self.audioFormat->mBytesPerFrame);
buffer[0] = floatData->mBuffers[0].mData;
buffer[1] = floatData->mBuffers[1].mData;
checkresult (vorbis_analysis_wrote(&vd, ioLengthInFrames * self.audioFormat->mBytesPerFrame), @"Analysis Wrote");
int wrote = 0;
while (vorbis_analysis_blockout(&vd, &vb) == 1)
{
NSLog(@"Block Out");
checkresult (vorbis_analysis(&vb, NULL), @"Analysis");
checkresult (vorbis_bitrate_addblock(&vb), @"BitRate AddBlock");
while (vorbis_bitrate_flushpacket(&vd, &op))
{
NSLog(@"Flush Packet");
ogg_stream_packetin(&os, &op);
bool eos = false;
while (!eos)
{
NSLog(@"EOS");
int result = ogg_stream_pageout(&os, &og);
if (result==0)break;
NSLog(@"EOS 2");
int availableBytes;
unsigned char* head = TPCircularBufferHead(&outputBuffer, &availableBytes);
if (availableBytes < og.header_len + og.body_len)
{
return;
// Buffer Full
}
memcpy(head, og.header, og.header_len);
memcpy(head+og.header_len, og.body, og.body_len);
TPCircularBufferProduce(&outputBuffer, og.header_len + og.body_len);
wrote += og.header_len + og.body_len;
if (ogg_page_eos(&og))eos=true;
}
}
}
NSLog(@"Rendering OggVorbis: %d bytes written", wrote);