汎用性の高い動画ダウンロードスクリプト"youtube-dl"の使い方

たくさんの対応サイトからゴニョゴニョしたりゴニョゴニョする方法をメモ。

注意事項

・全て自己責任でお願いします。
・法律や規約に触れることはしないようにしましょう。
・公式ドキュメント:https://github.com/rg3/youtube-dl/blob/master/README.mdにとっても丁寧に使い方が載ってるので必ず目を通しておきましょう。

必要なもの

Microsoft Visual C++ 2010 Redistributable Package (x86)が入ってなければhttps://www.microsoft.com/en-US/download/details.aspx?id=5555からDLしてインストール
https://github.com/rg3/youtube-dl/releases/から最新版の"youtube-dl.exe"をDL
https://ffmpeg.zeranoe.com/builds/ からffmpeg公式の最新版バイナリを入手(Version:お好きな方をどうぞ,Architecture:OSに合わせる,Linking:お好みで→Download FFmpeg)(これがないとMPEG-DASHを使用しているYouTubeなんかは720pまでしかDL出来ない。ffmpegを置いておくとそれを使ってmixしてくれる。)
nyanshiba.hatenablog.com

基本的な使い方

youtube_dl(このフォルダは管理者権限の必要ないディレクトリに配置すること)
┣(デフォルトではここに動画ファイルが保存される)
┣ffmpeg.exe
┗youtube-dl.exe

テキストエディタ等で以下の内容を記述,拡張子.batで"youtube-dl.exe"と同じディレクトリに保存。
バッチファイルを"youtube-dl.bat"という名前にする場合,また"youtube-dl.exe"とは別のディレクトリに配置する場合はyoutube-dlではなく完全なパス("C:\hoge\youtube-dl.exe"みたいな)を入力しないと"youtube-dl.exe"ではなく自分"youtube-dl.bat"を呼び出してしまうので注意。

youtube-dl "動画サイトのURL"
pause

youtube-dl.batをダブルクリックで実行。上手くいかない場合はエラー内容が表示される。
③ログインしろみたいに言われた場合

youtube-dl" -u "ID(メールアドレスとか)" -p "パスワード" "動画サイトのURL"

使いやすくしたバッチ

参考までに。

@echo off
rem ====================環境変数設定====================
rem youtube-dl.exeのパス
set "ytdl_path=C:\DTV\bin\youtube-dl.exe"
rem ffmpeg.exeがあるディレクトリのパス
set "ff_dir=C:\DTV\ffmpeg"
rem vlc.exeのパス
set vlc_path=
rem 出力フォルダのパス
set "out_dir=C:\Users\sbn\Desktop\youtube_dl"
rem ====================ユーザ選択====================
set /p ask_exe=ffmpegかyoutube-dlか選択[m=ffmpeg(m3u8),t=ffmpeg(TwitCasting),Enter=youtube-dl]:
if "%ask_exe%" == "m" (
call :ffmpeg_m3u8
) else if "%ask_exe%" == "t" (
call :ffmpeg_twitcas
) else if "%ask_exe%" == "" (
call :youtubedl
)
pause
exit
rem ====================ffmpegサブルーチン====================
rem ----------m3u8ストリーム録画----------
:ffmpeg_m3u8
call :mydateset
set /p url=m3u8のurlを入力:
"%ff_dir%\ffmpeg.exe" -y -i "%url%" -c copy -map p:0 "%out_dir%\%mydate%.ts"
exit /b
rem ----------ツイキャス録画----------
:ffmpeg_twitcas
call :mydateset
set /p twitcas_id=ツイキャスIDを入力:
"%ff_dir%\ffmpeg.exe" -y -i "http://twitcasting.tv/%twitcas_id%/metastream.m3u8/?video=1" -c copy -map p:0 "%out_dir%\%mydate%_%twitcas_id::=_%.mp4"
exit /b
rem ----------ファイル名関数----------
:mydateset
rem yyMMdd_Hmm
rem 自分用(17/08/30 (水) 17:35->170830_1735)
set mydate=%date:~0,2%%date:~3,2%%date:~6,2%_%time:~0,2%%time:~3,2%
rem 初期設定(2017/08/30 17:35 -> 170830_1735)
rem set mydate=%date:~2,2%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%
rem スペースを0に置き換える
set mydate=%mydate: =0%
exit /b
rem ====================youtube-dl+ffmpegサブルーチン====================
:youtubedl
rem ----------ログイン選択----------
set /p url=urlを入力:
set /p ask_login=ログイン選択[n=ニコニコ動画,n2=ニコニコ動画,t=twitter,Enter=ログイン不要]:
if "%ask_login%" == "n" (
set "arg_u=-u hoge -p hoge"
) else if "%ask_login%" == "n2" (
set "arg_u=-u hoge -p hoge"
) else if "%ask_login%" == "t" (
set "arg_u=-u hoge -p hoge"
) else if "%ask_login%" == "" (
set arg_u=
)
rem ----------入力フォーマット----------
set /p ask_infmt=入力フォーマット[o=bestaudio,a=m4a/bestaudio,v=bestvideo,h=mp4/bestvideo,22=format22(hd720p yt),al=ytlive音声コンテンツ(Enter+最後にffmpegで動画からaacを作成),Enter=best]:
if "%ask_infmt%" == "o" (
set arg_f=-f bestaudio
) else if "%ask_infmt%" == "a" (
set arg_f=-f m4a/bestaudio
) else if "%ask_infmt%" == "w" (
rem set "arg_f=-f bestvideo^[height^<^=^?4320^]"
set "arg_f=-f bestvideo"
) else if "%ask_infmt%" == "22" (
set arg_f=-f 22
) else if "%ask_infmt%" == "al" (
set ask_split=1
) else if "%ask_infmt%" == "" (
set arg_f=
)
rem ----------出力フォーマット----------
set /p ask_outfmt=出力フォーマット[f=ffplay,v=vlc,Enter=DL]:
if "%ask_outfmt%" == "f" (
set "arg_o=- | "%ff_dir%\ffplay.exe" -"
) else if "%ask_outfmt%" == "v" (
set "arg_o=- | "%vlc_path%" -"
) else if "%ask_outfmt%" == "" (
set arg_o="%out_dir%\%%(title)s-%%(id)s.%%(ext)s"
)
rem ----------エンコ----------
rem "--no-part"でtempを作成しない(YouTubeLive、その他リアルタイムストリームに対応)
rem YouTubeLiveは放送が終われば強制終了しておk
"%ytdl_path%" --ffmpeg-location "%ff_dir%\ffmpeg.exe" %arg_u% %arg_f% --no-check-certificate --no-part "%url%" -o %arg_o%
rem 音声スプリット
if "%ask_sprit%" equ "1" (
rem "%ff_dir%\ffmpeg.exe" -i %1 -vn -c:a copy "out.m4a"
)
exit /b
view raw youtube-dl.bat hosted with ❤ by GitHub

