如何同时在线播放大量 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 声音没有在 onClick() 中同时播放?
播放大量声音时,Android soundpool 意外关闭应用程序而没有消息