1

我正在尝试在 RemoteIO 中播放 Ogg Vorbis 文件,我使用以下代码从 vorbis 获取 PCM 样本:我正在尝试在 RemoteIO 中播放 Ogg 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;
4

1 回答 1

1

查看您的代码时,有一些事情会跳出来,尽管我不确定它们中的任何一个(或全部)是否一定对您所描述的问题负责。

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

帧、通道和数据包,哦,天哪!

此外,我会添加kAudioFormatFlagsNativeEndianstreamFormat.mFormatFlags. 另外,为了安全起见,我建议设置streamFormat.mReserved为 0。

我有点怀疑SYSTEM_ENDIAN您调用中的标志ov_read()是否会正确地为您提供数据,因此如果有相应的大/小端标志,我建议您也尝试一下。

于 2012-11-14T08:54:16.310 回答