Video Edit
browser-use/video-use (MIT)의 포크: ElevenLabs 대신 로컬 whisper.cpp, 모든 렌더링 전 검증 게이트, libass 자막 대신 Hyperframes 자막, 소셜 광고 변형을 위한 캔버스 재구성.
원칙
- LLM은 원시 전사본 + 요청 시 시각 자료로 추론합니다. 유지할 가치가 있는 유일한 파생 결과물은 구문 수준 전사본(
takes_packed.md)입니다. 그 외의 모든 것(필러 태깅, 재촬영 감지, 샷 분류, 강조 점수)은 결정 시점에 도출합니다. - 오디오가 우선이고, 시각 자료는 그에 따릅니다. 컷 후보는 음성 경계와 침묵 간격에서 나옵니다. 결정 지점에서만 시각 자료를 자세히 살펴봅니다.
- 질문 → 확인 → 실행 → 반복 → 유지. 사용자가 평문으로 전략을 확인하기 전에는 절대로 컷을 실행하지 마십시오.
- 일반화하십시오. 이것이 어떤 종류의 영상인지 가정하지 마십시오. 자료를 보고, 사용자에게 물어본 후 편집하십시오.
- 예술적 자유가 기본값입니다. 이 문서의 모든 특정 값, 프리셋, 글꼴, 색상, 지속 시간, 피치 구조, 기법은 하나의 검증된 영상에서 가져온 작업 예제일 뿐이며 명령이 아닙니다. 그것들을 읽어 무엇이 가능하고 각각이 왜 효과가 있었는지 이해하십시오. 그런 다음 자료가 실제로 무엇이고 사용자가 실제로 원하는 것이 무엇인지에 따라 자신의 취향에 맞게 결정하십시오. 아래 하드 규칙 섹션에 있는 것만 반드시 수행해야 합니다. 그 외의 모든 것은 여러분의 자유입니다.
- 자유롭게 창안하십시오. 자료가 여기에 설명되지 않은 기법(분할 화면, PIP(Picture-in-Picture), 하단 서드 아이덴티티 카드, 반응 컷, 속도 램프, 프리즈 프레임, 크로스페이드, 매치 컷, L-컷, J-컷, 호흡에 맞춘 속도 램프 등)을 요구한다면, 그것을 만드십시오. 도우미는 ffmpeg와 PIL입니다. 형식이 지원하는 모든 것을 할 수 있습니다. 허락을 기다리지 마십시오.
- 사용자에게 보여주기 전에 자신의 출력물을 검증하십시오. 출시할 수 없는 결과물이라면 제시하지 마십시오.
하드 규칙 (프로덕션 정확성 — 협상 불가)
이것들은 위반 시 무음 오류 또는 깨진 출력물을 생성합니다. 취향이 아니라 정확성입니다. 암기하십시오.
- 자막은 모든 오버레이 후, 필터 체인에서 마지막에 적용됩니다. 그렇지 않으면 오버레이가 자막을 가립니다. 무음 오류.
- 세그먼트별 추출 → 무손실
-c copy연결(concat), 단일 패스 필터그래프 사용 금지. 그렇지 않으면 오버레이 추가 시 모든 세그먼트가 두 번 인코딩됩니다. - 모든 세그먼트 경계에 30ms 오디오 페이드(
afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03). 그렇지 않으면 모든 컷 부분에서 가청성 팝 노이즈가 발생합니다. - 오버레이는
setpts=PTS-STARTPTS+T/TB를 사용하여 오버레이의 프레임 0을 해당 윈도우 시작점으로 이동시킵니다. 그렇지 않으면 오버레이 윈도우 동안 애니메이션 중간 부분이 표시됩니다. - 자막은 출력 타임라인 오프셋을 사용합니다:
output_time = word.start - segment_start + segment_offset, 각 세그먼트는 전체 프레임 길이만큼 지속됩니다(captions.py가 이 작업을 수행). 그렇지 않으면 세그먼트 연결 후 자막이 정렬되지 않습니다. - 절대 단어 중간에 컷하지 마십시오. 모든 컷 가장자리를 전사본의 단어 경계에 맞추십시오.
validate_edl.py --fix가 이 작업을 자동으로 수행합니다. - 모든 컷 가장자리에 패딩을 추가하십시오. 작업 윈도우: 30–200ms. 단어 가장자리는 이미 오디오 엔벨로프에 맞춰져 있지만, 패딩이 남은 부분을 흡수합니다. 빠른 진행 영상에는 더 타이트하게, 시네마틱 영상에는 더 느슨하게 적용하십시오.
- 단어 수준의 그대로의 ASR(자동 음성 인식)만 사용하십시오. SRT/구문 모드(서브초 간격 데이터 손실)나 정규화된 필러(편집 신호 손실)는 절대 사용하지 마십시오.
transcribe.py는 whisper가 "음"/"어"를 유지하도록 프롬프트합니다 — 프롬프트를 제거하지 마십시오. - 소스별로 전사본을 캐시하십시오. 소스 파일 자체가 변경되지 않는 한 절대 재전사하지 마십시오.
- 다중 애니메이션은 병렬 서브 에이전트로 처리하십시오. 절대 순차적으로 처리하지 마십시오.
Agent도구를 통해 N개를 동시에 생성하십시오. 총 소요 시간 ≈ 가장 느린 것의 시간. - 실행 전 전략 확인. 사용자가 평문 계획을 승인하기 전에는 절대로 컷을 실행하지 마십시오.
- 모든 세션 출력은
<videos_dir>/edit/에 저장하십시오. 절대 스킬 디렉토리 내부에 쓰지 마십시오. - 모든 렌더링 전에 검증하십시오.
validate_edl.py <edl> --fix를 실행하고, 종료 코드 0인 경우에만 렌더링하십시오. 이는 잘못된 소스 ID, 파일 끝을 초과하는 시간, 단어 중간 컷, 누락된 오버레이 파일, 컷보다 긴 오버레이 등 LLM이 작성한 편집 목록에서 실제로 발생하는 실패 모드를 잡아냅니다. - 자막은 Hyperframes 레이어이며, 하드코딩된 자막이 아닙니다. Homebrew의 ffmpeg에는 libass가 없으므로 EDL에서
subtitles를 사용하면 실패합니다.captions.py를 사용하십시오.render.py는 모든 오버레이 위에 자막 WebM을 합성합니다. - 소스 ID는 파일 스템(stem)입니다.
sources에서 키는 확장자를 제외한 비디오 파일 이름이어야 합니다(take_B.mp4의 경우take_B), 또는--audio-track N으로 전사한 경우<stem>.track<N>— 이것이 전사본을 찾는 방식입니다. 자막이 켜져 있을 때 불일치가 있으면 검증기가 오류를 발생시킵니다. - 렌더링당 하나의 프레임 속도.
render.py에--fps를 전달하는 경우, 동일한--fps를validate_edl.py와captions.py에도 전달하십시오. 범위는 자막이 어긋나지 않도록 전체 프레임 단위로 반올림됩니다.
이 문서의 다른 모든 것은 작업 예제입니다. 자료가 요구할 때마다 변경하십시오.
디렉토리 구조
스킬은 자체 디렉토리에 있습니다(이 파일 옆의 도우미 + 템플릿). 사용자 영상은 사용자가 배치한 곳에 있습니다. 모든 세션 출력은 <videos_dir>/edit/로 이동합니다.
<videos_dir>/
├── <소스 파일, 수정되지 않음>
└── edit/
├── project.md ← 메모리; 모든 세션이 추가됨
├── takes_packed.md ← 구문 수준 전사본, LLM의 기본 읽기 뷰
├── edl.json ← 컷 결정 (변형의 경우 edl_9x16.json, edl_1x1.json …)
├── transcripts/<name>.json ← 캐시된 whisper.cpp 전사본 (단어 수준 + 침묵)
├── captions_<edl stem>/ ← Hyperframes 자막 합성 + captions.webm
├── animations/slot_<id>/ ← 애니메이션별 소스 + 렌더링 + 추론
├── clips_graded/ ← 그레이딩 및 페이드가 적용된 세그먼트별 추출물
├── downloads/ ← yt-dlp 출력물
├── verify/ ← 디버그 프레임 / 타임라인 PNG
├── preview.mp4
└── final.mp4
설정
install.sh / setup.sh가 모든 것을 설치합니다(Homebrew 패키지, .venv, whisper 모델, Hyperframes + Chrome). 첫 시작 시 그냥 확인하십시오 — 그리고 .venv가 없거나 도우미가 import나 누락된 도구로 인해 실패하는 경우, 다른 작업보다 먼저 <this skill dir>/setup.sh(멱등적임)를 실행하십시오:
PY=<this skill dir>/.venv/bin/python이 존재합니다. 모든 도우미는$PY로 실행하고, 시스템 파이썬을 절대 사용하지 마십시오(numpy/Pillow/OpenCV가 없음).ffmpeg,ffprobe,whisper-cli가 PATH에 있고, ggml whisper 모델이 있어야 합니다. 기본값:~/.claude-video-vision/models/ggml-large-v3-turbo.bin;VIDEO_EDIT_WHISPER_MODEL로 재정의할 수 있습니다.- Hyperframes용 Node.js 22+. 항상 고정된 버전을 호출하십시오:
npx --yes [email protected] …. yt-dlp와 Manim은 처음 사용할 때만 필요합니다. 이 스킬은skills/manim-video/를 제공합니다. Manim 슬롯을 구축할 때 해당 SKILL.md를 읽으십시오.- API 키가 필요 없습니다. 일회성 npm 다운로드인 Hyperframes를 제외하고는 아무것도 머신을 떠나지 않습니다.
도우미는 이 SKILL.md 옆에 있는 helpers/에 있습니다. 이 파일이 포함된 디렉토리를 기준으로 경로를 확인하십시오.
도우미
모든 도우미는 $PY helpers/<name>.py … 형식으로 실행합니다.
transcribe.py <video>— 로컬 whisper.cpp, 단어 수준, 필러 유지, 단어 가장자리가 오디오 엔벨로프에 맞춰짐, 침묵 나열. 소스별로 캐시됨(파일이 변경된 경우에만 재실행).--language en은 감지를 건너뜁니다.--audio-track N은 다중 트랙 녹음용.transcribe_batch.py <videos_dir>— 폴더의 모든 비디오를 한 번에 하나씩 처리(whisper는 이미 GPU를 포화시킴).pack_transcripts.py --edit-dir <dir>—transcripts/*.json→takes_packed.md(구문 수준, 침묵 ≥ 0.5s에서 분할; 빠른 화자용으로--silence-threshold를 0.3으로 낮춤).timeline_view.py <video> <start> <end>— 필름스트립 + 파형 PNG. 요청 시 시각적 드릴다운. 스캔 도구가 아님 — 지속적으로 사용하지 말고 결정 지점에서 사용하십시오.validate_edl.py <edl.json> [--fix]— 모든 렌더링 전 게이트(하드 규칙 13).--fix는 가장자리를 단어 간격에 맞추고 패딩(--pad-in,--pad-out)을 적용하며, 범위를 전체 프레임으로 반올림하고total_duration_s를 재계산하며edl.json.bak을 유지합니다. 30ms 미만의 침묵이 있는 가장자리에 대한 경고는--fix후에도 남습니다: 해당 컷은 단어가 만나는 위치에 있습니다 — 실제 멈춤 지점으로 이동하십시오.captions.py <edl.json>— 출력 타임라인 단어 자막을 Hyperframes 합성 → 투명captions.webm, EDL의captions키 설정. 스타일 플래그:--accent,--color,--top,--size,--font,--case,--words,--no-pop.render.py <edl.json> -o <out>— 세그먼트별 추출(프레임 정확, HDR→SDR, 캔버스 재구성, 그레이딩, 페이드) → 무손실 연결 → 오버레이(PTS 이동) → 자막 → loudnorm.--preview는 QC용,--draft는 컷 확인 전용.reframe.py <edl.json> [--apply]— 각 범위에 걸쳐 OpenCV 얼굴 감지(YuNet) → EDLcanvas에서 화자를 중앙에 유지하고 상단 여백을 확보하는crop_x/crop_y생성.validate_edl.py --fix후에canvas가 종횡비를 변경할 때마다 실행하십시오. 얼굴이MOVES하여 단일 정적 크롭으로 충분하지 않은 범위(분할 필요)와no face범위(직접 크롭 선택)를 플래그 지정합니다. 범위의"crop_lock": true는 수동 크롭을 보호합니다.scenes.py <video>— OpenCV 샷 변경 감지 + 샷당DARK/BLURRY플래그 →edit/shots/<stem>.json. 전사본이 구조화할 수 없는 푸티지(B-롤, 제품 샷, 몽타주, 멀티캠 내보내기, 무음 클립)에 사용하십시오. 샷 경계는 깔끔한 시각적 컷 포인트입니다. 플래그가 지정된 샷은 광고에 거의 사용할 수 없습니다.grade.py <in> -o <out>— ffmpeg 필터 체인 그레이딩. 프리셋 + 사용자 정의용--filter '<raw>'.
애니메이션의 경우, <edit>/animations/slot_<id>/를 Bash로 생성하고 Agent 도구를 통해 서브 에이전트를 생성하십시오.
프로세스
-
인벤토리. 모든 소스에 대해
ffprobe를 실행합니다. 디렉토리에 대해transcribe_batch.py를 실행합니다. 말이 거의 없거나 전혀 없는 소스(B-롤, 제품 샷)의 경우 대신scenes.py를 실행하여 해당 샷을 가져옵니다. 그것이 출력하는QC:줄(각 전사본의qc아래에도 있음)을 읽으십시오: ≤20ms로 압축되거나 침묵 내에서 시작하는 단어는 신뢰할 수 없는 시간을 가집니다. 사용하기 전에timeline_view를 사용하여 해당 단어 근처의 모든 컷을 확인하십시오.- 다중 화자(통화, 인터뷰): 화자 레이블이 없습니다. 내용(질문 대 답변)에서 발언 차례를 추론한 다음, 보관할 각 구문을
timeline_view로 확인하십시오(화상 통화의 경우 활성 화자 타일이 누가 말하는지 보여줍니다). 통화가 각 오디오 트랙에 한 사람씩 녹음된 경우, 대신--audio-track N을 사용하여 각 트랙을 전사하십시오.pack_transcripts.py로takes_packed.md를 생성합니다. 시각적 첫인상을 위해 하나 또는 두 개의timeline_view를 샘플링하십시오.
- 다중 화자(통화, 인터뷰): 화자 레이블이 없습니다. 내용(질문 대 답변)에서 발언 차례를 추론한 다음, 보관할 각 구문을
-
문제 사전 스캔.
takes_packed.md를 한 번 훑어보며 언어적 실수, 명백한 잘못된 표현, 피해야 할 문구를 기록합니다. 일반 목록으로, 편집자 브리핑에 제공합니다. -
대화. 평문으로 보이는 것을 설명합니다. 자료에 의해 형성된 질문을 합니다. 수집할 항목: 콘텐츠 유형, 대상 길이/종횡비, 미적/브랜드 방향, 페이스 느낌, 반드시 유지해야 할 순간, 반드시 잘라야 할 순간, 애니메이션 및 그레이딩 선호도, 자막 필요 여부. 고정된 체크리스트를 사용하지 마십시오 — 적절한 질문은 매번 다릅니다.
-
전략 제안. 4–8문장: 형태, 테이크 선택, 컷 방향, 애니메이션 계획, 그레이딩 방향, 자막 스타일, 길이 예상. 확인을 기다리십시오.
-
실행. 편집기 서브 에이전트 브리핑을 통해
edl.json을 생성합니다. 모호한 순간에는timeline_view로 드릴다운합니다. 병렬 서브 에이전트에서 애니메이션을 구축합니다.validate_edl.py --fix가 종료 코드 0으로 끝날 때까지 실행합니다. 그런 다음 자막이 요청된 경우captions.py를 실행합니다(자막은 최종 범위에서 구축되므로 범위 변경 후 다시 실행하십시오). -
미리 보기.
validate_edl.py(--fix없음) →render.py --preview. -
자체 평가(사용자에게 보여주기 전). 렌더링된 출력(소스 아님)에서 모든 컷 경계(±1.5s 윈도우)에 대해
timeline_view를 실행합니다. 각 이미지에서 다음을 확인합니다:- 컷에서 시각적 불연속성 / 플래시 / 점프
- 경계에서의 파형 스파이크(30ms 페이드를 통과한 오디오 팝)
- 오버레이 뒤에 숨겨진 자막(규칙 1 위반)
- 오버레이 정렬 불량 또는 잘못된 프레임 표시(규칙 4 위반)
또한 샘플링: 처음 2초, 마지막 2초, 중간 지점 2–3개 — 그레이딩 일관성, 자막 가독성, 전반적인 일관성을 확인합니다.
ffprobe를 출력에 실행하여 지속 시간이 EDL 예상과 일치하는지 확인합니다.오디오를 측정하고, 가정하지 마십시오: 통합 라우드니스와 실제 피크를 위한
ffmpeg -i out.mp4 -af ebur128=peak=true -f null -, 섹션별 RMS(대화, 음악 전용, 엔드 카드). 대화보다 15dB 낮은 엔드 카드, 또는 음성보다 큰 효과는 버그입니다. 들을 수 없습니다: 그렇게 말하고 숫자를 보고하십시오.사용자가 게시할 모든 것(런칭, 프로모션, 광고)에 대해서는 렌더링된 파일, EDL 및 사용자가 제공한 참조 비디오와 함께 비판 서브 에이전트 하나를 생성하십시오. 칭찬이 아닌 혹평을 하도록 브리핑하십시오: 평결, 시간 코드와 증거(프레임, 레벨)가 포함된 순위가 매겨진 문제점, 그리고 먼저 해야 할 5가지 수정 사항. 새로운 시각은 작성자가 더 이상 보지 못하는 것을 포착합니다 — 끊긴 페이오프 라인, 0.5초 밈, 전화기 크기에서 읽을 수 없는 28px 텍스트.
어떤 것이든 실패하면: 수정 → 재렌더링 → 재평가. 자체 평가 패스를 3회로 제한하십시오 — 3회 후에도 문제가 남아 있으면, 무한 루프를 도는 대신 사용자에게 플래그를 지정하십시오. 자체 평가가 통과된 경우에만 미리보기를 제시하십시오.
-
반복 + 유지. 자연어 피드백을 받고, 재계획하고, 재렌더링합니다. 절대 재전사하지 마십시오. 확인 시 최종 렌더링.
project.md에 추가합니다.
컷 크래프트 (기법)
- 오디오 우선. 후보 컷은 단어 경계와 침묵 간격에서 나옵니다.
- 피크 유지. 웃음, 결정적 한마디, 강조 비트. 펀치라인 너머로 확장하여 반응을 포함하십시오 — 웃음 자체가 비트입니다.
- 화자 전환은 발언 사이에 공기가 있는 것이 좋습니다. 일반적인 값: 400–600ms. 빠른 진행 영상은 더 적게, 시네마틱 영상은 더 많이. 취향 결정.
- 웃음과 반응은 태깅되지 않습니다(whisper는 오디오 이벤트를 내보내지 않습니다).
timeline_view파형에서 말이 없지만 큰 소리가 나는 구간으로 찾으십시오. 그 너머로 확장하십시오 — 웃음 자체가 비트입니다. - 침묵 간격은 컷 후보입니다. 값은 200–800ms가 좋습니다. 콘텐츠에 따라 다릅니다: 증언 광고는 더 타이트하고, 인터뷰는 더 느슨합니다. 취향 결정.
- B-롤과 제품 샷은
scenes.py로 큐를 잡으십시오. 각 샷의 시작과 끝 전사본 타임스탬프를takes_packed.md에 추가하라는 요청을 받지 않았더라도 추가할 가치가 있습니다.
변형
동일한 푸티지의 여러 편집 — 예를 들어, 16:9 가로 버전과 9:16 세로 버전. 다음과 같이 작업하십시오:
- 가로 버전을 먼저 편집하십시오(모든 테이크 선택, 컷, 페이싱은 여기서 완성).
- 각 변형에 대해 별도의 EDL 파일을 생성하십시오:
edl_9x16.json,edl_1x1.json. 동일한takes_packed.md를 공유합니다. - EDL에서
canvas를 해당 종횡비로 설정하십시오. validate_edl.py --fix를 각각 실행하십시오.reframe.py를 실행하고(얼굴이 화면 중앙에 오도록) 필요에 따라 분할하십시오.- 각 변형을 완전히 독립적으로 렌더링하십시오: 한 변형의
render.py인스턴스는 다른 것을 알 필요가 없습니다.
오버레이와 자막은 상대 좌표를 사용합니다: 모든 좌표는 캔버스 크기에 대해 0–1입니다. 따라서 재구성 시 자동으로 조정됩니다(그렇지 않은 경우에만 수정하십시오).
정보 파일과 템플릿
edit/project.md— 세션 메모리. 각 세션이 추가됩니다. 템플릿:
# 프로젝트: <brief>
## 세션 YYYY-MM-DD
- **요청**: "…"
- **전략 합의**: "…"
- **EDL**: `<stem>.json` (확인됨)
- **렌더링 상태**: 초안 / 미리보기 완료 / 최종
- **참조**: `animations/slot_<id>/`의 스크린샷
takes_packed.md— 자동 생성, 다음과 같이 시작:
# 소스 개요
## take_A.mp4
[0.0–1.2] 네 안녕하세요 [silence 0.8]
[2.0–4.5] 오늘은 새 기능에 대해 말씀드리려고 합니다 [silence 0.3]
[4.8–6.2] 정말 대단합니다 [silence 1.5]
[7.7–9.0] 자 이제 시작해볼까요 [silence 0.6]
--- 침묵 ≥0.5s에서 분할 ---
[9.6–11.2] 그래서 제가 생각하기에 [silence 0.4]
…
edl.json— 작업 예제:
{
"sources": {
"take_A": {
"file": "/path/to/take_A.mp4",
"fps": 30.0
}
},
"canvas": {"width": 1080, "height": 1920},
"segments": [
{
"id": 0,
"source": "take_A",
"start_s": 0.0,
"end_s": 1.5,
"grade": null,
"overlays": [
{
"type": "image",
"file": "animations/slot_0/render.mp4",
"start_s": 0.5,
"end_s": 2.0,
"x": 0.15,
"y": 0.75,
"scale": 0.3
}
],
"crop_x": 0.0,
"crop_y": 0.0
}
]
}
validate_edl.py --fix는 자동으로 채울 수 있는 누락된 키를 추가합니다(crop, grade, start_offset). 수동으로 grade나 정적 crop을 설정하는 것은 그대로 유지됩니다.
에이전트 사용 패턴
이 스킬 내에서 멀티 에이전트 협업:
편집 서브 에이전트 브리핑
EDL을 생성하도록 서브 에이전트에 위임할 때, 다음과 같이 브리핑하십시오:
EDL을 만들어 줘.
<source_ids>사용,<start_range>에서<end_range>까지.take_B.mp4의<specific_take_time>부분을 사용해야 해 — 그 한 마디가 핵심이야. 그걸로 시작하고, 필요하면<other_details>를 추가해.sources섹션은 내가 처리할게 — 세그먼트에<stem>만 채워 넣으면 돼. 이 타임코드 부분이 확실하지 않아 —timeline_view를 확인해 봐. JSON만 출력해, 설명은 필요 없어.
비판 서브 에이전트 브리핑
자체 평가 중에 사용하십시오:
이 렌더링은
<설명>을 위한 최종본이 될 거야. 혹평해 줘. 중요한 문제부터 순서대로 나열해. 각각 시간 코드, 이게 문제인 이유(첫 번째 시청자가 인지하지 못할 수 있는 부분 포함), 증거(프레임, 오디오 레벨), 해결 방법을 포함시켜 줘. 틀렸거나 과장된 건 없어야 해 — 확실하지 않으면 말해 줘.
하드웨어 메모
- whisper.cpp는 GPU를 포화시킵니다. 8분 영상은 대략 8초면 전사됩니다.
- Hyperframes는 npm을 한 번만 다운로드하며, 이후에는 캐시됩니다.
- 합리적인 길이의 편집(예: 5분 클립에서 60초 광고)은 2분 미만의 월 클록으로 렌더링되어야 합니다.
- 3개 이상의 동시 애니메이션 서브 에이전트는 GPU/CPU 메모리를 포화시킬 수 있습니다. 한 번에 2–3개의 애니메이션 슬롯으로 유지하고 대기열을 사용하십시오.
ffmpeg오디오 분석은 느릴 수 있습니다(출력의 실시간 길이의 ≈0.3배). 인내심을 가지십시오.timeline_view는 이미지 하나에 안전하게 필름스트립 PNG를 생성해야 합니다.- YuNet 얼굴 감지는 180p로 다운스케일링됩니다. 실패는 새로 고침만 하면 됩니다.
- 비교적 자주 하드웨어 전력에 도달하게 됩니다. LLM(편집 명령)과
ffmpeg(실제 픽셀 처리)는 서로 다른 리소스에 경합합니다. 동시 작업을 관리하십시오.