上の4つのsetを自分の環境に合わせる。

m3u8かtwitcasting生放送か通常を選択[m=m3u8,t=twitcasting,Enter=youtube-dl]:以下3つに分岐する。
mを入力した場合:m3u8のURLを入力:m3u8のURLが分かればそれを入力する。ffmpeg.exeのみで処理。
tを入力した場合:ツイキャスIDを入力:放送ページのURLにある。http://twitcasting.tv/%TWIID%/metastream.m3u8/?video=1に補完される。キャスアカウントの場合c:を忘れずに。ffmpeg.exeのみで処理。
・Enterキーを押した場合:URLを入力:DLしたい動画のURLを指定。youtube-dl.exeとffmpeg.exeで処理。

ログインが必要なサイトの場合指定[n=ニコニコ動画,Enter=ログイン不要]:例にならって予め指定しておくこと。

フォーマットを指定[a=bestaudio,v=bestvideo,hd=youtube720p,fhd=youtube1080p,,22=フォーマット22(hd720),Enter=デフォルト(best)]:
a最高品質の音声のみ(MPEG-DASHの動画にのみ使える)
v最高品質の映像のみ(MPEG-DASHの動画にのみ使える)
hdYouTubeにおいて720p以上の最高品質の映像+最高品質の音声
fhdYouTubeにおいて1080p以上の最高品質の映像+最高品質の音声
22YouTubeにおいて720pのMPEG-DASHでない(映像と音声がくっついた)ファイルを指定
・Enter 通常はこちらを使う。YouTubeにおいては最高品質が得られない場合があるが,ffplay等でストリーミングしたり旧CPU低スペの場合はこちらを選択

出力先を指定[f=ffplay,p=ffplaypp,l=ffplayL,r=ffplayR,v=vlc,Enter=DL]:
fffmpeg.exeがあるフォルダのパスにあるffplayにパイプ出力しストリーミング
pffplayでストリーミング時にpp=acフィルタを使ってデノイズデブロッキング(負荷あり)
l rそれぞれffplayでストリーミング時に音声を片方からのみ出力する。同時に2つ並べて視聴する際に便利。
vvlc.exeがあるフォルダのパスにあるvlcにパイプ出力しストリーミング
・Enter 通常はこちらを使う。フォーマット指定でhdfhd等を選択している場合もこちらを選択。

:mytimeset
set mydate=%date:/=%
set mydate=%mydate:~0,6%
set mytime=%time:~0,2%%time:~3,2%%time:~6,2%
set mytime=%mytime: =0%

環境によって違うかもしれないので注意。

-oの既定値は%(title)s-%(id)s.%(ext)s。バッチ内なので通常の環境変数%1つで囲んだままにし,youtube-dlのオプションは%%%にしてエスケープする。お好みにに指定して下さい。

おまけ

音声の分離(出力ファイルの拡張子はファイルタイプによって変える。aacなら.m4a,opusなら.opus)

ffmpeg -i input.mp4 -c:a copy -vn out.m4a
ffmpeg -i input.webm -c:a copy -vn out.opus

映像の分離

ffmpeg -i input.mp4 -c:v copy -an out.mp4

-f bestaudioでDLした音声ファイルが.webmだった場合

ffmpeg -i input.webm -c copy out.opus

vp9なwebmをh264なmp4にできるだけ無劣化で変換

ffmpeg -i input.webm -c:v h264_qsv -q:v 0 out.mp4

avi+wav無劣化変換

ffmpeg -i input.webm -c:v rawvideo -c:a pcm_s16le out.avi

おわりに

このツールをつくって下さったRicardo García氏に感謝します。