はじめに
お久しぶりです。初めての方は初めまして。
ffmpegを使って、DiscordのVCに動画を音声と共に流してみたいと思います。
この記事は、Ubuntu Desktop 20.04での方法を書いています。
また、各コマンドの意味は一番最後のffmpeg
以外ほとんど理解していないため、その点はご容赦下さい。
加えて、この行為によってどうなっても知りません。何も保証しません。できません。よろしくお願いします。
他との違い
他のV4L2の記事では全て映像のみですが、この記事では両方扱います。
セットアップ
まず、必要なものは以下の通りになります。
- ffmpeg
- ブラウザかDiscordのデスクトップクライアント
- 今回はGoogle Chromeを使用します
- FirefoxはVCとの相性が悪いのでおすすめしません
- 次に挙げるもの
物理カメラを無効化
ls /dev/video*
して出てきたビデオデバイスを、必要に応じて無効化します。
これをしないと、映像を止めた隙に顔バレします。ご注意下さい。
仮想カメラ (映像のために必要)
上記を参考に、
# インストール
sudo apt install v4l2loopback-dkms v4l2loopback-utils
# /dev/video10 を生成
sudo /usr/sbin/modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
このようにして、OBS Cam
という名前で/dev/video10
を生成します。
仮想マイク (音声のために必要)
上記を参考に、
# 仮想マイクを作成
pactl load-module module-null-sink sink_name="virtual_speaker" sink_properties=device.description="virtual_speaker"
pactl load-module module-remap-source master="virtual_speaker.monitor" source_name="virtual_mic" source_properties=device.description="virtual_mic"
virtual_mic
という名前でマイクを生成します。
本番
1倍速以上でデコードできる動画を使うことをおすすめします。
まず、DiscordでVCに参加します。何をしても文句を言われない所にして下さい。
次に、先に何らかの動画を次のコマンドで再生します。
PULSE_SINK=virtual_speaker ffmpeg -re -i "video.mkv" -f v4l2 /dev/video10 -f pulse "stream name"
その後、Discord側で配信の設定を行います。
画像の通り、カメラをOBS Cam
に、マイクをvirtual_mic
にします。
また、同時に映像が反転していないことを確認してください。
音声に関しては、サブ垢を使うか同じチャンネルの別の人に確認してもらって下さい。
反転している場合の対処法は、後述します。
その後、ffmpeg
をCtrl+C
で止めてから再度再生すれば、映像を音声つきでDiscordに流すことができます。
その他
コマンドの説明
PULSE_SINK=virtual_speaker ffmpeg -re -i "video.mkv" -f v4l2 /dev/video10 -f pulse "stream name"
主要な部分だけ説明します。
-
PULSE_SINK=virtual_speaker
--- 出力先のマイクデバイスの指定 -
-re
--- リアルタイム出力。これがないと速度が無制限になるので、一瞬で終わる -
-f v4l2 /dev/video10
--- 映像の出力先の指定 -
-f pulse "stream name"
--- 音声の出力先の指定。stream name
はよく分からない
なお出力を同時に2つ指定していますが、これでも問題は無いようです。
反転してしまう場合
ffmpegが映像をV4L2に入力する際、場合によっては左右反転する場合があるので、そのときは-vf hflip
をV4L2の出力に追加して下さい。
他の反転は上記のURLを参照して下さい。
おわりに
以上の方法で、DiscordのVCに動画と音声の両方を流すことができます。
...というかこれってBotでやるべきだと思うんですけど