問題タブ [opensl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android-ndk - SLAndroidSimpleBufferQueueItf への初期コールバックを強制する
OpenSL オーディオ プレーヤー用の bufferqueue インターフェイス (SLAndroidSimpleBufferQueueItf) があります。コールバックをインターフェイスに登録します。コールバック内で、データが循環バッファに埋められるのを条件付き待機しています。
私の問題は、コールバックへの最初の呼び出しを取得する方法がわからないことです。
インターフェイスを作成した直後に、ハードコーディングされたデータを Enqueue に渡すことで強制しました。これは、ダミー データを再生してから、循環バッファでデータを待機するコールバックに入るという効果があります。
これにより、すべてがうまく機能します。初めてコールバックを起動するために、このダミーデータを渡す必要はありません。
私は何が欠けていますか?
android - openSL ES Android: 不規則なオーディオ コールバック
openSL
の 1 つで ES を使用していAndroid apps
ます。アプリがフォアグラウンドにある場合、コールバックはかなり規則的です。マイク コールバックは約 10 ミリ秒ごとに呼び出され、スピーカー コールバックも同様です。ただし、アプリをバックグラウンドに置いてブラウザー (または別のアプリ) を開くと、ブラウザーを開く (またはブラウジングする) ときにコールバックの「嵐」がトリガーされることがわかります。それを回避する方法はありますか?そして、なぜそれが起こるのですか?openSL は、コールバックを実行できなかった期間を補償していますか? (追いつこうとしているように)。
私のソースコードが入ってC
いて、私はオンですJelly Bean 4.3.
AudioTrack
とのスレッドの優先順位を上げようとしましたが、AudioRecorder
それが役立つようですが、それが正しい方法かどうかはわかりません。
追加の質問
つまり、スレッドの優先度を上げても、コールバックのバーストが発生する可能性があり、それらを破棄する必要があると言っているのですか?
それはどのように良い解決策ですか?マイク パケットをドロップする (またはスピーカー パケットのソースを排出する) ことになりますよね? マイク パケットをドロップしない場合、マイク パケットの受信者はマイク パケットのバーストを過度のジッターと解釈しますよね?
さらに重要なこと: AudioTrack と AudioRecorder のスレッド優先度を手動で上げ、sched ポリシーをラウンド ロビンに変更しました。ルート アクセスと BusyBox のインストールの両方が必要でした (これには、スレッドの優先度/スケジュール ポリシーを変更するためのコマンド ライン ユーティリティが付属しています)。これは C からプログラムでどのように行われますか? アプリ(プロセス)の優先度だけでなく、個々のスレッドの優先度が上がることを確認したいと思います。
java - Android でループ オーディオとアニメーションを正確に同期する
質問: AudioTrack と setLoopPoints() を使用して、ミリ秒あたりのサンプル/フレーム数に基づいた精度でループを構成する方法はありますか?
編集:ほとんどの Android デバイスが持つ処理能力からは完全な精度が期待できないことを理解しています。ただし、平均ループ時間をミリ秒単位のテンポの「実際の」間隔に近づけたいと思います。これは、テンポと同期する必要がある「アニメーション」に基づいているためです (アニメーションは、再描画する SurfaceView です)テンポの間隔中の線の座標)。
詳細: setLoopPoints で AudioTrack を使用して、正確なメトロノームを作成しようとしています。これを行うために、2 つの wav ファイル (Tick と Tock) を使用して byte[] 配列を埋め、AudioTrack にフィードします。4/4 時間で byte[] を埋める例を考えてみましょう。1 回は [0] から始まる Tick で、3 回は (arrayCopy() を使用して) Tock で [length/4]、[length/2]、および[3*長さ/4] とし、wav データが重ならないようにします。
私のコードが行うことの大まかな例:
問題が見えてきたと思います。特定のテンポでは、ループで静的な再生しか得られません(ただし、1 番目と 3 番目の Tock [ループの 2 番目と 4 番目のサンプル] の間のみ)。
次の場合、スタティックは停止します。
- byte[] に wav データを入力しないで、bytesPerInterval と numSamples を同じにします (正しい持続時間のサイレント ループ)。
- bytesPerInterval = bytesPerInterval % 4 に設定します (したがって、テンポの精度が失われます)
機能する (静的ではない) テンポと機能しない (静的) テンポの例と必要なフレーム数 (1 秒 = 88200 フレームと考えてください):
質問に対する答えが「いいえ、setLoopPoints() を使用してミリ秒単位で正確なループを構成することはできません」という場合は、他のオプションについて知りたいと思います。NDK、SoundPool、または MediaPlayer の OpenSL ES は、正確なループを生成するのに適していますか?
編集 2:静的な問題の原因となっている場所を絞り込みました:
最も重要なことは、wavData の奇数インデックスで始まるオーディオ データが、予想されるサウンドではなくスタティックを生成する理由と、これに対する救済策があるかどうかを理解したいことです。
android - Android OpenSL は SL_IID_PLAYBACKRATE をサポートしていませんか?
NDK を使用してオーディオ インストゥルメントを作成しました。低レイテンシ パフォーマンスを実現するために、OpenSL を選択して音楽ファイルを再生しましたが、音楽再生の再生速度を変更できませんでした。スナップコードは次のとおりです。
キーポイントは次のとおりです。
私は、playbackMaxRateとplaybackMinRateの間に値を設定しようとしました(私のS3電話では、playbackMaxRateは2000、playbackMinRateは500です)。しかし、効果はありません.Android NDKのドキュメントは、SL_IID_PLAYBACKRATEをサポートしていると述べています。私のコードに何か問題がありますか? どうもありがとう。
android - OpenSL は自分自身を記録できますか?
ゲームから送信されるオーディオをキャプチャし、再生中にオーディオ ファイルに記録したいと考えています。これは OpenSL のフレームワーク内で可能ですか? OutputMix を AudioRecorder などに接続することでしょうか。
android - オーディオのリダイレクト / Android での代替サウンド パスの作成
Android でオーディオをリダイレクトしたり、新しいサウンド パスを作成した経験がある人はいますか (OpenSL ES、ALSA などを使用)。最終的な目標は、仮想マイクを作成して外部マイクを置き換えることです。これにより、音声ファイルをマイクに向かって話しているかのように再生できます。でマイクにアクセスするアプリケーションは、AudioSource.MIC
この代替ストリームを使用する必要があります。音声通話で動作する必要はありません。すべて無線内で行われるため、そのような機能を実現するのは難しいと思います。
どこから始めるべきかについてのアイデアはありますか? OpenSL と ALSA について調査しましたが、カスタム オーディオ パスを定義するには、新しいファームウェア (ROM) をパッケージ化する必要があるようです。回避できるのであれば、アプリケーション レベルのソリューションを作成したいと考えています。電話は「ルート化」されています(suバイナリがあります)。これのターゲット デバイスは、Samsung Galaxy S4 Google Edition (GT-i9505G) です。具体的には、i9505G のオーディオ ドライバー構成/ソース コードまたはリファレンスを探しています。
前もって感謝します!
編集 - CyanogenMod 10.2 ソース ツリーと、jfltexx ドライバーおよびカーネルをチェックアウトしました。kernel/samsung/jf/sound の内容は次のとおりです: http://pastebin.com/7vK8THcZ。これはどこかに文書化されていますか?
android - OpenSL でジェネレーティブ サウンドを再生する
私はサウンドを生成するアプリを構築しています (現在はほとんど実験的なものです)。それを Android フォンで再生します。
今のところ、単純な正弦波サウンド (440 Hz) を再生しようとしています。最初は Audiotrack で試しましたが、バッファ アンダーランが発生しました。そこで、OpenSL を調べてみることにしました。
今、私はこれに関する多くのチュートリアルとブログ投稿を読み、最終的には Android Simple Buffer Queue を備えた OpenSL エンジンを使用して独自の実装を作成しました。
バッファ コールバックで、新しいバッファ データを生成してキューに追加しますが、遅延はオーディオ トラックよりもはるかに悪くなります (各バッファ間のギャップが聞こえます)。
私の質問は、OpenSL で生成されたサウンドのベスト プラクティス/アーキテクチャは何ですか? 別のスレッドでバッファーを埋める必要がありますか (その場合、バッファー コールバックとの同期プロセスが必要です)。
生成されたサウンドの OpenSL ES に関するチュートリアルはまだ見つかりません (ほとんどは、オーディオ ファイルの再生またはオーディオ入力のオーディオ出力へのリダイレクトに関するものです)。