Pengwin (WLinux) 備忘録:VLC/音声編

Pengwin on WSL 環境下のVLCで動画の再生まで成功しました。
screenの右下は vis の表示ですが、音声もちゃんと出力されています。

導入手順

  1. Pulse Auido の設定
  2. VLCの導入 / エラーの回避
  3. 動作確認
  4. おまけ: cli-visualizerの導入

PulseAudio を用いた音声出力

WSL上のソフトウェアから音声出力を利用するには、
PulseAudioを用いるのが一般的みたい(というかそれくらいしか方法がない?)です。

PulseAudioはクロスプラットフォームで動作するサウンドサーバで、
ほとんどのLinux ディストリビューションで利用されています。
PulseAudioはWindowsでも動作できるので
WindowsとWSL環境でそれぞれ PulseAudioを動作させ、WSL側からWindows側に音声を
転送させることでWIndowsの管理するスピーカーから音が鳴るという仕組みです。

Windowsでの設定

まず、
PulseAudio on Windowszipfile containing preview binaries からWindows版の
PulseAudioバイナリをダウンロードして解凍しておきます。

解凍後、Linux側から発見しやすい位置に移動しておきます。
必要に応じでLinux側からWindowsのPulseAudioを起動するためです。

設置出来たら、
pulseaudio > etc > pulse を開き以下の設定ファイルについて変更を行います

default.pa

#load-module module-native-protocol-tcp
↓
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

PulseAudioのネットワーク転送が使えるように module-native-protocol-tcp をロードするように設定します。
この際、一応通信を許可するアドレスを localhost に固定しておきます。

load-module module-waveout sink_name=output source_name=input
↓
load-module module-waveout sink_name=output source_name=input record=0

もう一点、Audioドライバの読み込みに関する設定の load-mdule 末尾に record=0 を追記します。
Windows10では録音デバイスのアクセスに制限が加わっているため、あらかじめつぶしておいた方が
よろしいそうです。

daemon.conf

; exit-idle-time = 20
↓
exit-idle-time = -1

一度起動した後、PulseAudioが勝手に停止しないように idleタイムを-1にしておきます。
この設定なしの場合 こちらの方のようにシェルから
リスタートをかけるような手もあるみたいです。

ここまで設定出来たら
bin > pulseaudio.exe
を起動してみます。
Windowsセキュリティアラートが通信の許可を求めてくる場合があるので
許可するようにします。

Pengwin on WSL での設定

Windowsの準備が終わったので今度は WSL側でも PulseAudioの設定を行います。

インストールはaptで一発です。

$ sudo apt install pulseaudio

インストールが終わったら
/etc/pulse/ に設定ファイルが生成されているはずなのでこれを変更します。

default.pa

#load-module module-native-protocol-tcp
↓
load-module module-native-protocol-tcp

Windowsと同じくWSLで動作する PulseAudioでもネットワーク転送のモジュールを有効にして、
転送先を localhostに限定しておきます。

client.conf

; default-server =
↓
default-server = tcp:localhost

WSLでは clientの設定として dedault-serer に tcp:localhost を指定します。
これで 音声はすべて Windows側に転送されるようになります。

以上で PulseAudioの設定はおしまいです。

PulseAudioの起動

〇WSL側
WSL側のPulseAudioは基本的に起動する必要はありません。
ただし、設定を変更した後は

$ pulseaudio -D

を実行して PulseAudioをDaemonモードで再起動して設定を反映させてください。

〇Windows側
WSLからの必要に応じでWindows側のPulseAudioを立ち上げる必要があります。
といってもWSLからWindowsのアプリケーションは普通に起動することができるので

以下のようなシェルスクリプトを動かすだけです。

#!/bin/sh
# Wake Up PulseAudio on Windows

cd /mnt/c/(Windowsのpulse audioのパス)/bin
./pulseaudio.exe -D

このスクリプトを load_pulse.sh などという名前でPATHの通った場所に保存しておいて

$ load_pulse.sh &

