【问题标题】:Heavy Distortion when playing vorbis in RemoteIO Audio Unit在 RemoteIO 音频单元中播放 vorbis 时出现严重失真
【发布时间】:2012-11-14 16:54:16
【问题描述】:

我正在尝试在 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;

【问题讨论】:

    标签: ios audiounit


    【解决方案1】:

    查看您的代码时,有几件事会跳出来,但我不确定其中任何(或全部)是否一定要对您描述的问题负责。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多