
엑셀로 영상을 편집한다?
숫자를 계산하는 용도인 엑셀로 동영상을 편집한다니
말도 안되는 이야기처럼 보이지만
아래처럼 영상의 시간을 입력해서 영상을 규칙적으로 자르고 일정 부분을 추출해서 최종 영상으로 합칠 수 있습니다.

특히 고프로나 DJI Action, AcePro , Insta360 등 액션카메라나 휴대폰으로 촬영한 몇시간짜리 긴 영상이 있을 때
프리미어나 다빈치 리졸브, 파이널컷, 캡컷, 샷컷 등의 영상 편집프로그램을 이용하지 않고
전체 영상을 2분마다 3초씩 추출해서 하나의 랜덤 기록 영상을 만들고 싶을 때 이용하면 효과적입니다.
물론 엑셀에서 영상을 직접 편집하는 것은 아니고
FFMPEG 이라는 커맨드라인 프로그램에 명령을 보내서 처리합니다.
https://www.ffmpeg.org/download.html
엑셀 VBA는 중간에서 FFMPEG에 보낼 명령어를 생성해서
순차적으로 보내주는 역할을 수행합니다.

활용 순서:
1. RandCut1.xlsm 을 다운로드 받아 파일 속성에서 차단해제하고 나서 열 때 매크로를 허용합니다.

2. 동영상 파일을 한 폴더에 모두 집어 넣습니다. 파일명이 시간 순서로 정렬되어 있어야 합니다.
3. 고프로 영상의 경우 파일순서가 섞일 수 있으므로 Rename 탭에서 파일 이름을 변경합니다.
Get Folder 버튼을 누르고 폴더 안에 들어가서 확인을 누르면
폴더내의 영상에 대한 미디어정보와 변경될 파일명이 뜨는데 이 때 Rename Files버튼을 눌러 파일명을 시간순서대로 정렬합니다.

4. Config탭에서 환경을 설정합니다.
FFMPEG.EXE의 위치를 C:\FFMPEG\ffmpeg.exe 과 같이 입력합니다.
각 영상 미리보기용 프로그램의 위치를 C:\DaumPot\PotPlayer17\PotPlayerMini64.exe 과 같이 입력합니다.
A열의 시간들은 각 영상을 1차적으로 나눌 시간 길이목록입니다.
B열의 시간들은 1차적으로 나눈 영상에서 최초 가져올 시간길이 목록입니다.
이 시간 목록들이 나중에 기본으로 뜨게 되는 시간들입니다. 처음에는 안건드려도 됩니다.

5. RandCut 탭을 선택합니다. GetFolder 를 누르고 영상이 들어 있는 폴더 안으로 들어가서 '확인'을 누릅니다.

파일명과 간단한 미디어정보를 불러옵니다.
6. 타이틀 제목 영상 삽입 여부를 선택합니다.
타이틀 영상은 해당 폴더명을 검은 배경위에 띄운 단순한 짧은 타이틀 영상입니다. (FFMPEG을 이용합니다.)

7. 영상 썸네일을 생성 여부를 선택합니다. 영상이 많으면 작업시간이 좀 걸립니다.

8. F2와 G2셀에 전체적인 1차 분할시간과 2차 추출시간을 설정합니다.
1차 분할시간 마다 영상을 나눈 다음 초반의 2차 추출시간만큼 영상을 추출하는 규칙입니다.
만약 00:02:00 과 0:00:02 라면 2분마다 초반 2초를 추출합니다.
이 설정은 글로벌 설정으로 각 영상에 특수한 분할시간이 지정되지 않은 한 항상 규칙대로 영상을 추출합니다.

9. 각 영상의 썸네일을 클릭해서 영상 내용을 확인하고 각 영상에 특별한 시간 설정이 필요한 경우 오른쪽에 개별 시간을 설정합니다.
예를 들어 7행의 영상은 매 30초마다 초반 5초의 영상을 추출합니다.
타이틀 영상은 기본 2차 추출 시간만큼의 길이로 자동 생성됩니다.
여러셀을 선택한 상태에서 시간을 한 번 설정하면 선택된 모든 영상이 적용됩니다.
10. (선택 옵션) 만일 Alt+F8 누르고 SetMinimalDuration을 실행하면

아래 지정한 길이의 시간 이내의 영상들은 모두 각 영상의 최대 길이로 설정해줍니다.
즉 6초 이내의 영상은 모두 영상 길이만큼 재생하도록 해줍니다.

11. Start Processing 을 누르면 작업을 시작합니다.

현재 작업중인 영상을 선택하면서 작업 진행상황을 보여줍니다.
12. 최종 영상은 언더바(_) + 폴더명.mp4 로 영상들이 있는 폴더내에 생성됩니다.
아래와 같이 합치는 과정에 뜨는 메시지가 cmd창에 뜹니다. 노란색 경고내용은 영상 시작 위치가 연속적이지 않을 때 뜨는 내용입니다. ( 안뜨게 하려면 아래 명령어 수정부분 참조)

아무 키나 누르면 아래처럼 최종 mp4 파일의 위치를 안내하고
임시파일과 폴더를 삭제할지 묻습니다.
분할된 파일이나 추출된 부분 영상이 필요한 경우가 아니라면 삭제하는 것이 좋습니다.

