使用 ALSA 与 dmix 和 multi 插件一起进行录制

使用 ALSA 与 dmix 和 multi 插件一起进行录制

我正在尝试设置 ALSA 以使用 ffmpeg 录制一些视频,因此我需要听到应用程序的声音并能够录制它(实际上我可能需要录制 1 个特定的应用程序)。录音麦克风并不是那么重要,但它甚至没有任何问题,工作正常。我只有内置声卡,没有外部声卡(尽管我的 Nvidia 显卡添加了一些音频设备)。我正在编辑~/.asoundrc。我尝试使用 ffmpeg wiki 中的指南,但这对我来说并没有真正起作用,它没有使用 dmix,因此一次只允许 1 个应用程序播放声音。此外,由于某种原因,它甚至没有记录该应用程序的声音。我不记得为什么我放弃了这个解决方案,因为只能听到 1 个应用程序。然后我偶然发现问题在这里。我复制了这个问题的解决方案(当然我相应地更改了默认卡),现在我的~/.asoundrc看起来像这样:

pcm.snd_card { # my usual sound card
    type hw
    card 1
}

ctl.!default { # default control; alsamixer and such will use this
    type hw
    card 1
}

# software mixer for sound card
pcm.dmixer {
    type dmix
    ipc_key 1
    slave.pcm "snd_card"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        channels 2 # must match bindings
    }
    bindings {
        0 0
        1 1
    }
}

# software mixer for loopback device
pcm.dmixerloop {
    type dmix
    ipc_key 2
    slave.pcm "hw:Loopback,0,0"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        channels 2 # must match bindings
    }
    bindings {
        0 0
        1 1
    }
}

# allows multiple programs to capture simultaneously
pcm.dsnooper {
    type dsnoop
    ipc_key 2
    slave.pcm "snd_card"
    slave 
    {
        period_time 0
        period_size 1024
        buffer_size 4096
        channels 2 
    }
    bindings {
        0 0
        1 1
    }
}

pcm.!default {
    type asym
    playback.pcm "out"
    capture.pcm "dsnooper"
}

# Multi, splitting onto usual card and loopback
pcm.out {
    type plug
    slave.pcm {
        type multi
        slaves {
            a { channels 2 pcm "dmixer" }
            b { channels 2 pcm "dmixerloop" }
        }
        bindings {
            0 { slave a channel 0 }
            1 { slave a channel 1 }
            2 { slave b channel 0 }
            3 { slave b channel 1 }
        }
    }
    ttable [
        [ 1 0 1 0 ]   # left  -> a.left,  b.left
        [ 0 1 0 1 ]   # right -> a.right, b.right
    ]
}

这有效,但并不完美。问题是,我能够从应用程序和麦克风录制声音,但应用程序太安静了,在正常情况下我几乎听不到应用程序的声音(在 alsamixer 中主设置为 -5dB,应用程序本身的音量设置为 75%)并且即使我将 alsamixer 和应用程序中的音量调至 100%,这也并没有真正变得更好。另一方面,麦克风的音量正常。在alsactl restore终端输入时我也收到一个奇怪的错误:

alsa-lib main.c:1560:(snd_use_case_mgr_open) error: failed to import hw:2 use case configuration -2

我认为这与环回设备有关,但我不确定这意味着什么。我也不确定这是否与申请量有关。这个错误重要吗?对音量有影响吗?如何固定应用程序的音量?

编辑:我从 ffmpeg wiki 切换到配置,这几次。重新启动后,alsamixer 的 Master 设置为 46%,但由于某种原因我无法更改它。另一方面,我的 slstatus(从 amixer 获取信息)显示 92%,这是我之前设置的值(-5dB)。还值得注意的是,在这种配置下,麦克风无法与 Discord 和 Steam 语音聊天一起使用,尽管它们的配置没有发生任何变化。我也听不到来自 Discord 的任何声音,我猜 Steam 语音聊天也是如此。不过,我仍然可以使用 ffmpeg 录制麦克风声音。我还可以听到其他应用程序的声音,例如 Firefox 或游戏。

编辑:看来我错了,我可以听到来自 Discord 和 Steam 语音聊天的声音。虽然 Steam 能够正确捕获我的麦克风,但 Discord 却不能。

编辑:我不确定这是否是它应该如何工作(可能是),但是当我关闭 alsamixer 中捕获麦克风时,根本没有记录任何内容。

相关内容