如何同时在线播放大量 SoundPool 文件和收音机

Posted

技术标签:

【中文标题】如何同时在线播放大量 SoundPool 文件和收音机【英文标题】:How to play lot of SoundPool files and a radio online in the same time 【发布时间】:2018-04-07 10:32:16 【问题描述】:

我刚刚在 android Studio 中创建了一个应用,原因有两个:

    制作一个乐器采样器,感谢 SoundPool,每个打击垫都会播放声音。 并在线播放广播(使用服务在后台播放)。

收音机工作正常,采样器也工作,但我不能使用不同的采样器(我有 3 个不同的,每个有 6 个打击垫)没有任何错误,例如:

AUDIO_OUTPUT_FLAG_FAST 被客户端拒绝;传输 4,轨道 44100 Hz, 输出 48000 赫兹

当我使用大量声音时:

AudioTrack: AudioFlinger could not create track, status: -12
SoundPool: Error creating AudioTrack

这是我的第一个问题,之后我触摸按钮时播放的声音可能是 1/10。

我的第二个问题是当这个问题发生时,收音机不能再工作了,这个消息出现在 logcat 中:

AudioTrack: AudioFlinger could not create track, status: -12        
AudioTrack-JNI: Error -12 initializing AudioTrack          
android.media.AudioTrack: Error code -20 when initializing AudioTrack.        
ExoPlayerImplInternal: Playback error.

当我只使用 1 个采样器或只使用收音机时,没关系。我刚刚在采样器中收到了这条消息:

AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44100 Hz, output 48000 Hz

...但是如果我使用不同的采样器或快速播放大量声音,或者使用收音机,则无法正常工作

我认为使用线程是可以的;我不知道它究竟是如何工作的,但在很多帖子中,带有线程的 SoundPool 都不起作用。

我尝试将我的 .mp3 文件更改为 .ogg 或更改音轨 Hz,但它不起作用。

我的清单中仍然有这些权限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="RECORD_AUDIO" />

我的 Sampler 的文件是这样的:

public class ActivityDrumsLofi extends AppCompatActivity 

    SoundPool Soundpool;

    private int sound_g, sound_h, sound_i, sound_j, sound_k, sound_l;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        Soundpool = new SoundPool(32, AudioManager.STREAM_MUSIC, 0);

        sound_g= Soundpool.load(this, R.raw.kick6lofi, 1);
        sound_h= Soundpool.load(this, R.raw.kicklofi, 1);
        sound_i= Soundpool.load(this, R.raw.hatlofi, 1);
        sound_j= Soundpool.load(this, R.raw.hithatlofi, 1);
        sound_k= Soundpool.load(this, R.raw.tambilofi, 1);
        sound_l= Soundpool.load(this, R.raw.snare2lofi, 1);
    

    public  void playsample1 (View view) 
            SoundpoolLofi.play(sound_g, 1, 1, 1,0, 1);
    

    public  void playsample2 (View view) 
        SoundpoolLofi.play(sound_i, 1, 1, 1,0, 1);
    

    public  void playsnare (View view) 
        SoundpoolLofi.play(sound_k, 1, 1, 1,0, 1);
    

    public  void playkick (View view) 
        SoundpoolLofi.play(sound_h, 1, 1, 1,0, 1);
    

    public  void playhat (View view) 
        SoundpoolLofi.play(sound_j, 1, 1, 1,0, 1);
    

    public  void platclap (View view) 
        SoundpoolLofi.play(sound_l, 1, 1, 1,0, 1);
    

【问题讨论】:

【参考方案1】:

抱歉,请先简短回答。我会发表评论,但我不能因为我是 SO 新手 :)

状态 -12 表示您基本上内存不足。这意味着,要么您的声音文件太大,要么更可能的情况是:您超出了同时加载声音的限制。 Soundpool 只能“容纳”32 个声音对象。问题是,每次播放声音时,都会增加一个声音。您必须在某个时候使用 Soundpool.release() 来清理内存。 第二个问题是,当 Soundpool 完成播放声音时,您无法知道何时可以释放它。由于您在同一个活动等中一遍又一遍地使用它。它可能无法在 onPause() 或其他东西中释放。 一个“hacky”解决方案是,例如,您在指定时间后通过处理程序释放它,因为您知道您的声音有多长。这绝对不是一个优雅的解决方案,所以也许其他人有更好的解决方案。

我希望这会有所帮助(我的第一个答案:P)

【讨论】:

以上是关于如何同时在线播放大量 SoundPool 文件和收音机的主要内容,如果未能解决你的问题,请参考以下文章

同时播放多个 SoundPool

为啥我的 SoundPool 声音没有在 onClick() 中同时播放?

播放大量声音时,Android soundpool 意外关闭应用程序而没有消息

安卓权威编程-笔记(19章 使用SoundPool播放音频)

如何同时播放多个声音文件?

初学Android 多媒体之使用SoundPool播放音效 七十六