我正在构建一个记录声音的iPhone应用程序。我使用音频队列服务,一切都适合录音。
问题是,我正在使用AudioFileWritePackets进行文件写入,而我正在尝试将相同的“AAC + ADTS”数据包放入网络套接字。
生成的文件不同,因为某些“标题”或“adts标题”可能会丢失。我正在寻找有关如何编写ADTS标头和/或AAC标头的想法?社区可以帮我解决这个问题,还是可以向我介绍一下如何做到这一点的指南?
我目前有缓冲区处理程序方法:
void Recorder::MyInputBufferHandler(void inUserData,
AudioQueueRefinAQ, AudioQueueBufferRefinBuffer,
const AudioTimeStamp*inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription*inPacketDesc) {
AQRecorder *aqr = (AQRecorder *)inUserData;
try {
if (inNumPackets > 0) {
// write packets to file
XThrowIfError(AudioFileWritePackets(aqr->mRecordFile,
FALSE,
inBuffer->mAudioDataByteSize,
inPacketDesc,
aqr->mRecordPacket,
&inNumPackets,
inBuffer->mAudioData),
"AudioFileWritePackets failed");
fprintf(stderr, "Writing.");
// We write the Net Buffer.
[aqr->socket_if writeData :(void *)(inBuffer->mAudioData)
:inBuffer->mAudioDataByteSize];
aqr->mRecordPacket += inNumPackets;
}
// if we're not stopping, re-enqueue the buffe so that it gets filled again
if (aqr->IsRunning()) {
XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL),
"AudioQueueEnqueueBuffer failed");
}
}
catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
}
答案 0 :(得分:1)
我找到了解决方案:
我实现了回调
XThrowIfError(
AudioFileInitializeWithCallbacks(
this,
nil,
BufferFilled_callback,
nil,
nil,
//kAudioFileCAFType,
kAudioFileAAC_ADTSType,
&mRecordFormat,
kAudioFileFlags_EraseFile,
&mRecordFile),
"InitializeWithCallbacks failed");
......瞧!您必须实现的真正回调是BufferFilled_callback。这是我的实施:
OSStatus AQRecorder::BufferFilled_callback(
void * inUserData,
SInt64 inPosition,
UInt32 requestCount,
const void * buffer,
UInt32 * actualCount) {
AQRecorder *aqr = (AQRecorder *)inUserData;
// You can write these bytes to anywhere.
// You can build a streaming server
return 0;
}
如果你想了解更多关于音频队列服务的信息,你可以从Flipzu for iPhone获得一些想法(用于直播音频的前应用程序//我们必须将其关闭,因为我们无法筹集资金)。
https://github.com/lucaslain/Flipzu_iPhone
最佳,
卢卡斯。
答案 1 :(得分:0)
我最近使用iLBC编解码器遇到了这个问题,并按如下方式得出了解决方案:
录制您想要的音频数据,然后将其写入文件。然后,获取该文件并对其执行八进制转储。您可以使用-c标志来查看ascii字符。
然后,创建一个您知道不包含标题的单独文件。这只是来自音频队列缓冲区的数据。八进制转储,并进行比较。
从这里,你应该有标题和足够的信息如何继续。希望这会有所帮助。