5

私は iPad 用の VOIP アプリを作成しています (現在 2&3 をターゲットにしています)。

私は元々、kAudioUnitSubtype_RemoteIO ユニットを使用して、Audio Unit API を使用してオーディオ コードを作成しました。これはうまくいきましたが、当然のことながらエコーが問題でした。kAudioUnitSubType_VoiceProcessingIO ユニットの使用に切り替えて、組み込みのエコー抑制を使用しようとしました。これは iOS 6 (iPad 3) では非常にうまく機能しますが、iOS 5.1 (iPad 2) で同じコードを使用すると、マイク入力にホワイト ノイズが発生します。

ドキュメントには、iOS 3.0以降で利用できるはずだと書かれているだけです

ここでの重要な違いは iOS のバージョンのようです。2 つの iPhone 4S でアプリを実行してみました。1 つは iOS 6 で正常に聞こえ、もう 1 つは iOS 5.1 でホワイト ノイズのように聞こえました。

私の ASBD は次のようになります。

typedef int16_t sample_t;
#define AUDIO_BUFFER_SAMPLE_RATE 48000
#define FORMAT_FLAGS (kAudioFormatFlagsIsSignedInteger | kAudioFormatFlagsIsNonInterleaved)
#define CHANNELS_PER_FRAME 1

...

const size_t bytes_per_sample = sizeof(sample_t);
const int eight_bits_per_byte = 8;
AudioStreamBasicDescription streamFormat;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mSampleRate = AUDIO_BUFFER_SAMPLE_RATE;
streamFormat.mFormatFlags = FORMAT_FLAGS;

streamFormat.mChannelsPerFrame = CHANNELS_PER_FRAME;
streamFormat.mBytesPerFrame = bytes_per_sample * CHANNELS_PER_FRAME;
streamFormat.mBitsPerChannel = bytes_per_sample * eight_bits_per_byte;

streamFormat.mFramesPerPacket = 1;
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame * streamFormat.mFramesPerPacket;
streamFormat.mReserved = 0;

iOS 5.1 で kAudioUnitSubType_VoiceProcessingIO を動作させた人はいますか?

この IO に関する重大なドキュメントを知っている人はいますか?

4

1 に答える 1

14

TL;DR にkAudioFormatFlagsIsPacked追加FORMAT_FLAGS

少し複雑なルートでこれを発見しました。これはどこにも十分に文書化されていないようですが、MacでIOを使用することについて話しているこのSO投稿に出くわしました。言及されたものの1つは、「FlagsCononical」の使用でした。設定してみました:

#define FORMAT_FLAGS kAudioFormatFlagsAudioUnitCanonical

これは機能せず、AudioUnitInitialize の呼び出しはリターン コード 29759 で失敗しました。これが何を意味するかについてのドキュメントは見つかりませんでしたが、試してみると:

#define FORMAT_FLAGS kAudioFormatFlagsCanonical

すべてがうまくいきました!成功!

iPad 用にビルドしている (したがってとして定義している)kAudioFormatFlagsCanonical場合の CoreAudioTypes.h 内の の定義は次のとおりです。CA_PREFER_FIXED_POINT1

kAudioFormatFlagsCanonical = kAudioFormatFlagsIsSignedInteger
                           | kAudioFormatFlagsNativeEndian
                           | kAudioFormatFlagIsPacked;

kAudioFormatFlagIsPacked元のコードに追加した後、機能しました。念のため追加kAudioFormatFlagsNativeEndianしました。kAudioFormatFlagsIsNonInterleavedとにかくシングルチャンネルオーディオには不要だったので削除しました。私が残したものは と同じですkAudioFormatFlagsCanonical

したがって、iPad 2 (iOs 5.1) と iPad 3 (iOS 6.0) で動作する私のセットアップは次のとおりです。

  • のサンプルレート48000
  • 1チャンネル
  • kAudioFormatFlagsCanonical
  • int16_tサンプル
  • リニア PCM

誰かが持っている場合、私はまだこのIOのドキュメントに熱心です.

于 2012-10-12T09:42:48.973 に答える