我试图在RemoteIO中播放Ogg Vorbis文件,我使用以下代码从Vorbis获取PCM样本:我试图在RemoteIO中播放Ogg vorbis文件,我使用以下代码从vorbis获取PCM样本:
ssize_t r = ov_read(ds->vf,pcm->buf,sizeof(pcm->buf),SYSTEM_ENDIAN,2,1,NULL);根据ov_read上的文档,这会将样本放在缓冲区中,采用小端格式,16位带符号的样本。这工作得很好,我已经向RemoteIO提供了这些数据,但是声音严重失真,尽管可以识别并在正确的时间播放。这是我使用的格式:
AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = 44100.0;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
streamFormat.mBytesPerPacket = 4;
streamFormat.mFramesPerPacket = 1;
streamFormat.mBytesPerFrame = 4;
streamFormat.mChannelsPerFrame = 2;
streamFormat.mBitsPerChannel = 16;发布于 2012-11-14 16:54:16
在查看您的代码时,有一些东西会跳出来,尽管我不确定它们中的任何一个(或全部)一定要对您所描述的问题负责。
首先,如果你正在做立体声处理,streamFormat.mBytesPerPacket应该是8。在iOS/OSX上,了解帧、通道和数据包之间的关系非常重要。它看起来像这样:

此外,我会将kAudioFormatFlagsNativeEndian添加到streamFormat.mFormatFlags中。另外,为了安全起见,我建议将streamFormat.mReserved设置为0。
我有点怀疑你对ov_read()的调用中的SYSTEM_ENDIAN标志是否能正确地为你提供数据,所以如果有对应的大端/小端标志,我建议你也试一下。
https://stackoverflow.com/questions/13372918
复制相似问题