首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RemoteIO音频单元中播放vorbis时的严重失真

在RemoteIO音频单元中播放vorbis时的严重失真
EN

Stack Overflow用户
提问于 2012-11-14 12:11:42
回答 1查看 195关注 0票数 1

我试图在RemoteIO中播放Ogg Vorbis文件,我使用以下代码从Vorbis获取PCM样本:我试图在RemoteIO中播放Ogg vorbis文件,我使用以下代码从vorbis获取PCM样本:

代码语言:javascript
复制
ssize_t r = ov_read(ds->vf,pcm->buf,sizeof(pcm->buf),SYSTEM_ENDIAN,2,1,NULL);

根据ov_read上的文档,这会将样本放在缓冲区中,采用小端格式,16位带符号的样本。这工作得很好,我已经向RemoteIO提供了这些数据,但是声音严重失真,尽管可以识别并在正确的时间播放。这是我使用的格式:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2012-11-14 16:54:16

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

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

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

我有点怀疑你对ov_read()的调用中的SYSTEM_ENDIAN标志是否能正确地为你提供数据,所以如果有对应的大端/小端标志,我建议你也试一下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13372918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档