我正在使用 Audio Streaming Services 库(基于 Matt Ghallager 的教程)进行实时流式传输音频,但我一直在这部分崩溃:
err = AudioQueueStart(audioQueue, NULL);
if (err)
{
[self failWithErrorCode:AS_AUDIO_QUEUE_START_FAILED];
return;
}
错误代码是:kAudioDeviceUnsupportedFormatError ..这家伙是在CoreAudio/AudioHardware.h中定义的,这似乎是硬件相关的问题。我在网上找不到有关此错误的很多有用信息。
有趣的是,早些时候我在尝试这个时遇到了类似的问题:
// create the audio
err = AudioQueueNewOutput(&asbd, MyAudioQueueOutputCallback, self, NULL, NULL, 0, &
if (err)
{
[self failWithErrorCode:AS_AUDIO_QUEUE_CREATION_FAILED];
return;
}
(在这篇文章中遇到了同样的问题,但是文章的作者错误地将他们的错误代码归因于AudioQueueStart而不是AudioQueueNewOutput)
我得到了这个错误代码:kAudioFormatUnsupportedDataFormatError .. 我的补救措施是手动添加这个代码:
asbd.mFormatID = kAudioFormatMPEGLayer3;
自从我发现打电话
AudioFileStreamGetProperty(inAudioFileStream, kAudioFileStreamProperty_DataFormat, &asbdSize, &asbd);
最初给我kAudioFormatMPEGLayer1作为 mFormatID 而不是kAudioFormatMPEGLayer3,它是 .mp3 ,这是我实际播放的音频文件。
最后.. 可能我第一次注意到有问题是在我最初调用这个函数时:
AudioFileStreamOpen((__bridge void*)streamer, ASPropertyListenerProc, ASPacketsProc,
0, &(streamer->audioFileStream));
我第一次没有将 inFileTypeHint 提供给它导致的函数
AudioFileStreamParseBytes(streamer->audioFileStream, inDataByteSize, inData, 0);
调用以解析字节失败..(特别是..我得到了Parse bytes failed.err: typ? 1954115647错误消息,即 kAudioFileUnsupportedFileTypeError)..
我解决这个问题的方法是(你猜对了)手动添加文件类型提示:
streamer->err = AudioFileStreamOpen((__bridge void*)streamer, ASPropertyListenerProc, ASPacketsProc,
kAudioFileMP3Type, &(streamer->audioFileStream));
所以你可以看到..我推到地毯下的一个问题终于来咬我了..但我不确定为什么解析器无法手动识别我的音频文件类型..以及为什么我必须保留硬编码该值..只是让它最终失败。