我正在尝试在RemoteIO中播放Ogg Vorbis文件,我使用以下代码从vorbis获取PCM样本:我正在尝试在RemoteIO中播放Ogg Vorbis文件,我使用以下代码获取PCM来自vorbis的样本:
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;
答案 0 :(得分:1)
在查看代码时,有些事情会跳出来,但我不确定它们中的任何一个(或全部)是否对您所描述的问题负有责任。
首先,如果您正在进行立体声处理,streamFormat.mBytesPerPacket
应为8。在iOS / OSX上,了解帧,通道和数据包之间的关系非常重要。它看起来像这样:
此外,我会将kAudioFormatFlagsNativeEndian
添加到streamFormat.mFormatFlags
。另外,我建议将streamFormat.mReserved
设置为0只是为了安全起见。
我有点怀疑你SYSTEM_ENDIAN
号召唤中的ov_read()
标志会正确地传递数据,所以如果有大/小端的相应标志,我建议尝试一下同样。