linux声卡同时播放多种声音

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux声卡同时播放多种声音相关的知识,希望对你有一定的参考价值。

这篇文章将为大家详细讲解有关Linux下如何通过两个或多个输出设备播放声音,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
在 Linux 上处理音频是一件很痛苦的事情。Pulseaudio 的出现则是利弊参半。虽然有些事情 Pluseaudio 能够做的更好,但有些事情则反而变得更复杂了。处理音频的输出就是这么一件事情。
如果你想要在 Linux PC 上启用多个音频输出,你只需要利用一个简单的工具就能在一个虚拟j接口上启用另一个声音设备。这比看起来要简单的多。
你可能会好奇为什么要这么做,一个很常见的情况是用电脑在电视上播放视频,你可以同时使用电脑和电视上的扬声器。
安装 Paprefs
实现从多个来源启用音频播放的最简单的方法是是一款名为 “paprefs” 的简单图形化工具。它是 PulseAudio Preferences 的缩写。
该软件包含在 Ubuntu 仓库中,可以直接用 apt 来进行安装。
sudo apt install paprefs
安装后就能狗启动这款程序了。
启动双音频播放
虽然这款工具是图形化的,但作为普通用户在命令行中输入paprefs来启动它恐怕还是要更容易一些。
打开的窗口中有一些标签页,这些标签页内有一些可以调整的设置项。我们这里选择***那个标签页,“Simultaneous Output。”

Paprefs on Ubuntu
这个标签页中没有什么内容,只是一个复选框用来启用该设置。
下一步,打开常规的声音***项。这在不同的发行版中位于不同的位置。在 Ubuntu 上,它位于 GNOME 系统设置内。

Enable Simultaneous Audio
打开声音***项后,选择 “output” 标签页。勾选 “Simultaneous output” 单选按钮。现在它就成了你的默认输出了。
测试一下
用什么东西进行测试随你喜欢,不过播放音乐总是可行的。如果你像前面建议的一样,用视频来进行测试也没问题。
一切顺利的话,你就能从所有连接的设备中听到有声音传出了。
这就是所有要做的事了。此功能最适用于有多个设备(如 HDMI 端口和标准模拟输出)时。你当然也可以试一下其他配置。你还需要注意,只有一个音量控制器,因此你需要根据实际情况调整物理输出设备。
关于“Linux下如何通过两个或多个输出设备播放声音”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
参考技术A 启动双音频播放
虽然这款工具是图形化的,但作为普通用户在命令行中输入paprefs来启动它恐怕还是要更容易一些。
打开的窗口中有一些标签页,这些标签页内有一些可以调整的设置项。我们这里选择***那个标签页,“Simultaneous Output。”

如何同时在多个设备中播放声音

【中文标题】如何同时在多个设备中播放声音【英文标题】:How to play sound in many devices at the same time 【发布时间】:2011-05-15 21:52:11 【问题描述】:

我想同时在三个外部声卡中播放声音,我的意思是当我单击一个按钮时,我可以听到三个与我的三个声卡相关的扬声器的声音。 我有一个功能,但它只在一个设备上播放声音,它找到的第一个设备,我的意思是在这段代码中第一个设备是数字 0,所以它在其中播放声音,但是如果你首先写设备号 1,它会在其中播放声音,结论是它只在一个设备上播放声音,它不能同时适用于所有设备。 这是它的代码:

public void playAllAvailableDevices()

//create a new class for each wav file & output etc.
WaveOut waveOut1 = new WaveOut();
WaveFileReader waveReader1 = new WaveFileReader(fileName);
WaveOut waveOut2 = new WaveOut();
WaveFileReader waveReader2 = new WaveFileReader(fileName);
WaveOut waveOut3 = new WaveOut();
WaveFileReader waveReader3 = new WaveFileReader(fileName);

switch (waveOutDevices)

case 1: 
waveOut1.Init(waveReader1);
waveOut1.DeviceNumber = 0;
waveOut1.Play();
break;
case 2: 
waveOut1.Init(waveReader1);
waveOut1.DeviceNumber = 0;
waveOut1.Play();

waveOut2.Init(waveReader2);
waveOut2.DeviceNumber = 1;
waveOut2.Play();
break;
case 3:
waveOut1.Init(waveReader1);
waveOut1.DeviceNumber = 0;
waveOut1.Play();

waveOut2.Init(waveReader2);
waveOut2.DeviceNumber = 1;
waveOut2.Play();

waveOut3.Init(waveReader3);
waveOut3.DeviceNumber = 2;
waveOut3.Play();
break;

fileName 是我要播放的声音文件的名称,在我的代码中,我从 darabase 中获得了这个名称:

