YouTube : してログ

iPhone によるスクリーンキャプチャ

機種替えなどで余っている iOS 端末があれば、標準機能である画面収録(スクリーンキャプチャ)をいつでも開始できるようにしておくと便利です。コントロールセンターに画面収録が無い場合は、設定>コントロールセンターから画面収録を表示アイコンに加えましょう。

画面の表示がそのままキャプチャされるため、お休みモードをオンにして、録画中は画面の向きが変わらないよう注意します。また、音量を完全にミュートしてしまうと無音になるので、周囲に音が聞こえないようにしたい場合でも最低レベルまでにします(この状態でも動画の音量は通常の大きさです)。

youtube-dl + FFmpeg の組み合わせ

コマンドラインプログラムであり、うまく使えば強力なツールです。そのためには、ある程度 YouTube の仕様と動画のフォーマットの知識が必要になります。

YouTube の場合、ライブ配信中 → 終了直後 → アーカイブ完了 の各段階で対応が変わってきます。ライブ配信中~終了直後は、HLS (HTTP Live Streaming) になっており、この段階でストリームキャプチャした場合が最も画質が高くなります。

ライブ配信中

ライブ中は HLS ストリームデータのみになります。ライブはアーカイブにならない可能性もあり、保険の意味でこの段階の早いうちにストリームキャプチャを開始したいところです。

なお、オプションで --hls-use-mpegts を使ってください。理由は、正常に終了しなかったライブなどで Ctrl+C で中断すると mp4 にリネームしても再生不能な動画になってしまう可能性が高いためです。

format code  extension  resolution note
91           mp4        256x144    HLS  197k , avc1.4d400c, 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)

具体的なコマンドは下記のとおりになります。

youtube-dl.exe --hls-use-mpegts https://www.youtube.com/watch?v=xxxxxxxxxxx

ライブ終了直後

ライブ終了直後から MPEG-DASH も選択可能になりますが、これは HLS とほぼ同等のデータと思われます。頭から保存したい場合で画質の劣化を抑えたい場合は、この段階が終了する前にダウンロードを開始しなければなりません。なお、ダウンロード開始していれば動画が削除されても最後まで受信できる可能性があります(たぶん)。

format code  extension  resolution note
139          m4a        audio only DASH audio   64k , m4a_dash container, mp4a.40.5@ 48k (24000Hz)
140          m4a        audio only DASH audio  144k , m4a_dash container, mp4a.40.2@128k (48000Hz)
160          mp4        256x144    DASH video  124k , mp4_dash container, avc1.4d400c, 30fps, video only
133          mp4        426x240    DASH video  258k , mp4_dash container, avc1.4d4015, 30fps, video only
134          mp4        640x360    DASH video  646k , mp4_dash container, avc1.4d401e, 30fps, video only
135          mp4        854x480    DASH video 1171k , mp4_dash container, avc1.4d401f, 30fps, video only
136          mp4        1280x720   DASH video 2326k , mp4_dash container, avc1.4d401f, 30fps, video only
91           mp4        256x144    HLS  197k , avc1.4d400c, 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)

コマンドでは --hls-use-mpegts を付けない方が良いと思います。付けた場合の MPEG-TS は再生時にシークなどが重くなる(ストリーミング再生に適したフォーマットでシークは苦手な)ためです。付けない場合 DASH が選択され(なぜか best が付くのは HLS ですが)ますし、HLS が選択された場合でも MPEG-4 AVC になります。

youtube-dl.exe https://www.youtube.com/watch?v=xxxxxxxxxxx

また、ライブ配信中はどうしても途中からの録画になってしまいますので、配信終了直後に再度ダウンロードするようなバッチファイルを作成しておくと便利です。

ytlive-dl.bat
youtube-dl.exe --hls-use-mpegts -o "[%(upload_date)s] %(title)s - %(id)s onlive.%(ext)s" https://www.youtube.com/watch?v=%1
youtube-dl.exe -o "[%(upload_date)s] %(title)s - %(id)s complete.%(ext)s" https://www.youtube.com/watch?v=%1

アーカイブ完了後

その後アーカイブ処理が行われ通常の動画扱いになりますが、この際に再エンコードが行われ画質低下があります。また HLS データは削除され MPEG-DASH は残ったように見えますが、これは再エンコードされたもののようです。再エンコード時には、解像度が標準と異なる場合はリサイズされ、最悪のケースでは黒ベタが付いて更に解像度が落ちるようです。

