YoutubeLiveを音声のみで視聴する試み

Youtubeの動画には音声のみのストリームがあるのでこれをダウンロードしてpodcast的に聞いたりすることがあるのですが，YoutubeLiveには音声のみのストリームはないようです．

Youtube動画

$ youtube-dl --ignore-config -F https://www.youtube.com/watch?v=PNWQvqUUHbQ
PNWQvqUUHbQ: Downloading webpage
PNWQvqUUHbQ: Downloading MPD manifest
[info] Available formats for PNWQvqUUHbQ:
format code extension resolution note
251 webm audio only DASH audio 3k , webm_dash container, opus @160k (48000Hz)
139 m4a audio only DASH audio 49k , m4a_dash container, mp4a.40.5@ 48k (22050Hz)
140 m4a audio only DASH audio 130k , m4a_dash container, mp4a.40.2@128k (44100Hz)
278 webm 256x144 DASH video 95k , webm_dash container, vp9, 30fps, video only
160 mp4 256x144 DASH video 108k , mp4_dash container, avc1.4d400b, 30fps, video only
242 webm 426x240 DASH video 220k , webm_dash container, vp9, 30fps, video only
133 mp4 426x240 DASH video 242k , mp4_dash container, avc1.4d400c, 30fps, video only
243 webm 640x360 DASH video 405k , webm_dash container, vp9, 30fps, video only
134 mp4 640x360 DASH video 463k , mp4_dash container, avc1.4d401e, 30fps, video only
244 webm 854x480 DASH video 752k , webm_dash container, vp9, 30fps, video only
135 mp4 854x480 DASH video 1155k , mp4_dash container, avc1.4d4014, 30fps, video only
247 webm 1280x720 DASH video 1505k , webm_dash container, vp9, 30fps, video only
136 mp4 1280x720 DASH video 2007k , mp4_dash container, avc1.4d401f, 30fps, video only
18 mp4 640x360 360p 494k , avc1.42001E, 30fps, mp4a.40.2@ 96k (44100Hz), 1.34MiB
22 mp4 1280x720 720p 1788k , avc1.64001F, 30fps, mp4a.40.2@192k (44100Hz) (best)

YoutubeLive

$ youtube-dl --ignore-config -F https://www.youtube.com/watch?v=XXXX-XXXXXX 2>/dev/null
XXXX-XXXXXX: Downloading webpage
XXXX-XXXXXX: Downloading m3u8 information
XXXX-XXXXXX: Downloading MPD manifest
[info] Available formats for XXXX-XXXXXX:
format code extension resolution note
91 mp4 256x144 HLS 197k , avc1.42c00b, 30.0fps, mp4a.40.5@ 48k
92 mp4 426x240 HLS 338k , avc1.4d4015, 30.0fps, mp4a.40.5@ 48k
93 mp4 640x360 HLS 829k , avc1.4d401e, 30.0fps, mp4a.40.2@128k
94 mp4 854x480 HLS 1380k , avc1.4d401f, 30.0fps, mp4a.40.2@128k
95 mp4 1280x720 HLS 2593k , avc1.4d401f, 30.0fps, mp4a.40.2@256k (best)

これをリモートサーバでaudioのみに変換してしまうと細い回線で音声だけ聞くことが出来るのではと試してみました．
(屋外移動中などに聞くのを想定)

YoutubeLiveのダウンロードには youtube-dl ，変換には ffmpeg を利用しました．

youtube-dl についてはこのあたりを参考にしてください．

youtube-dl

linux:youtube-dl [wiki.matoken.org]

細い不安定な回線でオンライン動画を視聴する試み | edocr

以下ではyoutube-dlで最低画質の動画(フォーマットコード91)の144p/48kな動画をダウンロードして標準出力に渡して，パイプでffmpegで受け取って音声だけ切り出して udp:1234 に配信しています．音質をあげたい場合は360pで128k，720pで256kのようなので対応の動画を選ぶと良いですね．

$ youtube-dl -f 91 $YOUTUBELIVEURL -o - | ffmpeg -i - -c:a copy -vn -f adts udp://127.0.0.1:1234

この状態で ffplay で受信して再生できました :)

$ ffplay udp://127.0.0.1:1234

リモートのVPSサーバとかでこれをやると外出先でMVNOの低速モードでの受信も問題なさそうです．
自分だけで聞く分にはこれでいいのですが，自分の配信したYoutubeLiveを多人数に音声を配信して聞いてもらいたいなどの場合には使えません．(他の人のものを勝手に不特定配信は駄目)

そこで Icecast2 に流すのも試してみました．
ほほ同じようにして流せました．PCとAndroid端末でモバイル回線の低速モードでも試してみたところ同時に視聴できました :)

$ youtube-dl --ignore-config -f 91 $YOUTUBELIVEURL -o - | ffmpeg -i - -c:a copy -vn -f adts -content_type audio/aac iceca
st://source:password@icecast2.example.org:8000/youtubelivetest

peeでデータを2つに分けてモニタしながらとかも

$ youtube-dl --ignore-config -f 91 $YOUTUBELIVEURL -o - | pee "ffplay -" "ffmpeg -i - -c:a copy -vn -f adts -content_type audio/aac iceca
st://source:password@icecast2.example.org:8000/youtubelivetest"

$ mpv http://icecast2.example.org:8000/youtubelivetest.m3u

Playing: http://icecast2.example.org:8000/youtubelivetest
(+) Audio --aid=1 (aac 2ch 48000Hz)
AO: [pulse] 48000Hz stereo 2ch float
A: 00:00:02 / 00:00:10 (24%) Cache: 7.9s/139KB
File tags:
icy-title:
A: 00:00:22 / 00:00:30 (75%) Cache: 7.1s/126KB

YoutbeLive，Icecast2と間にサービスを挟むと遅延はどんどん大きくなるので余裕があったらYoutubeLiveに流すのと同じマシンで直接icecast2に流したほうがいいでしょうね．

懸念点としてはYoutubeのシステム的にこの視聴方法で視聴者数や視聴時間に貢献できるのかというところ．とりあえずは家に帰ったらウェブブラウザ等で視聴し直したり，リモートサーバでウェブブラウザを起動してYoutubeLiveを再生してその音声を取り込んだりするか……．そうなってくるとOBS Studio等を使ったほうがわかりやすいかもしれないですね．

しかし，値段だけ考えると特定のサービスで容量を消費しないカウントフリー，エンタメフリーオプション等でYoutubeに対応したSIMを使うという手も使えそうです．
自分は意思が弱く利用サービスがカウントフリーのものに偏ったりしそうだし，通信を見られるのが嫌なので今のところ使う予定はないです．

クライアント環境

$ youtube-dl --version
2020.05.03
$ dpkg-query -W ffmpeg mpv
ffmpeg 7:4.2.2-1+b1
mpv 0.32.0-1
$ lsb_release -dr
Description: Debian GNU/Linux bullseye/sid
Release: unstable
$ uname -m
x86_64

Icecast2環境

$ youtube-dl --version
2020.05.03
$ dpkg-query -W ffmpeg icecast2
ffmpeg 7:4.1.4-1~deb10u1
icecast2 2.4.4-1
$ lsb_release -dr
Description: Debian GNU/Linux 10 (buster)
Release: 10
$ uname -m
x86_64