gpt4 book ai didi

ios - 在 RemoteIO 音频单元中播放 vorbis 时严重失真

转载 作者:行者123 更新时间:2023-11-29 13:24:58 29 4
gpt4 key购买 nike

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

最佳答案

在查看您的代码时,会跳出一些内容,但我不确定其中的任何(或全部)内容是否必然对您所描述的问题负责。

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

Frames, Channels, and Packets, oh my!

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

我有点怀疑你调用 ov_read() 时的 SYSTEM_ENDIAN 标志会正确地传送数据,所以如果有相应的 big/little 标志endian,我建议也尝试一下。

关于ios - 在 RemoteIO 音频单元中播放 vorbis 时严重失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372918/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com