dmixとマルチプラグインを使用してALSAとして録音

dmixとマルチプラグインを使用してALSAとして録音

ffmpegを使用して一部のビデオを録画するようにALSAを設定したいので、アプリケーションを聞いて録画できるようにする必要があります(実際には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(ミキサーから情報を取得する)は92%で表示されます。これは以前に設定した値(-5dB)です。また、この構成では、マイクがDiscordおよびSteamボイスチャットでは機能しないことにも注目する価値があります。ただし、その構成には何の変更もありません。 Discordでも音は全く聞こえません。 Steamボイスチャットでも同じようです。ただし、ffmpegを使用すると、マイクの音を録音できます。 Firefoxやゲームなどの他のアプリケーションから音を聞くことができます。

編集:私は間違っているようです。 DiscordとSteamボイスチャットの両方で音が聞こえます。 Steamは私のマイクを正しくキャプチャできましたが、Discordはそうではありませんでした。

編集:これがどのように機能するのかはわかりませんが(おそらくそうです)、alsamixerでキャプチャマイクをオフにすると何も録音されません。

関連情報