Communitygithub.com

인트로-아웃트로 추가

완성된 동영상에 사용자의 브랜드 인트로와 아웃트로를 삽입하고, 핸드헬드 휴대폰 영상에는 vid.stab 안정화를 적용하며, 동영상의 방향에 따라 16:9 또는 9:16 쌍을 선택하고 인트로에서 동영상, 동영상에서 아웃트로로 짧은 페이드 전환을 적용합니다. 또한 세로 동영상의 16:9 컷(흐린 배경 포함)을 제작합니다. "인트로 추가", "인트로와 아웃트로 넣기", "영상 브랜딩", "가로 버전 만들기", "YouTube용 최종 렌더링" 등에 사용하세요.

인트로-아웃트로 추가란 무엇인가요?

이 스킬은 완성된 동영상에 브랜드 인트로와 아웃트로를 추가하는 ffmpeg 기반 도구입니다. 각각 짧은 MP4와 자체 징글(jingle)로 구성된 오리엔테이션별 sting 쌍을 선호도(preferences)에서 불러와 사용합니다. 동영상 방향을 감지하여 적절한 sting을 선택하고, 동영상과 인트로/아웃트로를 크로스페이드로 부드럽게 연결하며 최종 파일을 렌더링합니다. 또한 원본 동영상의 방향과 관계없이 16:9 캔버스에 맞게 조정하고, 세로 동영상에 대해 흐릿하고 어두워진 배경 위에 중앙 정렬된 16:9 컷을 제작하는 기능도 포함합니다. 핸드헬드 휴대폰 영상의 경우 vid.stab을 사용한 이중 패스 안정화를 동일한 렌더링 과정 내에서 지원합니다. 전체 재인코딩이므로 Modal과 같은 원격 서버에서 실행하는 것이 좋습니다. 환경 변수, Modal 스크립트 경로, ffmpeg 필터 체인 등 세부 설정은 preferences에서 관리합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/danielrosehill/Remote-Video-Editing/tree/HEAD/skills/add-intro-outro

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

인트로와 아웃트로 추가

Sting은 각각 자체 징글이 포함된 짧은 MP4 파일이며, 오리엔테이션별로 한 쌍씩 preferences에 등록됩니다. 이 스킬은 모든 것을 하나의 형식으로 정규화하고, 인트로, 동영상, 아웃트로를 짧은 크로스페이드(비디오 및 오디오)로 연결한 후 결과물을 렌더링합니다.

Preferences

remote-video-editing/preferences.json (clean-voice-sidon과 동일한 조회 순서):

키의미
stings{"intro_16x9": url, "outro_16x9": url, "intro_9x16": url, "outro_9x16": url}; URL 또는 로컬 경로
sting_fade_s크로스페이드 길이, 기본값 0.5
render_notes긴 인코딩을 실행할 위치(예: 노트북 대신 서버)에 대한 지침. 이를 따르십시오.

stings가 설정되지 않은 경우 파일을 요청하십시오. 플러그인은 브랜드 자산을 포함하지 않습니다.

방향(Orientation)

코딩된 크기가 아닌 표시된 방향을 읽으십시오. 휴대폰은 세로 동영상을 회전 태그와 함께 1920x1080으로 저장합니다. 다음 명령으로 확인하십시오. ffprobe -v error -select_streams v:0 -show_entries stream=width,height:stream_side_data=rotation -of compact IN. 회전 값이 90 또는 -90이면 너비와 높이가 바뀝니다. ffmpeg는 디코딩 시 자동으로 회전을 적용합니다.

  • 세로(9:16) 동영상: intro_9x16 / outro_9x16 사용, 캔버스 1080x1920.
  • 가로: 16:9 쌍 사용, 캔버스 1920x1080.
  • 세로 동영상의 16:9 컷 (YouTube 메인 피드용): 캔버스 1920x1080, 동영상은 중앙에 1080 높이로 스케일링되고, 그 위에 흐릿하고 어두워지며 확대된 자체 복사본이 오버레이됩니다. 16:9 sting을 사용합니다. 아래의 [v1] 체인이 다음과 같이 대체됩니다:
    [1:v]fps=30,split[a][b];
    [a]scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,scale=480:270,boxblur=20:2,scale=1920:1080,eq=brightness=-0.06:saturation=0.9[bg];
    [b]scale=-2:1080[fg];[bg][fg]overlay=(W-w)/2:0,setsar=1,format=yuv420p[v1]
    
    8초 컷(-ss 60 -t 8)으로 테스트하고 전체를 렌더링하기 전에 한 프레임을 보여주십시오.

렌더링(Render)

W:H는 캔버스, F는 페이드(0.5), DI는 인트로 길이, DV는 동영상 길이(ffprobe format=duration)입니다. 오프셋: 첫 번째 페이드는 DI-F, 두 번째 페이드는 DI+DV-2*F입니다.

