Macでライブ配信を(予約)録画して保存 youtube-dl/ffmpeg【SHOWROOM】

コンピュータ関連
スポンサーリンク

実はちょっと前からShowroomで同時配信しているラジオ番組を視聴するようになりました。

しかしながら、
ふと気がつけば開始時間が過ぎてる!
ちょっと席を外したい!
途中で寝落ちした!

などなど、
あぁ録画して保存できれば楽なのになぁ」と思うこともしばしば。

ということで色々情報を収集しつつ、
録画予約を実現したので備忘録として記事にしてみます。

なお、ちょっと長くなったので記事はいくつかに分けて掲載します。

スポンサーリンク

SHOWROOMを録画するには

画面をキャプチャーするやり方もあります、がそれは他所に任せるとして、
本稿では youtube-dlffmpeg などを使って動画をダウンロード(正確にはストリーミングデータから動画ファイルを作成)していきます。

故にブラウザ上でレイヤーを重ねて表示されているエフェクトなどは録画されません。
純粋に動画部分のみです。

(作業環境:macOS 10.13.6 High Sierra)

1、まずは各種ツールを準備

Homebrewを使ってインストールしていきます。
インストールしていない場合はまずHomebrewをインストールしておいてください。

→ macOS用パッケージマネージャー「Homebrew
(インストール方法はリンク先にあります)

インストールできたら引き続きターミナルからffmpegyoutube-dlをインストールします。

ffmpegをインストール

FFmpegは動画と音声を記録・変換・再生するためのフリーソフトウェア。「ffmpeg
ターミナルから入力

brew install ffmpeg

youtube-dlをインストール

youtube-dlは動画共有サービスから動画のダウンロードや音声の抽出を行うコマンドラインプログラム。「youtube-dl
ターミナルから入力

brew install youtube-dl

これだけ。簡単。

2、youtube-dlを使って配信動画を録画する

使い方はいたってシンプル。
細かいことは割愛しますがものすごく簡単に録画できます。
ターミナルから

youtube-dl "ShowroomのURL"

と入力。これだけ。

その他サポートされてるサイトはこちらから確認できます。
youtubeはもちろん、dailymotion、vimeo、SNS系などもろもろ
youtube-dl Supported sites

オプションについては後に少しだけ紹介しますが、
詳しくはオフィシャルサイトから確認してください。

あるいは日本語で解説している他サイトでも確認できるかと思います。

スポンサーリンク

3、ffmpegを使ってダウンロード(録画)

単純に録画するだけならばffmpegだけでも出来ます。
とはいえ再生するプレイリストファイル(m3u8)のURLがわからなければいけないので、ブラウザの開発者ツールなどを使います。

例)Firefoxの場合
保存したいページを開いて再生を始め、
ツール > web開発 > ネットワーク

ネットワークツール

を開いて「XHR」でフィルタリングしたのち、表示されていくm3u8ファイルの一つを選びます。
m3u8 url

