みやこの元団長日記

グラブルの騎空団ぐるぐるストッキング(ぐるスト(ストはカタカナ))の元団長がたまになんか書くかもしれません

[Linux版] ゲーム音だけを録画/配信する方法

ゲーム等の録画/配信をする時、他のソフトでBGMを聞いていたりDiscord等でVCしていたりするかもしれません。そのような時にBGMやVCの音声が録画/配信に入ってしまうのを避けたい場合はあると思います。私の場合はVCでわいわいしながらFF14のくじテンダー配信をしたかったので、ゲーム音だけを配信できるように設定を整えました。今回はその方法を紹介したいと思います。

今回紹介する方法では以下のことが可能です。

  • ゲーム音を配信と自分の環境両方に出力可能
  • 配信するゲーム音と自分に聞こえるゲーム音の音量を独立して調整可能

今回使用したソフト等は以下のとおりです。

  • OS: Arch Linux
  • ゲーム: FF14 (on Wine)
  • VC: Discord (Linux用アプリ版)
  • 配信: OBS
  • DAC: Luxman DA-200 (USB接続)

方法の選択

今回の目的を達成する方法としてはいくつかあります。

  1. pulseaudioで音の出力先を制御する
    1. ゲーム音をnull sinkに出力し、それをOBSでキャプチャする
    2. ゲーム音をcombined sinkに出力し、それをOBSでキャプチャする
  2. Jack Audio Connection Kit (jack) で音の出力先を制御する
    1. WineASIOを導入してWine上のゲーム音をjackに出力する

上記3通り全て試しましたが、汎用性・安定性の面から1.1.の方法がおすすめです。今回はこの方法のやり方を紹介します。

PulseAudioとpavucontrolのインストール

最近のほとんどのディストリ/デスクトップ環境では特に設定してなくてもpulseaudioが音声制御に使われているはずなので、インストール等は不要なはずです。入ってない方はインストールして設定等いい感じにしておいてください。

pulseaudioの出力制御等をGUIから行うため、pavucontrolをインストールしておきます。

sudo pacman -S pavucontrol

次に、pulseaudioの設定を行います。今回の方法ではnull sinkという仮想出力を使用します。この仮想出力は本来入力された音声を全てドロップしてしまうのですが、モニター出力もあるのでそこからOBSや通常の出力(今回はUSB DAC)に音声を出力することができます。今回はその機能を使います。

デフォルトの出力先の確認

まずデフォルトの出力先を確認しておきます。

ターミナルから以下のコマンドを実行することで、利用可能な出力先の一覧が取得できます。

pacmd list-sinks

コマンドを実行すると以下のような出力が得られるはずです:

2 sink(s) available.
  * index: 0
        name: <alsa_output.usb-LUXMAN_USB_D_A_CONVERTER_DA-200-01.iec958-stereo>
        driver: <module-alsa-card.c>
        flags: HARDWARE DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
        state: RUNNING
        suspend cause: (none)
        priority: 9048
        volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
                balance 0.00
        base volume: 65536 / 100% / 0.00 dB
        volume steps: 65537
        muted: no
        current latency: 11.39 ms
        max request: 4 KiB
        max rewind: 4 KiB
        monitor source: 0
        sample spec: s24le 2ch 96000Hz
        channel map: front-left,front-right
                     Stereo
        used by: 2
        linked by: 3
        configured latency: 8.00 ms; range is 8.00 .. 1820.44 ms
        card: 1 <alsa_card.usb-LUXMAN_USB_D_A_CONVERTER_DA-200-01>
        module: 7
        properties:
(以下略)

何個かindex: <番号>という行が表示されていると思うので、そのすぐ下のname: <名前>から目的の出力先の名前をメモしておきます。私の場合はalsa_output.usb-LUXMAN_USB_D_A_CONVERTER_DA-200-01.iec958-stereoとなります。(indexでの指定は変わる可能性があるので名前を使います。)

default.paの設定

pulseaudioの設定はシステム全体とユーザー個別の設定があるのですが、今回はユーザー個別の設定を利用します。

pulseaudioは起動時に$HOME/.config/pulse/default.paというファイルから設定を読み込みます。なければ作りましょう。

default.paに以下のように記述します。

# システムのデフォルト設定の読み込み
# ディストリによってはデフォルトの設定ファイルが違う場所にあるかもしれないので要確認
.include /etc/pulse/default.pa

# null-sinkの有効化
# sink_nameは自由
load-module module-null-sink sink_name=OBSSink

