1

静的モードで0.5 秒間繰り返し再生したいのですAudioTrackが、音が途切れるという問題に直面しています。TransitionDrawableしかし、並走中の音は完全にクリアであることに気付きました。

私のコードの簡略化されたスケルトンは次のとおりです。

thread = new Thread(new Runnable() {

  public void run() {
    createTransition();

    try {
      createAudioTrack();

      while (true) {
        if (audio) {
          playSoundClip();
        }

        if (display) {
          playScreenTransition();
        }

        Thread.sleep(getDelayBetweenBeats());
      }
    } catch (InterruptedException e) {
    } finally {
      resetScreenTransition();
      stopSoundClip();
    }
  }

  private void createAudioTrack() {
    short[] samples = generateSamples();
    track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, samples.length * 2, AudioTrack.MODE_STATIC);
    if (track.getState() != AudioTrack.STATE_UNINITIALIZED) {
      track.write(samples, 0, samples.length);
    }
  }

  private void playSoundClip() {
    if (track != null && track.getState() != AudioTrack.STATE_UNINITIALIZED) {
      track.stop();
      track.reloadStaticData();
      track.play();
    }
  }

  private void playScreenTransition() {
    view.post(new Runnable() {

      public void run() {
        view.setBackgroundDrawable(transition);
        transition.startTransition(DURATION);
      }

    });
  }

});
thread.start();

ご覧のとおりthread、UI スレッドでは実行されないため、trackマルチスレッドの問題に直面していると思います。オーディオが並行して再生されているため、トランジションを再生する UI スレッドが CPU 全体を消費するとは思いません。アクティビティが何らかの形で CPU を消費し、他に何も実行されていないように見えます。

も使用しようとしview.post(new Runnable() {...});ましplaySoundClip()たが、役に立ちませんでした。

すべてを に変更することを考えましたAsyncTaskが、バックグラウンド タスクのままであるため、何も変更されません。UI 要素をサウンドで更新する必要がなく、トランジションを並行して再生する必要があるため、それも試しませんでした。

解決策は、おそらく常にいくつかのトランジションを並行して実行することです (実際のトランジションまたはダミーのトランジション)。

track常にプレイを明確にする別の方法を知っている人はいますか?


編集:
この問題でさらに作業し、プログラムを拡張した後、ロジックが完了するまでに時間がかかり、UI ですべてを実行できないため、上で示したようなスレッド化されたアプローチを使用する必要があることに気付きました-もうスレッド。現在、オーディオの再生中にダミーのトランジションを再生していますが、それでもまだ悪いように聞こえます。したがって、このトピックに関する洞察を提供できる場合は、ここに投稿/回答してください。

4

2 に答える 2

2

を確認することをお勧めしますSoundPool。これにより、短いオーディオサンプルを一度メモリに静的にロードしてから、はるかに低いレイテンシでオンデマンドで再生できます。使用している方法AudioTrackは、リロードせずにオーディオを再生するのに適していますが、このように短く、頻繁に繰り返されるサウンドバイトの場合は、それでも少し重いかもしれません。

また、バックグラウンドスレッドをまったく使用しないことを検討することもできます。Threadスニペットからは、実際にはタイマーとしてを使用しているように見えます。また、を使用して一定の間隔でHandler投稿すると、パフォーマンスが向上する可能性があります(これにより、メインスレッドでオーディオ/トランジションメソッドを呼び出すこともできます) Runnable) 代わりは。

HTH

于 2012-09-20T21:52:25.070 に答える
0

私ははるかに大きなオーディオのチャンクを持っていますが、私が作成したサービスでそれらを再生することができました。

PSナイスしゃれ

于 2012-09-20T21:39:51.097 に答える