private void btnAlarm1_Click(object sender, EventArgs e)
    

        OdbcConnection cn = new OdbcConnection("DSN=cp1");
        cn.Open();
        OdbcCommand cmd1 = new OdbcCommand("select chemin from alarme where code_alarme=41", cn);
        cmd1.Connection = cn;
        fileName = cmd1.ExecuteScalar().ToString();
        wave = new WaveOut();
        playAllAvailableDevices();
    

你能帮我找到解决办法吗???? 先感谢您。 美好的一天。

【问题讨论】:

这是您在此处发布的关于同一问题的第 5 个问题,以及 NAudio 网站上的更多查询。我们确实想帮助您,但到目前为止您发布的所有示例代码都表明您对 C# 和编程基础知识的掌握非常有限。我强烈建议你参加一些基本的编程课程。 @Mark Heath:是的你说得对,我对Csharp的掌握有限,在其他帖子里我说我是初学者。不是同一个问题,我要播放声音在所有设备中,其他问题有所不同。感谢您的回复,非常抱歉打扰 对不起,如果我冒犯了你。我们都需要从某个地方开始。我已经更新了我的答案,以包含如何在所有设备中播放的示例代码,并展示了如何稍微改进编程风格以利用函数而不是剪切和粘贴代码。您的代码示例的另一个问题是,在 btnAlarm1_Click 中,您创建了另一个从未使用过的 WaveOut 对象。 【参考方案1】:

在调用Init 之前,您需要在WaveOut 对象上设置DeviceNumber 属性。你可以使用一个简单的函数来清理你的代码:

    private void PlaySoundInDevice(int deviceNumber, string fileName)
    
        if (outputDevices.ContainsKey(deviceNumber))
        
            outputDevices[deviceNumber].WaveOut.Dispose();
            outputDevices[deviceNumber].WaveStream.Dispose();
        
        var waveOut = new WaveOut();
        waveOut.DeviceNumber = deviceNumber;
        WaveStream waveReader = new WaveFileReader(fileName);
        // hold onto the WaveOut and  WaveStream so we can dispose them later
        outputDevices[deviceNumber] = new PlaybackSession  WaveOut=waveOut, WaveStream=waveReader ;

        waveOut.Init(waveReader);
        waveOut.Play();
    

    private Dictionary<int, PlaybackSession> outputDevices = new Dictionary<int, PlaybackSession>();

    class PlaybackSession
    
        public IWavePlayer WaveOut  get; set; 
        public WaveStream WaveStream  get; set; 
    

字典保留 WaveOut,因此它不会在播放期间收集垃圾,并允许我们正确清理。在退出应用程序之前,请确保正确清理:

    private void DisposeAll()
    
        foreach (var playbackSession in outputDevices.Values)
        
            playbackSession.WaveOut.Dispose();
            playbackSession.WaveStream.Dispose();
        
    

现在您可以使用 for 循环在所有可用设备上播放,而不是使用需要复制代码的 switch 语句:

    public void PlayInAllAvailableDevices(string fileName)
    
        int waveOutDevices = WaveOut.DeviceCount;
        for (int n = 0; n < waveOutDevices; n++)
        
            PlaySoundInDevice(n, fileName);
        
    

【讨论】:

@Mark Heath: 非常感谢,我试过你的代码,但它不能同时在三个设备上播放声音,它总是只等待一个设备,我不知道为什么 您使用的是哪个版本的 NAudio? 我刚刚在我的电脑上进行了测试,它工作正常。虽然我会做一个小的编辑,因为 WaveOut 对象不应该是一个局部变量,否则它会被丢弃 现在效果很好,谢谢 :) 如果你不介意我想问你另一个问题,可以吗? 那么你最好问问那篇文章的作者。不过,您可以改用 NAudio。使用 WaveOut 代替 WaveOutPlayer 和 WaveIn 代替 WaveInRecorder。【参考方案2】:

我认为您正在寻找的是 BASS 音频库:

http://www.un4seen.com/

这也可能有效:

http://www.alvas.net/alvas.audio.aspx

我认为如果没有像上面列出的第三方插件,C# 不会设置为执行此操作。也许比我更聪明的人可以帮助你让它工作,但如果没有,这些库会帮助你走上你想要的道路。

【讨论】:

@Biggs TRC:非常感谢您的帮助:)

以上是关于linux声卡同时播放多种声音的主要内容,如果未能解决你的问题,请参考以下文章

windows声音设置,一个音源,多个设备

同时播放多少个视频或音乐声卡会炸

电脑能同时输出两个声音给两个音箱吗?

是否可以录制声卡上播放的声音?

使用 C# 在特定设备中播放声音

我的电脑突然放歌放电影没声音,显示音频设备无法播放,请检查声卡设置