ちなみに、アーカイブ処理が終わるとデータコピーが行われるためか、YouTube サイト上で動画が2個あるような表示になります。この状態を目安にすれば、間もなくアーカイブ処理が終了することが判断できます。

format code  extension  resolution note
139          m4a        audio only DASH audio   51k , m4a_dash container, mp4a.40.5@ 48k (22050Hz), 3.72MiB
140          m4a        audio only DASH audio   98k , m4a_dash container, mp4a.40.2@128k (44100Hz), 7.42MiB
160          mp4        256x144    DASH video  108k , mp4_dash container, avc1.4d400b, 30fps, video only
133          mp4        426x240    DASH video  242k , mp4_dash container, avc1.4d400c, 30fps, video only
134          mp4        640x360    DASH video  637k , mp4_dash container, avc1.4d401e, 30fps, video only, 21.66MiB
135          mp4        854x480    DASH video 1155k , mp4_dash container, avc1.4d4014, 30fps, video only
136          mp4        1280x720   DASH video 2320k , mp4_dash container, avc1.4d401f, 30fps, video only, 86.31MiB
17           3gp        176x144    small , mp4v.20.3, mp4a.40.2@ 24k, 6.62MiB
36           3gp        320x180    small , mp4v.20.3, mp4a.40.2, 18.95MiB
18           mp4        640x360    medium , avc1.42001E, mp4a.40.2@ 96k, 36.35MiB
22           mp4        1280x720   hd720 , avc1.64001F, mp4a.40.2@192k (best)

アーカイブ後は通常の動画と同じコマンドです。

youtube-dl.exe https://www.youtube.com/watch?v=xxxxxxxxxxx

補足情報

youtube-dl はデフォルトでベストな動画を選択してダウンロードしようとしますが、必ずしもベスト(様々な要求があるので仕方ありませんが)ではありません。特に縦長の動画に対しては、解像度の低いフォーマットが選択されてしまう場合があるので注意が必要です。

自分でフォーマットを選択したい場合は、まず -F オプションを付けてフォーマットリストを取得します。その中から、ダウンロードしたいフォーマットの番号を確認して -f <フォーマット番号> と指定してダウンロードさせます。注意点としては、video only になっているフォーマットは、-f "137+140" のように audio only になっている音声フォーマットも選んでください。この時フォーマットを合わせないと mkv になりますので、mp4 なら m4a、webm なら揃えて選ぶと良いと思います。

毎回手動でフォーマットを選ぶのは現実的では無いので、アッパースクリプトで制御して自分にとって適切なフォーマットが選ばれるような対応した方がいいでしょう。フォーマットの選び方は、人それぞれ好みがあると思いますので、ここでは私の使っているロジックのみ紹介しておきます。

  1. youtube-dl -F でフォーマットリストを取得する
  2. ビデオフォーマットで面積を計算して一番大きいものを選択(mp4 や webm はどちらでもよいが、同じ解像度は mp4 を優先する)
  3. ビデオフォーマットが video only の場合は、オーディオフォーマットを選ぶ
  4. オーディオフォーマットはビットレートが一番大きいものを選択(ただしビデオフォーマットに合わせて mp4 / m4a、もしくは webm / webm の組み合わせ)
  5. 選定したフォーマットを指定してダウンロードを実行する

解像度を何よりも優先するのがポイントです。これで今のところ最高画質の動画が選ばれるはずです。ただし、アップロード者が YouTube の再エンコード処理の終了を待たずに動画を公開した場合、すべての解像度が揃っていない場合があります。これは判定が難しいので、アップロードして間もない動画で解像度が低い場合は、時間を置いてもう一度ダウンロードしてみることをお勧めします。

昨日から、“登録チャンネル”のフィードが更新され難くなっているようだ。全く更新されないのではなく、PCサイトがほとんど更新されず、スマホの方はある程度更新されるがすべてでは無い、という状況だ。また、サイトの通知で通知あっても、“登録チャンネル”のフィードではその動画が表示されていない。ちなみに、別のアカウントでは正常なように見えるが、アカウントを切り替えたりしても直ったりはしない。

Youtube は過去にもこのような不具合があったようで、「報告されている問題」に該当しそうな情報が掲載されている。これ、完全に修正されていないか、再発したのか、または新たな問題なのか、まったく分からんなぁ。巨大なシステムだと、複数のサーバーで負荷分散やフェイルオーバーしてるから、障害系からの同期やロールバックあたりで問題が起こってるんかなぁ。一応、ダッシュボードのところからフィードバックを送信してみたけど、後は待つしかないねぇ。