1

NSSound を使用して、10 秒の AAC エンコードされた事前に録音されたホワイト ノイズのループを再生するアプリケーションの 1 つのホワイト ノイズ機能に関する作業がほぼ完了しました。

[sound setLoops: YES]

必要なのはそれだけですよね?

それは魅力のように機能しますが、サウンドファイルの終了と再起動の間に可聴の一時停止があることに気付きました..一種の「パタパタ」音です。これは元のサウンド ファイルをループしているときには存在せず、これを理解しようとして 1 時間ほど経過した後、NSSound が最悪であり、可聴一時停止はプライベート バックグラウンド スレッドの同期のアーティファクトであるという結論に達しました。サウンドを再生します。どういうわけかメインの実行ループに依存しているようで、これにより、サウンドの終了と再開の間に可聴ギャップが生じます。

私はサウンドについてほとんど知らないし、これは非常にマイナーな機能なので、ループする 10 秒のサウンド フラグメントを再生するためだけに CoreAudio の深みにはまりたくありません。ぴったり合うように:

  • Core Audio: 完全にやり過ぎですが、少なくとも標準的なフレームワークです
  • AudioQueue: 複雑、C++ のサンプル コード付き!?
  • MusicKit/ SndKit: 多くのオープンソースなどに基づいて、学習曲線も膨大です。

iOS 4 で AVFoundation がサウンドを再生する良い方法であることがわかりましたが、それは Mac OS X 10.7 でのみ予定されています..

Mac OS X 10.5+ でサウンドを確実にループさせる使いやすい方法はありますか?

Objective-C アプリケーションから AudioQueue または Core Audio を使用する手間を省くサンプル コードはありますか?

どんな助けでも大歓迎です..

よろしくお願いします、

フランク

4

3 に答える 3

2

アーカイブのためだけに。

QTKit はまた、1 つのプレイの終了と次のプレイの開始との間のギャップに悩まされています。何らかの方法でデータの再初期化 (おそらくディスクからの再読み込み?) に関連しているようです。圧縮されていない aiff ファイルを再生するときよりも、はるかに小さいが高度に圧縮された m4a 形式を使用するときの方がはるかに目立ちますが、それでもまだ存在します。

私が見つけた解決策は、Audio Queue Services を使用することです。

http://developer.apple.com/mac/library/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/AQPlayback/PlayingAudio.html#//apple_ref/doc/uid/TP40005343-CH3-SW1

http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Listings/aqplay_cpp.html#//apple_ref/doc/uid/DTS10004380-aqplay_cpp-DontLinkElementID_4

Audio Queue は、次のバッファを準備してキューに入れるコールバック関数を呼び出すため、現在のファイルの最後に到達すると、最初からやり直す必要があります。これにより、完全なギャップレス再生が実現します。

ドキュメントのサンプル コードには 2 つの落とし穴があります。

1 つ目は実際のバグです (DTS に連絡して修正してもらいます)。オーディオ バッファを割り当ててプライミングする前に、カスタム構造で再生をオンにする必要があります。そうしないと、オーディオ バッファがプライミングされず、何も再生されません。

    aqData.mIsRunning = 1;

2 つ目の注意点は、コードが Cocoa では実行されず、スタンドアロン ツールとして実行されるため、コードはオーディオ キューを新しい実行ループに接続し、実行ループ自体をプログラムの最後のステップとして実際に実装することです。

CFRunLoopGetCurrent() を渡す代わりに、AudioQueue を独自の実行ループで実行させる NULL を渡すだけです。

result = AudioQueueNewOutput (                                // 1
                     &aqData.mDataFormat,                             // 2
                     HandleOutputBuffer,                              // 3
                     &aqData,                                         // 4
                     NULL, //CFRunLoopGetCurrent (),                          // 5
                     kCFRunLoopCommonModes,                           // 6
                     0,                                               // 7
                     &aqData.mQueue                                   // 8
                     );

これが、将来同じことをやろうとしている哀れな人たちを救うことができることを願っています:-)

于 2010-08-26T08:46:00.027 に答える
2

QTKit を使用します。サウンドの を作成し、QTMovieループに設定して、再生したままにします。

于 2010-08-24T14:37:56.307 に答える
0

悲しいことに、OS Xでオーディオアプリケーションを開発するときは多くの苦痛があります。ドキュメントがかなりまばらであるため、学習曲線は非常に急です。

Objective-C ++を気にしないのであれば、私はこの種のフレームワークを作成しました:SFBAudioEngine。私のコードでサウンドを再生したい場合は、次のように実行できます。

DSPAudioPlayer *player = new DSPAudioPlayer();
player->Enqueue((CFURLRef)audioURL);
player->Play();

ループも可能です。

于 2010-08-24T13:50:05.400 に答える