以下の解決策はすべて、オーディオのピッチを (再生速度とともに)変更します。再生速度が変更された後にオーディオのピッチを修正するには、サードパーティのオーディオ ライブラリ( LGPL ライセンスを持つSoundTouchなど)を使用する必要があります。ソース、またはDiracLEまたは無料のsmbPitchShift )。オーディオのピッチを変更できるオーディオ ユニット ( AUPitch ) がありますが、iPhone では使用できません。マック専用。
以下のソリューションはすべてテスト済みで、機能します...
解決策 #1 [最善の解決策]
3D ミキサー ユニット:マルチチャンネル ミキサー ユニットの代わりに 3D ミキサー ユニットを使用し、入力スコープで k3DMixerParam_PlaybackRate を設定します。
利点: k3DMixerParam_PlaybackRate は、オーディオの再生中にリアルタイムで設定でき、サウンドのクリッピングやその他の副作用はありません。また、オーディオ ユニットを導入すれば、実装も簡単です。
短所:オーディオのピッチに影響しますが、再生レートを +/- 8% だけ変更する必要がある場合、ピッチの違いはあまり目立ちません。
解決策 2
サンプル レートの変更:ミキサー ユニットの出力バスのサンプル レートを変更します。サンプル レートの変更は、サンプルの追加と削除と非常によく似ています。
利点:再生速度を整数の分数 (たとえば 1.2x) で乗算する場合に適しています。
短所:ミキサー出力のサンプル レートの変更は、その場で設定できません。ミキサーユニットの初期化時のみ。オーディオのピッチに影響しますが、再生レートを +/- 8% だけ変更する必要がある場合、ピッチの違いはあまり目立ちません。
audioDescriptionMixerOutput.mSampleRate = 1.2*kGraphSampleRate;
解決策 3
サンプルの追加/削除:レンダー コールバック関数のオーディオ ユニット (私の場合はミキサー ユニット) の入力に、毎秒、3 番目、... のオーディオ サンプルのみを渡します。
利点:オーディオの再生速度を 2 倍、3 倍、4 倍などにしたい場合に適しています。実装も簡単です。
短所:再生速度を整数倍にすることしかできません。たとえば、サンプルを追加または削除しても、オーディオ再生を 1.2 倍高速化することはできません。オーディオのピッチに影響します。