せや!結局は`streamlink`で`ffmpeg`を使えばええ!

準備

ffmpegstreamlinkが依存してる)とstreamlinkbrewで入れる

formulae.brew.sh

formulae.brew.sh

brew install ffmpeg

brew install streamlink

以下の通り環境変数PATHffmpegがないと死なので確認する

man streamlink
...
 FFmpeg options

       --ffmpeg-ffmpeg FILENAME
              FFMPEG is used to access or mux separate video and audio streams. You can specify the location of the
              ffmpeg executable if it is not in your PATH.

              Example: "/usr/local/bin/ffmpeg"
...

使い方

hlsでも非hlsでも大丈夫

  1. 対象のwebサービスに行って動画を再生して
  2. 「webインスベクタ」を表示,「ネットワーク」を表示
  3. 頑張って拡張子が.m3u8.mp4のファイルを検索
  4. 前者がhls,後者が非hls
  5. そのファイルを落とした時のcURLをコピー
  6. cURLから標準urlだけを抽出
  7. streamlink '[url]' best -o temp
  8. ffmpeg -i tmp -c copy file.mp4

何が起きてるか

streaming系サービスでのhttp通信をうまいこと管理して,hls処理ができるffmpegに渡してくれてる
ffmpegに不足してるhttp管理機能とcurlに不足してるhls処理機能を両立してくれてこれは…ありがたい

細かいオプション

ffmpeg.org

streamlink.github.io

ニコ動のオプション機能でログイン可能とかセッションID持ち込みとかあったりするらしいな

利点!

独立してセッションを構築してくれるからクッソ楽
もしそれができない事情があるなら適宜にhttpのヘッダ情報を引数で渡せば良いので問題はない

欠点?

処理をせず.m3u8+.tsの形式に落とすのは想定外の動作
hlsだと.mp4になったりならなかったりするのでもっかいffmpegをかける習慣をつけよう
まぁ変換前の形式で落とす必要性もなさそうだし,なんならhlsへの変換もやれるっぽいし(今回はそこには触れないけど)