为android声音输出添加延迟

时间:2015-03-12 16:44:03

标签: android audio bluetooth audiobuffer

所以我为Android App写了这篇文章。这个想法很简单:

检测是否正在播放声音,如果是,则打开BluethoothSCO频道,以便在那里播放音频。

我想用它来"路由"我的汽车扬声器的导航方向信息。它几乎像预期的那样工作。

有一个巨大的'在音频识别和bluethoothsco连接准备就绪之间延迟约1秒。这导致几乎一半的导航信息丢失。

我的想法是添加延迟或暂停播放一秒钟。

现在:检测到声音 - > BluethootSCO开场(声音一直在这里播放) - >汽车扬声器的声音

IDEA:检测到声音 - >暂停/延迟1秒 - > BluethootSCO开启 - >恢复播放 - >汽车扬声器的声音

我考虑过将其录制并在之后播放,但是对于某些类似的信息来说,这将是迟到的;现在左转#34;

短暂的延迟是可以的,但我不知道要实现这个:(

由于应用程序仅供我自己使用root,所以可以。 也许有可能直接在AudioFlinger?

public void checkSound() {
    AudioManager localAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);

    Visualizer localVisualizer = new Visualizer(0);
    localVisualizer.setEnabled(true);
    Visualizer.MeasurementPeakRms localPeak = new Visualizer.MeasurementPeakRms();

    boolean wasPlayingBefore=false;
    while (keeprunning) //Loop to detect changes on the Media Audio Stream
    {
        localVisualizer.getMeasurementPeakRms(localPeak);
        if(localPeak.mPeak > -8500 && !wasPlayingBefore)
        {
            //There is some audio output
            wasPlayingBefore=true;
            localAudioManager.setBluetoothScoOn(true);
            localAudioManager.startBluetoothSco();
            localAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
            android.os.SystemClock.sleep(5000); //Route to BT Headset will exist min. 5 seconds ...
        }
        if(localPeak.mPeak <= -8500 && wasPlayingBefore)
        {
            //output (temporary) gone
            android.os.SystemClock.sleep(2000);//... plus this 2 seconds
            //check again
            localVisualizer.getMeasurementPeakRms(localPeak);
        }
        if(localPeak.mPeak <= -8500 && wasPlayingBefore)
        {
            //Audio didn't get back in last 2 seconds...
            wasPlayingBefore=false;
            localAudioManager.setBluetoothScoOn(false);
            localAudioManager.stopBluetoothSco();
            localAudioManager.setMode(AudioManager.MODE_NORMAL);
        }
        android.os.SystemClock.sleep(100); //Slow down the loop
        Log.d("Peak", String.valueOf(localPeak.mPeak));//Debug info - Audio peak -9600 = Silent, 0 = MAX Output
   }
    localVisualizer.release();
}

0 个答案:

没有答案