如何在Java中向Pulse Audio写入原始音频数据?解决设备占用问题
解决方案:通过PulseAudio软件混音器实现多应用音频共存
在Ubuntu 22.04上,默认的音频服务是PulseAudio——它就是你要找的高层软件混音器,所有主流应用(浏览器、游戏等)都是通过它输出音频,以此实现多个应用同时发声。你只需要在代码中选择PulseAudio对应的混音器,而非直接选择硬件设备,就能解决设备占用冲突的问题。
具体操作步骤:
识别PulseAudio混音器
运行你现有的混音器列表代码时,输出里会出现带有PulseAudio或Default Audio Device描述的条目(比如类似PulseAudio Mixer),这就是系统默认的软件混音器。别选那些带有硬件名称(如HDA Intel、USB Audio Device)的条目。调整代码选择对应混音器
用户选择时,选中PulseAudio对应的序号即可,后续打开SourceDataLine的代码无需修改:Mixer.Info[] mixers = AudioSystem.getMixerInfo(); for (int i = 0; i < mixers.length; i++) Log.i("["+i+"]"+" "+mixers[i].getDescription()); Scanner scanner = new Scanner(System.in); int selection = scanner.nextInt(); // 选择PulseAudio对应的序号 scanner.close(); // 后续打开线路的代码不变,仅使用Pulse的混音器信息 mLine = AudioSystem.getSourceDataLine(mAudioFormat, mixers[selection]); int bufferSizeInBytes = mBufferSizeInFrames * mChannels * mBytesPerSmp; mLine.open(mAudioFormat, bufferSizeInBytes);确保Java支持PulseAudio
如果列表里没出现PulseAudio混音器,可能需要安装Java的PulseAudio支持包,在终端执行:sudo apt install libpulse-java安装完成后重新运行应用,就能看到PulseAudio的混音器条目。
原理说明
PulseAudio作为系统级音频中间层,会接收所有应用的音频输出流,将它们混音后统一输出到硬件设备。这样即使硬件被其他应用占用,你的应用通过PulseAudio写入音频流也不会冲突,实现多应用音频同时播放。
内容的提问来源于stack exchange,提问作者Scorb
相关产品推荐
相关产品推荐

