【问题标题】:Asynchronous audio player with java for Android适用于 Android 的带有 java 的异步音频播放器
【发布时间】:2017-03-19 16:35:08
【问题描述】:

我创建了一个在 Android 中运行的 Java 应用程序。仅使用 同步 MediaPlayer 类准备和播放声音,涉及 50 到 80 毫秒的延迟,这对于实时产品来说太大了。

因此,为了提高 Java for Android 声音播放器的性能(通过最大限度地减少延迟),我正在寻找一种异步音频播放器或媒体播放器。

异步,因为这样可以避免加载(准备)或播放声音时的延迟

您知道可以在 Java 应用程序中导入的 Android 原生库或其他东西吗?

例如,我看到了那个 URL,但我不知道如何在 Java 应用程序中“插入”它?

https://developer.android.com/reference/android/media/AsyncPlayer.html

谢谢

【问题讨论】:

  • 用原始 PCM 流尝试AudioTrack
  • @pskink 我在 Eclipse 上使用 Java 构建我的应用程序。事实上,我使用 Javafx 和 javafxports 和 Gluon 来生成 apk 文件。你说我可以同时使用 javafxports 和音轨吗?在实践中,如何添加 Audiotrack 类:只有一个导入,没有别的?在 Java 应用程序中包含此类的方式在哪里?
  • 嗯,对不起?
  • 我不明白你的问题。你想让我改写我的答案吗?谢谢
  • 我只是问你是否尝试使用该类并播放一些应该像雷暴一样快的原始 PCM 数据

标签: java android asynchronous audio audio-player


【解决方案1】:

我在书中写了一个关于 Android 音频的非常完整的章节。这是我用来决定使用哪个 API 的流程图。您引用的旧 AsyncPlayer 已被弃用,在我看来并不能真正解决您的延迟问题。 媒体播放器的启动延迟更差。根据您提供的信息,SoundPool 可能是最佳选择。 AudioTrack 为您提供最大的灵活性。

希望这会有所帮助。以下是使用 soundPool API 播放声音的代码摘录:

private void playSoundPool(int soundID) {
    int MAX_STREAMS = 20;
    int REPEAT = 0;
    SoundPool soundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, REPEAT);
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int soundId, int status) {
            int priority = 0;
            int repeat = 0;
            float rate = 1.f; // Frequency Rate can be from .5 to 2.0
            // Set volume
            AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
            float streamVolumeCurrent =
            mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
            float streamVolumeMax =
            mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
            float volume = streamVolumeCurrent / streamVolumeMax;
            // Play it
            soundPool.play(soundId, volume, volume, priority, repeat, rate);
        }
    });
    soundPool.load(this, soundID, 1);
}

【讨论】:

  • 我已经修改了使用 SoundPool 概念的代码。但是,现在,android.media.AudioManager 的 .jar 位置是什么,导入 android.os.Handler;导入android.os.Looper;导入android.os.Message;导入 android.os.ParcelFileDescriptor; //导入android.util.AndroidRuntimeException;导入android.util.Log; ... ?我必须将它添加到 Java 构建路径中。谢谢
  • 不需要外部 .jar 文件,您只需要在您的导入中包含导入“android.media.SoundPool”。这应该是我提供的代码所需的唯一包含。
  • 马克,我的Android(apk)Java代码是直接用Gluon通过JavaFXPorts生成的。我不应该看到 Activity、Context 和 AudioManager。您的示例需要导入 SoundPool,但还需要导入 Context(使用 soundPool.load(this, soundID, 1)),AudioManager(使用 new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, REPEAT);),... 所以,我不了解该做什么。我不使用 Android Studio,而是“仅”使用带有 JavaFX 的 Eclipse。解决我的问题的想法?非常感谢
  • 马克,其实在编译Java之后,我有两个重要的错误:“package android.media does not exist import android.media.AudioManager”和“package android.media does not exist import android.media”。媒体.SoundPool;"我不明白这些错误,因为我在我的 JavaBuild Path 中添加了这个 android-sdks 平台:android.jar (android-25)。
  • 帮助 - 我不明白,因为这个包 android.media 确实包含在 android-25 中。请参阅:developer.android.com/reference/android/media/SoundPool.html - 而且,在 Eclipse 中,我已将这个 android-sdk AI-25 包含在项目库(Java 构建路径)中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2017-04-30
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
相关资源
最近更新 更多