2012-11-14 37 views
1

我想在RemoteIO中播放Ogg Vorbis文件,我使用以下代码获取vorbis的PCM样本:我试图在RemoteIO中播放Ogg Vorbis文件,我使用下面的代码从Vorbis格式获得PCM样本:在RemoteIO音频单元中播放vorbis时发生严重失真

ssize_t r = ov_read(ds->vf,pcm->buf,sizeof(pcm->buf),SYSTEM_ENDIAN,2,1,NULL); 

据对ov_read这使样品中的缓冲带一点endian格式,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; 

回答

1

当你的代码看,几件事情跳出来,虽然我不知道它们中的任何(或全部)都一定对你负责所存在的问题描述。

首先,streamFormat.mBytesPerPacket应该是8如果你正在做立体声处理。在iOS/OSX上,理解帧,频道和数据包之间的关系非常重要。它看起来是这样的:

Frames, Channels, and Packets, oh my!

此外,我想补充kAudioFormatFlagsNativeEndianstreamFormat.mFormatFlags。另外,我建议将streamFormat.mReserved设置为0只是为了安全起见。

我有点怀疑您拨打ov_read()SYSTEM_ENDIAN标志会正确传递您的数据,所以如果有大/小端的相应标志,我建议您也尝试使用它们。