ヘッダーの要求URL(https://…chunklist_v2.m3u8)をコピーしたら

ffmpeg -i コピーしたURL -c:v copy -c:a aac -b:a 192k -aac_coder twoloop -movflags faststart ~/Desktop/output.ts

で保存できます。
エラーがでるので音声だけaacで再エンコードしています。

実際はyoutube-dlでもffmpegを呼び出して使っているので何か大きく変わるわけではないと思います。
使わないようにオプションで指定しない限りは。(たしかそんなんあった気がする)

という感じでどちらでも簡単に保存できるのですが、
実を言うとちょっとした心配事もあるのです。

404(403)エラーが出て録画停止!?

ごくたまに404エラー(ファイルが見つからない)が出て途中で録画失敗してしまうのです。正確には録画を途中で終えてしまう。
ブラウザで見ていればリロード(再読み込み)してまた見れるようになるのですが、URLが突然変えられる理由はよくわかりません。

またShowroomではないのですが他のサイトでは一定時間が経過した後に403エラー(Forbidden、禁止)で拒絶されてしまうケースがあるようです。こちらも想定した環境でのみ閲覧を許すと言う仕組みから。

スポンサーリンク

youtube-dlを再起動させてDL試行する自作コマンド

エラーが出た場合はyoutube-dlを再起動することでレジューム(切れたところから録画)できるようです。
ただしShowroomで出来るかは未検証。この辺はちょっと複雑な感じもするので別記事にもう少しまとめて見解書きます。

※追記:この問題に関して別記事にまとめました。

とりあえず途中で飛ぶ(一瞬フリーズする)のは発生しました。まぁこれは仕方ない。通信環境や負荷など様々な要因によって起こり得ます。
また、配信途中で突然リンクが切れて404を返してきたのち、尻切れで終了してしまうのも再現。
おそらく404で切れた後に、youtube-dlがそれを配信終了によるものと勘違いし、録画を終えてしまうのかなと。

とりあえず別のスクリプトを書いて一定回数試行してくれるものを用意してみます。

新規テキストファイルに記述

#!/bin/bash
RETRIES=0
until command youtube-dl "$@" || [ $RETRIES -eq 10 ]; do
   sleep 1
   let ++RETRIES
done

録画に失敗した時は1秒間だけ待機し、再度youtube-dlを実行します。
録画が成功するか試行回数が10回になったところで終了します。

ただし何らかの理由で配信開始時間が遅れた場合などでは、おそらく数十秒ほど試行した後に諦めてやめちゃいます。
単純にリトライの回数を増やすか、sleepの間隔を増やすことで全体の試行時間は広げられます。

追記

「試行回数が10回になったところで終了」の部分は変わりませんが、仮にコマンドが正常終了してもなお2回実行するように変えてみました。

#!/bin/bash
RETRIES=0
SCSS=0
FLG=false
until [ $SCSS -eq 3 ] || [ $RETRIES -eq 10 ]; do
	command youtube-dl "$@" && FLG=true
	$FLG && let ++SCSS || let RETRIES++
	sleep 1
done

美しくはありませんが、一応動作します。

実行権限を与える

とりあえずこれを「youtube-dler」とでも名付けて保存します。
場所はホームディレクトリに「mytools」というフォルダを作成し、その中に入れておくことにします。

/Users/ユーザ名/mytools/youtube-dler

次に実行権限を与えます。

chmod a+x /Users/ユーザ名/mytools/youtube-dler

どこからでも使える、というかいちいちパスを書くとか面倒くさいのでシンボリックリンクを使います。

ln -s /Users/ユーザ名/mytools/youtube-dler /usr/local/bin/

これで /usr/local/bin/ にシンボリックリンクが作られます。

使う際には単に

youtube-dler "ShowroomのURL"

と入力すればOK
これで録画開始に失敗しても設定した回数だけ試行してくれることになります。

スポンサーリンク

youtube-dlのオプションについて

コマンド入力の際に一緒に書いてもいいのですが、
とりあえずは共通した最低限のことだけでいいので設定ファイルを使うことにしました。

新規テキストファイルに記述

-o ~/Desktop/%(title)s.%(ext)s
--hls-use-mpegts
--no-mtime

/Users/ユーザ名/.config/youtube-dl
に「config」と言う名で保存。拡張子はいりません。

隠しファイル(フォルダ)を表示するにはFinderを開き cmd+Shift+.(ドット)を押すか、メニューの移動 > フォルダへ移動 から ~/.config/youtube-dl と入力すれば開けます。

オプションの内容としては、
-o 保存先はデスクトップ、
–hls-use-mpegts DL中でも中身が確認できるようにMPEG TS、
–no-mtime Last-Modifiedヘッダをファイルの更新日時に使わない、

さて、あとは指定した時間に実行できるようにするだけ。

その辺りは次の記事にて紹介します。

まとめ

とりあえず今回はストリーミングデータからmp4(動画)にする手順を紹介しました。

結構なサイトで「画面キャプチャ」のやり方やアプリを紹介しているみたいですが・・・そんなことがしたいわけじゃない!というのが実際のところじゃないでしょうか。

それじゃまるでTVのスピーカにマイクをあてて音楽を空気録音するようなもの。
お母さんの「ご飯よ〜」の声が高確率で入ってしまいます。(入りません)

そうではなくサーバからデータが送られて来ているのだからそれをファイルの形に残したい。
・・・ストリーミングであることはわかっている。
でも個人的にちょっと後から見返したいだけなんだ!

という想い(言い訳)を共有できる人は多いかと思います。
もちろん公衆送信などせずに個人的に楽しむだけに留めてください。

あと他のストリーミングサイトに関しては考えてないので言及しません。
でも応用はできるはず。

ということで次はスケジューラ(カレンダー)で録画予約できるようにしてみます。

カレンダーイベントの情報を読み取ってコマンド実行(第三弾)【Mac|AppleScript】
実現しようとしているのはネット配信番組の動画を予約録画すること。 そのスケジューラにはMac標準アプリのカレンダーを使用。 今回は「あらかじめ登録したイベント情報(URL)をAppleScriptで読み込む」ように改良してみました。

コメント

タイトルとURLをコピーしました