ffmpeg -y -i intro.mp4 -i main.mp4 -i outro.mp4 -filter_complex "
 [0:v]fps=30,scale=W:H,setsar=1,format=yuv420p[v0];
 [1:v]fps=30,scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p[v1];
 [2:v]fps=30,scale=W:H,setsar=1,format=yuv420p[v2];
 [0:a]aresample=48000,aformat=channel_layouts=stereo[a0];
 [1:a]aresample=48000,aformat=channel_layouts=stereo[a1];
 [2:a]aresample=48000,aformat=channel_layouts=stereo[a2];
 [v0][v1]xfade=transition=fade:duration=F:offset=DI-F[v01];
 [v01][v2]xfade=transition=fade:duration=F:offset=DI+DV-2*F[v];
 [a0][a1]acrossfade=d=F[a01];[a01][a2]acrossfade=d=F[a]" \
 -map "[v]" -map "[a]" -c:v libx264 -preset medium -crf 20 -maxrate 10M -bufsize 20M -c:a aac -b:a 192k -movflags +faststart out.mp4
  • 여러 소스 클립: 먼저 연결(동일한 필터 패턴 사용, 또는 코덱이 동일하면 concat 디먹서 사용)한 후 결과를 main.mp4로 취급합니다.
  • 이는 전체 재인코딩입니다. 10분 1080p 동영상의 경우 모든 코어를 몇 분간 사용합니다. 로컬이나 홈 서버가 아닌 Modal에서 실행하십시오. 입력(-filter_complex부터 +faststart까지) 뒤의 인수들을 render.args에 한 줄에 하나씩 넣고 다음을 실행하십시오: $MODAL run "${CLAUDE_PLUGIN_ROOT}/scripts/ffmpeg_modal.py" --inputs intro.mp4,main.mp4,outro.mp4 --args-file render.args --out out.mp4 (modal_command와 run_notes preference는 Modal이 실행되는 위치를 지정합니다). 여러 클립을 별도의 패스가 아닌 동일한 그래프(concat 필터)에서 연결하십시오. 작업 후에는 볼륨 video-editing-work의 작업 폴더를 삭제하십시오.
  • xfade는 두 입력이 동일한 시간 기준(timebase)을 가져야 합니다. 모든 비디오 브랜치( concat 이후 포함)에 fps=30,settb=1/30을 추가하지 않으면 ffmpeg가 "First input link main timebase (1/30) do not match" 오류로 실패합니다.
  • 비트레이트: 제한을 유지하십시오(-crf 20 -maxrate 10M -bufsize 20M). 노이즈가 많은 휴대폰 영상에 일반 CRF 18을 적용하면 24 Mbps, 11분에 약 2GB가 나왔습니다(2026-11-13). YouTube는 어차피 다시 인코딩하며 1080p 업로드에 8-12 Mbps를 권장합니다.
  • 확인: 출력 길이는 대략 DI + DV + DO - 2*F이며 DI-F/2(페이드 중간), 중간, 끝 지점의 프레임을 확인하십시오.

핸드헬드 영상: 동일 렌더링에서 안정화(stabilise)

핸드헬드로 촬영된 휴대폰 동영상은 가벼운 안정화가 유용합니다(사용자, 2026-11-13, 첫 Hebrish 주말 업데이트가 안정화 없이 배포된 후). ffmpeg의 vid.stab(libvidstab; Modal 이미지가 설치하는 Debian의 ffmpeg에 포함되어 있습니다. ffmpeg -filters | grep vidstab으로 확인). Modal에서 두 패스 모두 실행:

  1. 검출(Detect) (빠름, 분석 전용, 변환 파일 기록), 소스 클립별로: ffmpeg -i main.mp4 -vf vidstabdetect=shakiness=5:accuracy=15:result=main.trf -f null - 자체 ffmpeg_modal.py 작업으로 실행하거나(args -vf / vidstabdetect=...:result=/work/<job>/main.trf / -f / null, 출력 -), 스크립트에 검출 단계를 추가하십시오. .trf 파일은 입력 파일과 같은 볼륨 디렉토리에 있어야 합니다.
  2. 변환(Transform) 은 메인 렌더링 내에서, 해당 클립의 비디오 브랜치 맨 처음(등급 조정 및 스케일링 전): vidstabtransform=input=main.trf:smoothing=20:zoom=2:optzoom=0,unsharp=5:5:0.4 smoothing은 15-30(프레임) 정도가 자연스러운 움직임을 유지합니다. zoom=2(퍼센트)는 움직이는 테두리를 숨기면서, 말하는 사람 영상에서 optzoom=1이 유발하는 펌핑 현상을 방지합니다. 가벼운 언샤프(unsharp)가 리샘플링으로 인한 부드러움을 보정합니다.

전체 렌더링 전에 8초 컷으로 먼저 테스트하고 사용자에게 정지 프레임과 짧은 클립을 보여주십시오. libvidstab이 없는 경우 deshake가 단일 패스 대체 수단(더 약함)입니다. 이 용도에 AI 안정화는 필요하지 않습니다.

Sting 제작

사용 중인 sting은 작은 Pillow 스크립트와 생성된 징글로 브랜드 SVG에서 렌더링되었습니다. find-script로 찾으십시오(태그 logo, sting, intro). 동영상 모델로 로고를 재생성하지 마십시오. 동영상 모델은 문자 형태를 왜곡합니다.

관련 스킬