# null-sink に名前をつける
# 第一引数には先程と同じsink_nameを使う
update-sink-proplist OBSSink device.description=OBSSink

# loopback moduleでnull-sinkの出力をデフォルトの出力先に設定
# souceには上で作ったnull-sinkのsink_nameに.monitorを付けた値を指定
# sinkには先程調べた出力先の名前を指定
# adjust_timeは0(無効)にしておく(重要)
# latency_msecは最小値の1を指定(デフォルトだと200ミリ秒の遅延が入ってしまう)
load-module module-loopback source=OBSSink.monitor sink=alsa_output.usb-LUXMAN_USB_D_A_CONVERTER_DA-200-01.iec958-stereo adjust_time=0 latency_msec=1

以上のようにファイルを作って記述したら、pulseaudioを一旦再起動します。

pulseaudio -k

通常は上記のコマンドでpulseaudioのプロセスを終了させると自動的に再起動するはずですが、起動しない場合(pavucontrolで確認可能)は以下のコマンドで起動させます。

pulseaudio --start

設定ファイルにミスがなければ起動できるはずです。

この状態でpavucontrolを起動すると、「Playback」タブに「Loopback from Monitor for Null Output on」といった出力が追加されているはずです。表示されていない場合は一番下の「Show:」となっているところが「All Streams」になっているか確認してください。

また、loopbackの出力先が先程設定ファイルで指定した出力先に設定されているかも確認しておいてください。

ゲーム音の出力先設定

この状態でゲームを起動します。今回はWine上でのFF14を例にとります。

参考: WineでFF14を動かす方法はこちら

miyacopl.hatenablog.com

ゲームを起動すると先程のpavucontrolの「Playback」タブに新しくゲームの出力が表示されるはずです。ゲーム名(FINAL FANTASY XIV)の右横に出力先の選択があるので、これを先程設定ファイルで作ったnull sinkの名前に指定します。上記の設定ファイルをそのまま使った場合はOBSSinkが選択可能になっているはずです。

ここまできちんと設定できていればゲーム音の出力先を変更してもゲーム音が聞こえるはずです。

また、ここで他のアプリケーション等の出力がOBSSinkなっていないことを確認しておきます。(なっていると配信に音が入ってしまいます)。アプリ版のDiscordは独自に設定を行っているようなので、使っている場合はDiscordの設定から出力先をOBSSink以外にしておきます。

ここまで設定が終わるとpavucontrolの画面は次のようになっているはずです。

f:id:MiyacoPL:20190616175907p:plain

OBSの設定

OBSでゲームをキャプチャする設定の方法は省きますが、「Sources」で「Window capture」を追加してゲーム画面を選択すればキャプチャできるはずです。

デフォルトではOBSはデスクトップの音を全てキャプチャしてしまうのでこれをミュートしておきます。「Mixer」のところに「Desktop Audio」というのがデフォルトで設定してあるはずなので、これのスピーカーアイコンをクリックしてミュートしておきます。

次に、OBSでゲーム音をキャプチャするように設定します。「Sources」で「Audio Output Capture (PulseAudio)」を追加できるはずなので追加し、「Create New」を選択して適当に名前を付けておきます。するとデバイスの選択画面になるはずなので、ここで先程追加したnull sinkの名前(ここではOBSSink)を選択します。すると「Mixer」のところに指定した名前で新しいサウンドのキャプチャが追加されるはずです。

ここまでできればゲーム音だけを配信することができているはずです。実際に配信/録画する等して確認してみてください。OBSを使った配信や録画の方法は調べればたくさん出てくるので省略します。Windowsと同じ方法で大丈夫です。

(おまけ)配信するゲームの音量と自分で聞くゲームの音量を独立に調整する

おまけです。この方法ではpavucontrolを使って配信するゲームの音量と自分で聞くゲームの音量を独立に調整することが可能です。

個人的には、配信を聞く人は音量を下げることはできても上げることはできないので、ゲーム(FF14)の音量は設定で大きくしておきそのままOBSに流し、自分で聞く音量を下げておくのがいいのではないかと思っています。

これは簡単で、ゲームを起動している状態でpavucontrolを開き、「Playback」タブの「Loopback from Monitor of Null Output」の音量をpavucontrol上で変更するだけです。自分で聞くゲーム音をミュートしたい時はここをミュートします。

おわりに

以上でpulseaudioの設定及び配信/録画の設定は終わりです。null sinkへの入出力を色々変えることで他の用途にも使えると思いますので、ぜひ色々試してみてください。

参考