セミナー動画からスライドを抽出する
scripts/ には、同じ機能を持つ2つのツールが格納されています:
| スクリプト | 使用環境 |
|---|---|
scripts/extract_slides.sh | Linux、macOS、Git Bash、Windows上のWSL |
scripts/extract_slides.ps1 | Windows PowerShell(bash不要) |
scripts/slides.tex | Beamerテンプレート。スクリプトがフレームフォルダにコピーします |
仕組み: yt-dlp が動画ストリームのみをダウンロードします(音声なし、最大1080p)。ffmpeg が 1フレーム/秒でサンプリングし、最初のフレームおよびシーンチェンジスコアが閾値を超えたフレームを保持します。これにより、保持された各フレームは新しいスライドまたは新しいビルドステップとなります。showinfo ログから各フレームの動画時間が取得されます。出力フォルダには以下のファイルが作成されます:
slide_001.png、slide_002.png、... : スライド変更ごとに1枚ずつtimestamps.txt: 各フレームの動画時間(秒単位)frame_list.texおよびslides.tex:pdflatex slides.texにより、各スライドの下に動画時間(h:mm:ss)が表示されたPDFが生成されます
手順
-
ツールを確認する。
ffmpeg -versionとyt-dlp --versionを実行します。いずれかが不足している場合は、下記の手順でインストールするか、ユーザーにインストール方法を伝えてください。ローカルファイルの場合は yt-dlp は不要です。 -
プラットフォームに応じたスクリプトを選択する。 Windows では、ユーザーが明らかに Git Bash や WSL を使用していない限り、PowerShell スクリプトを使用します。
-
スクリプトを実行する。 ユーザーから指定されたURLまたはファイルに対して、スキルフォルダの外に、講演名を付けたフォルダ(例:
-o speaker_topic_frames)を作成して実行します。bash scripts/extract_slides.sh -u "https://www.youtube.com/watch?v=ID" -o talk_frames bash scripts/extract_slides.sh -i "recording.mp4" -o talk_framespowershell -ExecutionPolicy Bypass -File scripts\extract_slides.ps1 -Url "https://www.youtube.com/watch?v=ID" -OutDir talk_frames powershell -ExecutionPolicy Bypass -File scripts\extract_slides.ps1 -InputFile "C:\path\to\recording.mp4" -OutDir talk_frames-ExecutionPolicy Bypassは、その実行に限りWindowsのスクリプト実行ポリシーによるブロックを回避します。 -
フレームを確認する。 いくつかのPNG(最初、中間、最後)を開いて以下の点をチェックします:
- スライド横のWebカメラやスピーカー表示: スピーカーの動きが誤ったスライド変更を引き起こします。いずれかのフレームでスライド領域を見つけ、クロップ指定
-c W:H:X:Y/-Crop W:H:X:Y(ffmpeg クロップ構文: 幅、高さ、左上隅のX、Y座標)を付けて再実行します。 - フレームが少なすぎる(ビルドや小さな変更を見逃している場合): 閾値を下げて
-t 0.05/-Threshold 0.05で再実行します。 - フレームが多すぎる(動画、アニメーション、カメラノイズ): 閾値を
0.2~0.3に上げるか、クロップします。 - 重複: 余分なPNGとそれに対応する
frame_list.texの行を削除します。
- スライド横のWebカメラやスピーカー表示: スピーカーの動きが誤ったスライド変更を引き起こします。いずれかのフレームでスライド領域を見つけ、クロップ指定
-
PDFをビルドする(必要な場合)。 出力フォルダに移動し、
pdflatex slides.tex(またはlatexmk -pdf slides.tex)を実行します。 -
結果を報告する。 フレーム数、出力フォルダ、PDF、およびユーザーに残された作業(例えば意図的に残した重複フレーム)を伝えます。
オプション
| bash | PowerShell | 意味 | デフォルト値 |
|---|---|---|---|
-u URL | -Url URL | ダウンロードする動画のURL(yt-dlpがサポートする任意のサイト) | |
-i FILE | -InputFile FILE | ダウンロードではなくローカル動画ファイルを使用 | |
-o DIR | -OutDir DIR | 出力フォルダ | video_frames |
-t X | -Threshold X | シーンチェンジの閾値(0~1) | 0.10 |
-c W:H:X:Y | -Crop W:H:X:Y | スライド領域にクロップ | なし |
-b NAME | -Browser NAME | このブラウザのログインCookieを使用(chrome、firefox、edgeなど) | なし |
ツールのインストール方法
- Windows:
winget install --id yt-dlp.yt-dlpとwinget install --id Gyan.FFmpegを実行し、PowerShellを閉じて再度開くことでパスが通ります。 - macOS:
brew install yt-dlp ffmpeg - Linux:
sudo apt install ffmpeg(またはディストリビューションに応じたコマンド)とpip install -U yt-dlp - LaTeX(PDF生成にのみ必要): TeX Live または MiKTeX。MiKTeX の
latexmkは Perl が必要です。単体のpdflatexは不要です。
トラブルシューティング
- ログインが必要な録画(Panopto、Zoomクラウド、大学のポータルなど):
-b chrome/-Browser chrome(またはユーザーがログインしているブラウザ)を指定します。それでもyt-dlpが取得できない場合は、ユーザーに動画をダウンロードしてもらい、-iを使用するよう依頼します。 - Git Bashで
$'\r': command not foundまたはpipefail: invalid option nameが表示される:.shファイルがWindowsの改行コードを使用しています。sed -i 's/\r$//' scripts/extract_slides.shを一度実行してください。 - YouTubeでyt-dlpエラー(「Sign in to confirm」、フォーマットエラー): まず
yt-dlp -Uまたはpip install -U yt-dlpでアップデートしてください。これによりほとんどの問題は解決します。 - 動画ホストにネットワーク接続できない(サンドボックス環境やクラウドセッション): その旨を伝え、ユーザーが自身のマシンで実行するためのコマンドを提示します。
ユーザーがアクセスを許可されている録画のみを取得し、講演のライセンスに別段の定めがない限り、フレームはユーザー自身のノートや学習用に保持してください。