13. 최종 영상을 확인합니다.
샘플 추출 영상 (2분마다 2초 추출) - 키프레임 위치가 아니라서 정확히 10분마다 잘려지지는 않았습니다.
참고: 영상을 2분씩 잘라서 초반 3초 영상을 추출하는 배치 명령어
rem ## for increasing numbers in 4 digit
set sum=1000
setlocal enabledelayedexpansion
rem ## loop each chunk
for %%A in (*.mp4) do (
set /a sum+=1
rem ## [1000]o000.mp4, [1000]o001.mp4....[1001]o000.mp4, [1001]o001.mp4 ...
ffmpeg -i %%A -movflags use_metadata_tags -c copy -segment_time 00:02:00 -f segment -reset_timestamps 1 -y [!sum!]%%03d.mp4
rem ## loop each child chunk
for %%F in ([!sum!]*.mp4) do (
rem ## _1000_[1000]o000.mp4, _1000_[1000]o001.mp4,....1001_[1001]o000.mp4, 1001_[1001]o001.mp4...
ffmpeg -i %%~F -movflags use_metadata_tags -c copy -to 00:00:03 -y out_%%~nF.mp4
rem ## delete parent chunk
del %%~F
)
)
rem #done
VBA코드상의 썸네일 추출 명령 부분 발췌
cmd = Chr(34) & FFMPEG_PATH & Chr(34) & " -ss 00:00:01 -i " & Chr(34) & mPath & mFile & Chr(34) & _
" -y -vf " & Chr(34) & "thumbnail,scale=320:-1" & Chr(34) & " -update 1 -frames:v 1 " & Chr(34) & tFile & Chr(34)
타이틀 제목 영상을 생성하는 부분 발췌
Command = Chr(34) & FFMPEG_PATH & Chr(34) & " -y -i " & Chr(34) & InputFilePath & Chr(34) & _
" -vf drawbox=color=black:t=fill -af volume=0 -to " & CLIP_DURATION & " " & _
Chr(34) & OutputFilePath & Chr(34)
Command = Chr(34) & FFMPEG_PATH & Chr(34) & " -hide_banner -y -i " & Chr(34) & InputFilePath & Chr(34) & _
" -vf " & Chr(34) & "[in]drawtext=text='" & BASE_DIR_TITLE & "':" & _
"fontfile='C\:\\Users\\user\\AppData\\Local\\Microsoft\\Windows\\Fonts\\Paperlogy-5Medium.ttf':" & _
"fontcolor=white:fontsize=78:x=(w-text_w)/2:y=(h-text_h)/2" _
& ", drawtext=text='" & Replace(Mid([F2].text, 3), ":", "\\\:") & " " & Replace(Mid([G2].text, 3), ":", "\\\:") & _
"':fontcolor=gray@0.3:fontsize=28:x=w-tw-10:y=h-th-10[out]" _
& Chr(34) & " " & Chr(34) & OutputFilePath & Chr(34)
1차 분할하는 부분 발췌
' FFmpeg 1차 분할
' 출력: BASE_DIR/_Temp_Chunks/[ROW번호]_chunk_001.mp4, 002.mp4...
Command = Chr(34) & FFMPEG_PATH & Chr(34) & " -y -i " & Chr(34) & InputFilePath & Chr(34) & _
" -c copy -segment_time " & SEGMENT_TIME & " -f segment -reset_timestamps 1 -y " & _
Chr(34) & ChunkPath & Format(RowIndex - 4, "000") & "_" & InputFileNameWithoutExt & "_chunk_%03d.mp4" & Chr(34)
2차 추출하는 부분 발췌
' FFmpeg 2차 추출
' 출력: BASE_DIR/_Temp_Final/[청크파일명].mp4 ' -correct_ts_overflow 0
Command = Chr(34) & FFMPEG_PATH & Chr(34) & _
" -ss " & StartingTime & _
" -y -i " & Chr(34) & ChunkFilePath & Chr(34) & _
" -to " & CLIP_DURATION & _
" -c copy " & _
" " & _
Chr(34) & FinalClipPath & ClipFileNameWithoutExt & ".mp4" & Chr(34)
- 여기서 미리 StartingTime = "00:00:00.100"을 주기 때문에 최종 결과에서 노란색 경고가 뜹니다.
StartingTime ="" 로 없애면 뜨지 않습니다.
StartingTime을 0.1초 지정하면 연속된 영상의 소리가 튀지 않고 연속되는 장점이 있습니다.
대신 간혹 영상이 약간 버퍼링이 생기는 점은 단점입니다.
- 영상이 길고 파일이 많을수록 작업시간이 길어집니다.
- 이상으로 엑셀 자동 랜덤 영상 추출기 소개를 마칩니다.
긴 영상을 랜덤으로 몇 초씩 추출해서 빠르게 랜덤 영상을 만들 때 이용해보세요.

참고) 삽입된 상징 이미지들은 Google Gemini 에서 생성하였습니다.
'XLS+VBA' 카테고리의 다른 글
| 엑셀에서 취소선 대신 화살표 등 도형 표시 (0) | 2025.10.14 |
|---|---|
| 엑셀 특정 단어 강조표시 (0) | 2025.10.02 |
| 색상에 따른 합산 (3) | 2025.08.03 |
| QuerySelector를 이용한 다음(DAUM) 뉴스 검색 (1) | 2025.05.30 |
| VBA로 현재 프린터 단면/양면 인쇄 설정 (1) | 2025.03.02 |
| 체크박스(✅) 확인란 삽입하기 (0) | 2025.01.23 |
| 구글 Gemini API 활용, 일괄로 문장 바꿔 쓰기(Rephrasing) (0) | 2025.01.01 |
| 365 엑셀에서 셀안의 그림(PictureInCell) 기능 (0) | 2024.12.23 |
최근댓글