세미나 영상에서 슬라이드 추출하기
scripts/ 디렉토리에는 동일한 기능을 수행하는 두 가지 형태의 도구가 있습니다:
| 스크립트 | 사용 환경 |
|---|---|
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, ...: 슬라이드 변경당 하나씩timestamps.txt: 각 슬라이드의 비디오 시간(초 단위)frame_list.tex및slides.tex:pdflatex slides.tex실행 시 각 슬라이드 아래에h:mm:ss시간이 표시된 페이지가 생성됩니다
단계
-
도구 확인.
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를 열어(처음, 중간, 마지막) 다음을 확인합니다:
- 슬라이드 옆의 웹캠 또는 발표자 보기: 발표자의 움직임이 잘못된 슬라이드 변경을 유발합니다. 한 프레임에서 슬라이드 영역을 찾고 크롭 옵션으로 다시 실행합니다.
-c W:H:X:Y/-Crop W:H:X:Y(ffmpeg 크롭 문법: 너비, 높이, 그 다음 왼쪽 상단 모서리). - 프레임이 너무 적음 (빌드 단계나 작은 변경 누락): 임계값을 낮춰 다시 실행합니다.
-t 0.05/-Threshold 0.05. - 프레임이 너무 많음 (비디오, 애니메이션, 카메라 노이즈): 임계값을
0.2-0.3으로 높이거나 크롭합니다. - 중복: 추가 PNG와
frame_list.tex의 해당 줄을 삭제합니다.
- 슬라이드 옆의 웹캠 또는 발표자 보기: 발표자의 움직임이 잘못된 슬라이드 변경을 유발합니다. 한 프레임에서 슬라이드 영역을 찾고 크롭 옵션으로 다시 실행합니다.
-
PDF 생성 사용자가 원하는 경우: 출력 폴더로
cd한 후pdflatex slides.tex(또는latexmk -pdf slides.tex)를 실행합니다. -
보고 프레임 수, 출력 폴더, PDF, 그리고 사용자가 처리해야 할 사항(예: 의도적으로 유지한 중복 프레임 등)을 알려줍니다.
옵션
| bash | PowerShell | 의미 | 기본값 |
|---|---|---|---|
-u 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 | 이 브라우저의 로그인 쿠키 사용 (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로 대부분 해결됩니다. - 비디오 호스트에 네트워크 접근 불가 (샌드박스 또는 클라우드 세션): 그 사실을 알리고 사용자에게 자신의 머신에서 실행할 명령어를 제공합니다.
사용자가 접근할 수 있는 녹화만 가져오고, 토크의 라이선스가 달리 명시하지 않는 한 사용자의 메모와 학습 목적으로만 프레임을 보관하십시오.