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 に答える