무인 일지01

영상 한 편을 2분 20초
만드는 파이프라인

편집 프로그램 없이 스크립트로 릴스를 만듭니다. 저작권에 안 걸리는 소재를 고르는 것부터 음악을 붙이는 것까지, 순서대로 적었습니다. 그대로 따라 하면 돌아갑니다.

먼저 알아둘 것. 이 방식의 핵심은 편집 실력이 아니라 저작권이 확인된 소재만 자동으로 걸러내는 규칙입니다. 여기가 무너지면 나머지는 의미가 없습니다.

1. 소재 — 저작권이 확인된 것만 고른다

유튜브에는 업로더가 직접 거는 크리에이티브 커먼즈 저작자표시(CC BY) 라이선스가 있습니다. 검색 단계에서 이것만 남기면 소재 풀 자체가 안전해집니다.

유튜브 사이트에서도 됩니다. 검색 후 필터 → 기능 → 크리에이티브 커먼즈. 자동화하려면 Data API에 파라미터 하나만 더 붙이면 됩니다.

GET https://www.googleapis.com/youtube/v3/search
  ?part=snippet
  &q=AI+automation
  &type=video
  &order=viewCount
  &videoLicense=creativeCommon      <-- 이 줄이 전부입니다
  &publishedAfter=2026-01-01T00:00:00Z
  &key=YOUR_KEY

검색만 믿으면 안 됩니다

검색 필터를 통과해도 개별 영상을 한 번 더 확인하세요. videos 엔드포인트의 status.license 값이 creativeCommon 인 것만 남깁니다.

GET .../videos?part=status,statistics&id=VIDEO_ID
→ status.license == "creativeCommon"  이면 통과
→ "youtube"  이면 표준 저작권. 버립니다.
여기서 가장 중요한 경고. CC 표기는 업로더가 스스로 건 것입니다. 남의 영상을 퍼와서 CC를 걸어둔 채널이 실제로 있습니다. 그런 걸 쓰면 우리가 침해자가 됩니다. 채널을 열어 자기 영상을 올리는 곳인지 눈으로 확인하고, 의심되면 그냥 버리세요. 소재는 얼마든지 있습니다.

2. 내용 — 자막으로 고른다

영상을 다 보고 있을 수 없습니다. 자막을 받아서 어디를 쓸지 정합니다. 제목만 보고 내용을 단정하면 틀린 소개를 하게 됩니다.

pip install youtube-transcript-api

from youtube_transcript_api import YouTubeTranscriptApi
segs = list(YouTubeTranscriptApi().fetch(VIDEO_ID))
# segs[i].start / .duration / .text

자막 전문을 LLM에 넣고 "가장 보여줄 만한 5초 구간의 시작 시각"을 받아옵니다. 키워드 개수로 고르면 "타임스탬프는 아래에 있습니다" 같은 데가 뽑힙니다. 직접 해봤고 실패했습니다.

3. 클립 — 필요한 구간만 받는다

영상 전체를 받을 이유가 없습니다. 구간만 잘라서 받으면 5초짜리가 1초 만에 떨어집니다.

yt-dlp --no-playlist -f "b[ext=mp4][height<=720]/b" \
  --download-sections "*180-185" \
  -o "clip.%(ext)s" "https://www.youtube.com/watch?v=VIDEO_ID"

4. 화면 — 9:16으로 앉힌다

가로 영상을 세로에 억지로 꽉 채우면 얼굴이 잘립니다. 위쪽에 얹고 아래를 자막 자리로 비우는 게 낫습니다.

ffmpeg -i clip.mp4 -vf "scale=1080:-2,pad=1080:1920:0:430:color=#08080A" -an stage.mp4
항목이유
해상도1080 x 1920릴스 규격
프레임30fps파일이 가볍고 충분함
자막 위치상단 안전영역 아래하단은 앱 UI가 가림
컷 길이0.6 ~ 1.0초초반 3초를 넘기기 위해
한 화면 자막1줄, 10자 이내0.8초에 2줄은 못 읽음

5. 소리 — 두 가지를 반드시 지킨다

하나. 가져온 클립의 원본 소리는 반드시 죽입니다. CC BY는 영상에 걸린 것이지 그 안에 깔린 음악까지 CC인 게 아닙니다. 원본 소리를 실으면 플랫폼 음원 감지에 걸립니다.
둘. API로 발행하면 인스타그램 음원 라이브러리를 붙일 수 없습니다. 음악은 업로드 전에 영상 파일에 직접 섞어 넣어야 합니다.

그래서 저작권 없는 음원을 미리 모아둡니다. Openverse API에 license=cc0를 걸면 원본(Freesound 등)까지 자동으로 받을 수 있습니다.

GET https://api.openverse.org/v1/audio/?q=dark+electronic+loop&license=cc0

# 음량은 반드시 맞춥니다. 안 맞추면 어떤 건 안 들리고 어떤 건 찢어집니다.
ffmpeg -i bgm.mp3 -af "loudnorm=I=-14:TP=-1.5:LRA=11" -ar 48000 -ac 2 audio.wav
실패담 하나. 처음엔 음악을 직접 합성했습니다. 55Hz 서브 베이스 중심으로 짰더니 휴대폰 스피커에서 통째로 안 들렸습니다. 폰은 200~400Hz 아래를 거의 못 냅니다. 에너지를 300Hz~4kHz에 두세요. 그게 안 되면 그냥 CC0 실음원을 쓰는 게 낫습니다.

6. 조립과 인코딩

ffmpeg -framerate 30 -i frames/f%04d.jpg -i audio.wav \
  -c:v libx264 -preset slow -crf 19 -pix_fmt yuv420p \
  -c:a aac -b:a 192k -shortest -movflags +faststart out.mp4

-pix_fmt yuv420p+faststart 는 빼면 안 됩니다. 없으면 어떤 기기에서 재생이 안 되거나 로딩이 느립니다.

7. 하지 말아야 할 것

클립은 편당 3~4개, 하나당 5초 이내로 쓰고 나머지는 자기 편집으로 채우는 게 안전합니다.

정리

단계도구핵심
1 소재YouTube Data APIvideoLicense=creativeCommon
2 검증videos.status.license자칭이므로 채널도 확인
3 내용youtube-transcript-api제목 말고 자막으로 판단
4 클립yt-dlp--download-sections
5 화면ffmpeg1080x1920, 하단 비우기
6 소리Openverse CC0원본 음소거 + loudnorm

여기까지가 한 편입니다. 저희 기준으로 전 과정이 2분 20초 걸렸고, 추가 비용은 들지 않았습니다.