のように起動してやれば Windows 側の PulseAudioが立ち上がり、WSLの音が出力可能に
なります。

WSL起動時に常に音が出せるようにしておきたければ
.bashrc 等起動時に読み込まれるであろう処理の中にこのスクリプトの呼び出しを
加えておけばOKです。

もしくは、X410と同じく、WIndowsの起動時に立ち上げておくというのも手です。
この場合 pulseaduio.exe へのショートカットを作成し、リンク先を
C:\wsl\pulseaudio\bin\pulseaudio.exe -D として末尾に-D を追加します。

できたショートカットを Win+Rキー から shell:startupにコピーしてやれば
準備完了で音声に関しては Windows / WSL 双方で無操作で有効な状態になります。

VLCの設定

PulseAudioの設定が終わったら VLCを導入します。

インストールはaptで一発です。

$ sudo apt install vlc

通常ならこれで終わりのはずですが、この状態で VLCを起動すると

このようなエラーが表示され、VLCのGUIが立ち上がりません。
どうやらインターフェイス skins2 が上手く動いていない模様です。

原因はインターフェイスの表示に必要な libQt5Core.so がロードできないために
インターフェイスの構築が落ちていることです。
VLCだけでなく libQt5Core を使う多くのGUIアプリがクラッシュする場合同様の原因で
あることが多いです。

この問題が面白いのは libQt5Core.so.5自体は存在しているという点です。
Linuxで用いられるELF形式の実行ファイルには .note.ABI-tag という特殊セクションがあり、
コンパイル時に指定した場合、実行時に期待するABIを指定することができます。
つまり、Linuxの中でもディストリビューションやビルドごとの細かい互換性に関する情報を
指定するためのセクションです。

$ realpath /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3

$ file /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=32d7d4dbe6f32b839f6ada0c9508da5146441628, for GNU/Linux 3.17.0, stripped

fileコマンドで確認できる
for GNU/Linux 3.17.0
がクセモノです。
WSLで使用しているのは Linux 4.4.0-XXXXX-Microsoft Kernelなのでこのセクションの情報とのミスマッチで
適するライブラリ無しと判断されているというわけです。

このセクションはなくても動作に影響はないので以下の手順でセクションごと削り取ってしまえば
ちゃんと動作します。

$ sudo strip --remove-section=.note.ABI-tag $(realpath /usr/lib/x86_64-linux-gnu/libQt5Core.so.5)

$ file $(realpath /usr/lib/x86_64-linux-gnu/libQt5Core.so.5) #確認
/usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=32d7d4dbe6f32b839f6ada0c9508da5146441628, stripped

for GNU/Linux 3.17.0 の表示が消えたらOKです。

動作確認

 

これですべての設定が完了しました。
vlcを実行すると VLCのGUIが立ち上がり、音楽や動画の再生が可能です。

Windowsのサウンドミキサーで pulseaudio.exe が音声を受け取り、出力しているのが
確認できます。

おまけ:cli-visualizer

cli-visualizer はコマンドラインで動作する音楽ビジュアライザで PulseAudio に対応しています。
WSL環境下でもちゃんと動作しました。

〇導入方法

Readmeのいう通り

$ sudo apt-get install libfftw3-dev libncursesw5-dev libpulse-dev cmake
$ git clone https://github.com/dpayne/cli-visualizer.git
$ cd cli-visualizer
$ ./install.sh

次に設定ファイルを変更します

$ cd ~/.config/vis
$ nvim /config  # テキストエディタは各自

以下の設定を変更します

まずは Pulseをソースに指定して

#audio.sources=pulse
↓
audio.sources=pulse

付属のカラースキームを読み込むようにします。
カラースキームは各自カスタム可能ですがとりあえず付属のもので…。

#colors.scheme=rainbow
↓
colors.scheme=rainbow

vis終了時に書き換えた端末の色設定をバックアップさせる

#colors.override.terminal=false
↓
colors.override.terminal=false

以上で設定完了です。

$ vis

で起動します。

コメントを追加する