1

Android の「ビジュアライザー」で可視化したい PCM ストリームがありますが、大声で再生する必要はありません。

そのため、私はandroid-visualizerを実装しました。

使用すると、視覚化は成功します

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
            AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
            fileContent.length, AudioTrack.MODE_STREAM);
audioTrack.play();
mVisualizerView.link(audioTrack);
..
audioTrack.write(fileContent, 0, bytes);

しかし今、私の問題は、PCM を実際に「再生」したくないということです。視覚化したいだけです。ユーザーはメディア プレーヤーで音楽を聴いている可能性がありますが、邪魔したくありません。

だから私は「OK、AudioTrack をミュートするだけでいい」と思いました:

audioTrack.setStereoVolume(0.0f, 0.0f);

しかし悲しいことに、これ以上の視覚化もありません。SCALING_MODE_NORMALIZED により、Visializer は AudioTrack のラウドネスを無視する必要があると考えました。

キャプチャされたデータの内容に基づいて増幅が適用されるキャプチャ モードを定義します。これはデフォルトのビジュアライザー モードで、音楽の視覚化に適しています。

次に試したのは、PCM をオーディオ トラックに書き込むのではなく、直接ドロワーに提供することでした。

mVisualizerView.updateVisualizer(fileContent);

これにより曲線が作成されますが、非常にクレイジーに見え、私が期待したものとは何の関係もありません (モノではなくステレオを提供しているためでしょうか?)。

また、PCM ストリームの「波形」または「fft」データの作成にも成功しませんでした。

誰かアイデアはありますか?

4

2 に答える 2

0

AudioManager.setStreamMute(streamType, state) を試してください

于 2013-05-10T14:03:24.793 に答える
0

だから私は「OK、AudioTrack をミュートするだけでいい」と思いました。しかし悲しいことに、これ以上の視覚化もありません。

それがまさにその仕組みです。は、AudioFlingerエフェクト ( はエフェクト) を適用する前にミキシング (ボリュームが適用される場所) を実行しVisualizerます。

Visualizerしかし、既にお気づきのように、やりたいことに APIは必要ありません。キャンバスまたは OpenGL ES テクスチャを作成し、PCM データに基づいてフレーム (60 fps) ごとにデータを描画し、アプリのビューの 1 つに表示できます。

波形をプロットしたいだけなら、これは簡単です。描画したい幅が 100 ピクセルのビットマップがあるとします。フレームNで、N*735 から始まる 735 (44100/60) サンプルを取得し、それらから 100 ポイントを生成します (たとえば、線形補間によって)。これらの 735 のサンプルにわたって、ビットマップの垂直解像度に従ってスケーリングします)。PCM データがステレオの場合、補間点でサンプルの各ペアを取得し、それらを平均化できます。

スペクトログラムを描画したい場合は、最初に音声データを時間領域から周波数領域に変換する必要があるため、もう少し複雑になります。

于 2013-05-10T17:30:55.840 に答える