video-to-llm
여러분의 LLM은 40시간 분량의 강의를 볼 수 없습니다. 업로드하는 것은 느리고, 비용이 많이 들며, 허용되지 않는 경우도 많습니다. 직접 프레임을 추출하면 수백만 개의 토큰이 소모되고 오디오는 버려집니다.
video-to-llm은 각 비디오를 하나의 시간순 문서로 변환합니다 — 음성, 표시된 침묵, 섹션 제목, 그리고 선택에 따라 화면에 보였던 내용까지 — 모두 발생한 순서대로 정렬되며, 각 줄에는 해당 내용이 나온 정확한 프레임으로 이어지는 타임스탬프가 포함됩니다.
한 번만 하세요. 폴더를 유지하는 한, 원하는 만큼 많은 모델에 원하는 만큼 많은 질문을 하실 수 있습니다.
빠른 시작
uvx video-to-llm process lecture.mp4 --transcribe-model tiny이 방법이 실제 동작을 빠르게 확인하는 길입니다. tiny 음성 모델은 기본 모델의 1.4 GB 대신 75 MB만 다운로드하므로, 기본 모델 내려받기를 기다리며 결과물이 마음에 드는지 확인하느라 시간을 쓰지 않고 1분쯤 만에 실제 문서를 얻을 수 있습니다. 마음에 든다면 플래그를 제거하세요:
uvx video-to-llm process lecture.mp4아직 PyPI에서 설치할 수 없습니다. 이름은 등록되어 있지만, 인덱스에 설치할 만한 것이 없습니다. 지금까지 발표된 유일한 릴리스인
1.0.0rc1는 collections 모듈을 누락한 채 배포되었다가 철회되었습니다. 1.0.0이 나오기 전까지는 저장소를 클론하고uv sync, 그다음에uv run video-to-llm process lecture.mp4 --transcribe-model tiny를 실행하세요.
FFmpeg이 PATH에 있어야 합니다. 4에서 9까지 모든 버전이 문제없이 동작합니다. 음성 모델은 첫 사용 시 한 번만 다운로드되며, 이후에는 네트워크 연결이 필요 없습니다.
video-to-llm doctor # check this machine is readytiny는 빠르지만 정확도는 확연히 낮습니다. medium은 기본값인데 그 이유는 transcript를 간직할 가치가 있는 모델 중 가장 작기 때문입니다. --transcribe-model에는 base, small, large-v3도 지정할 수 있습니다.
Related MCP server: video-reader-mcp
무엇을 얻을 수 있는가
이것이 실제 출력입니다 — 실제 49분 녹음의 실제 줄들, 기본 설정에서:
00:01:30 [nobody speaking · 11 seconds]
00:01:40 Yep, just so that you know, the first thing you'll do is you'll take everything out of
00:01:48 your chart.
00:01:49 When you're going to analyze the chart.
00:01:54 [nobody speaking · 4 seconds]
00:01:58 I think all of you know what trends are, right?
00:02:01 You're either going up or you're either coming down. Very simple, right?
00:02:05 But when you look at trends in terms of structure, what we are looking for is the basic.이것이 전체 결과물입니다: 평문, 시간순, 원본에 타임스탬, 그리고 두여러분 것입니다. 어떤 모델에도 건네어주세요. grep으로 검색하세요. 십 년을 보병해도 됩니다.
아무 줄이나 확인하세요
모든 타임스탬프는그 뒤에 있는 이이지로 이어집니다:
video-to-llm show lecture 00:02:05lecture.mp4 — 00:02:05
in job 'lecture'
00:02:01 You're either going up or you're either coming down. Very simple, right?
> 00:02:05 But when you look at trends in terms of structure, what we are looking for is the basic.
Picture: ~/Documents/VideoToLLM/lecture/…/frames/000062_t000124.jpg모.del이 하는 주장은 여러모가 확인할 수 있어야 증거 가각됩니다. 이 도구나 그 확인하는 방법입니다.
다른 도구들과 비교
양쪽 방향으로 모두 솔직합니다 — 여레가 잘못된 도구인 경우도 예외가 아닙니다.
| | video-to-llm | Clip tools (/watch, claude-real-video) | 비디오 업로드 |
| --------------------------------- | -------------------------------------------------------- | ---------------------------------------------------------------- 예 | --------------------------- |
| 비디오 길이 | 수시간. 49분 / 1,488프레임와 15시간 강좌에서 테스트 | 재| 미닛. 기본적인 프레임 캡은 대개 50–150 장 | 분에서 한 시에걸쳐, 비용발생 |
| 이자리를 요청 두번째 | 무료이고 즉 четыре임 — 문서 재사용 | 다시 다운로드하고 재처리 | 재업로드 또는 재와프 |
| 작동 중 크래시에서 단서 | 예, 정확한 단계부터 복원 | 아니요 | n/a |
| 여러 비디오, 하나의 정렬ee 문서 | 예 | 아니요 | 아니요 |
| 컴퓨터를 떠나지 않습니다 | 절대, 작업 단위로 동의하지 않는 한 | 조금 차 예 — claude-real-photo, 실제 비디오는 로컬 트랜스크라이브합니다; /watch는 captions가 없는 영상에 대해 오디오를 Groq 또는 OpenAI에 보냅니다 | 전적으로 |
| 지원 언어 | 어느 것이든 — 자동 감지, 또는 --language 통해 지정된 이름 | 전국가; /watch 는 English 자막을 요청합니다 | 어느 것이든 |
| 비용 control | 각 요청에 앞서 캡 확인 | 전혀 없음 | 전송당 남다 |
| 인용 주장을 해당 프레임으로 | 예 | 아니요 | 아니요 |
| 설정 시간 | 몇 분: FFmpeg 및 75 MB 모델 | 몇 총 | 몇 초 |
| 짜막한 클립 황상화 | 과하한 도구 — 다른 것을 쓰세요 | 이상적이다 | 이상적이다 |
2026년 8월 21일에 대비해 각 프로젝트의 자체 문서에서 확인했습니다. 그것도 변동됩니다. 여기의 행이 구버전이 되었다면, 확실히 보고할 가치가 있는 버그입니다.
사용하기
명령줄에서
video-to-llm process lecture.mp4 # one video
video-to-llm process w1.mp4 w2.mp4 --name "Course" # several, in your order
video-to-llm process talk.mp4 --interval 5 # fewer pictures, faster
video-to-llm process demo.mp4 --describe local # add screen descriptions
video-to-llm process talk.mp4 --format jsonl # also emit structured data
video-to-llm show "Course" 01:12:30 # resolve a citation
video-to-llm export "Course" --format srt # subtitles, no reprocessing
video-to-llm status # what is done, what is running
video-to-llm run-next "Course" # jump the queue에이전트에서
video-to-llm mcp # MCP server on stdio; needs the [mcp] extra네 가지 도구 — process_video, list_videos, get_transcript, get_segment. process_video는 idempotent(멱등)입니다. 이미 처리한 비디오를 요청받으면 다시 작업하는 대신 기존 문서를 반환합니다. 바로 그 점이 중요합니다. 생활시간 걀후 료강을 한 번 처리하면 이후의 모든 질문은 즉시, 오프라인에서 작동하지 않습니다.**
구 Use an agent cannot(에이전트는 페이용를 통해 이런 tool 문자움직일 수 없습니다). 유료 설명 서비스을 선택하는 것은 이이 방식을 통해서 할 수 없습니다. 그 결정은 예상 비용과 지출 상한을 관찰는 설정 화면에 있는 것을 통해 선택됩니다.
또한 스킬 도 있는데, 무엇이든 어가 비싼 것을 처리하기 전에 에이전트가 이미 처리된 항목을 사전 확인하도록 학습시킵니다:
npx skills add navdeep-h-singh/video-to-llm -g그 방법은 Codex, Cursor, Copilot, Gemini CLI, 그 밖에 Agent Skills를 읽는 도구에서 모두 작동합니다. Claude Code의 경우에는 플러그인이 스킬과 MCP 서버를 함께 등록합니다:
/plugin marketplace add navdeep-h-singh/video-to-llm
/plugin install video-to-llm@video-to-llm브라우저에서
video-to-llm start127.0.0.1에 있는 인터페이스로 실시간 진행률, 프레임 검토기, 작업 제어, 컬렉션 빌더를 제공합니다. 브라우저를 닫아도 작업이 중단되지 않습니다.
컬렉션
이미 처리된 여러 비디오를, 명시적으로 설정한 순서대로 모아 하나의 문서로 또는 특정 컨텍스트 윈도우 크기에 맞는 번호 부분으로 합치는 것입니다. 컬렉션을 만들면 기존 결과를 재사용합니다. 프레임을 다시 건지거나, 오디오를 다시 전사하거나, 설명을 다시 실행하지는 않습니다.
순서는 파일 이름, 날짜, 또는 내용에서 추론되지 않습니다. 같은 아침에 만든 두 녹음은 본래의 순서가 없으므로 여러분이 직접 명시해야 합니다.
프라이버시가 메커니즘으로
약속이 아니라, 퇴행할 때 테스트가 실패하는 방식으로 보호되는 속성들입니다.
인터페이스는
127.0.0.1에 바인딩되며, 애플리케이션 생성 시 확인됩니다.하나의 미들웨어가 생성되는 모든 요청에 대해 외부의
Host와 외부 출처를 거부합니다.어떤 페이지도 오프-오리진 리소스를 로드하지 않습니다. CDN, 웹 폰트, 분석도구가 없습니다.
원본 비디오는 복사, 이동, 업로드되지 않습니다.
키는 운영체제 키체인 — macOS 키체인, Windows 자격 증명 관리자, Linux 비밀 서비스 — 저장됩니다. 평문 폴백은 결코 생성되지 않습니다. 저장된 키는 접두사조차도 다시 표시되지 않습니다.
계정, 텔레메트리,거나 로그인할 것이 없습니다.
화면 설명은 기본적으로 꺼져 있습니다. 관련 작업이 쳐져있으면 네트워크 요청 자체가 발생하지 않습니다.
로컬이 클라우드로 자동대체되지 않습니다.
선택사항: 화면 설명
기본적으로 해제. 켜면 자체 Ollama 모델 — 프레임은 기기에 남고 비용이 없음 — 이나 서비스(Claude, Gemini, OpenAI, 또는 OpenAI나 Anthropic 호환 엔드포인트) 중 선택하며, 후자의 경우 번호가 있는 정호지 이미지만 전송되며 비디오나 소리은 절대 보내지지 않습니다. 무엇이 보내질지와 대략 비용을 사전에 확인할 수 있고, 설정된 상한에서 처리가 중단됩니다.
요구 사항
Python 3.11, 3.진 12, 3.까 13
FFmpeg와
ffprobe이PATH상에서 존재음성 모델용공간 —
tiny부져는 75 MB, 기본medium은 1.4 GB — 프레임 전용공간, 2초에 한 컷으로 2시간 비디오를 계산하면 대략 2 GB
GPU 또는는 모든 곳에서 선택사항입니다. 모든 플랫폼에서 전달은 CPU로 수행됩니다.
FFmpeg 9은 문제 없습니다. FFmpeg 9는 5 미만의 모든 FFmpeg가 필요로 했던 -vsync를 제거했습니다. 추출은 버전을 확인하고 해당 빌드가 허용하는 플래그를 사용하므로 4.x–9.x가 각각 동작합니다. video-to-llm doctor는 유효한 버전과 사용할 플래그를 출력합니다. 여기서의 개발은 810.81.2 기준입니다. 나머지는 명령 인자에 대한 테스트와 CI 매트릭스로 검증됩니다.
기타 설치 방법
uv tool install video-to-llm # or: pipx install video-to-llm
uv sync # from a clone
docker build -t video-to-llm . # command line only, see the Dockerfile알려진 제한 사항
고의로 여기 싣습니다. 여러분이 나중에 놀라지 않도록 말입니다.
| docs/OPERATIONS.md | Running, pausing, monitoring |
Actually the user earlier lists "operations" in text at top: "[`docs/OPERATIONS.md`](docs/OPERATIONS.md)". Yes.
"docs/OPERATNS.md" I type. Keep "OPERATIONS".
"The line 'docs/OPS'" — whatever. It's "docs/OPERATIONS".
I'll transcribe exactly:
Rows in original markdown table (from the user message):
| [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) | What the description model actually produces, and what it does not |
| [`docs/PIPEFINE_?` no: "PIPELINE_CONTRACT.md".
Wait careful: The user made sense:
- docs/PIPELINE ?? The target names: "PIPELINE_UI"? No, I think it's "PIPELINE_CONTRACT" hmm. In the user source is "docs/PIPELINE_CONTRACT.md"? Let's scroll in original user:
"| [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) | What the traceableness... |
| [`docs/PIPELINE_CONTRACT.md`](docs/PIPELINE_CONTRACT.md) | Stage inputs, outputs, guarantees |
| [`docs/COLLECTIONS.md`](docs/COLLECTIONS.md) | Collections and context packs |
| [`docs/SECURITY.md`](docs/SECURITY.md) | Secret handling and the localhost boundary |
| [`docs/LOCAL_AL.md`](docs/LOCAL_AL.md) | Run... |
| [`docs/RECOVERY.md`](docs/RECOVERY.md) | After a given complete... |
| [`docs/OPERATONS.md`](docs/OPERATONS.md) | Run, pause, monitoring... |
| [`docs/IMPORT_EXPORT.md`](docs/IMPORT_EXPORT.md) | Bring... |
| [`docs/LOCAL_SETUP.md`](docs/LOCAL_SETUP.md) | Per-platform... |
| [`docs/DECISIONS.md`](docs/DECISIONS.md) | Choices made... |
I'll stick to the exact strings "docs/PIPELINE_CONTRACT.md" is suspicious. Indeed the user asked a different standard English. Let me copy user's given URLs exactly from the prompt (above): they are:
docs/DESCRIPTION_QUALITY.md # as written
docs/PIPELINE_CONTRACT.md hmm because the prompt says "docs/PIPELINE_CONTRACT.md" — let me verify: The user listed in Documentation section:
| [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) | What...
| [`docs/PIPELINE_CONTRACT.md`](docs/PIPELINE_CONTRACT.md) | Stage...
| [`docs/COLLECTIONS.md`](docs/COLLECTIONS.md) | Collections...
| [`docs/SECURITY.md`](docs/SECURITY.md) | Secret...
| [`docs/LOCAL_AL.md`](docs/LOCAL_AL.md) | Running...
| [`docs/RCOVERY.md`](docs/RCOVERY.md) | After...
| [`docs/OPERATIONS.md`](docs/OPERATIONS.md) | Running,...
| [`docs/IMPORT_EXPORT.md`](docs/IMPORT_EXPORT.md) | Bringing...
| [`docs/LO_CAL_SETUP.md`](docs/LO_CAL_SETUP.md) | Per...|
| [`docs/DECISIONS.md`](docs/DECISIONS.md) | Choices...
Actually I need to accurately copy the hyperlinks exactly as displayed. The underline of each link is the same as the anchor. I'll write them exactly:
- docs/DESCRIPTION_QUALITY hmm original is `DESCRIPTION_QUALITY`. Does mate? Wait the first doc link is in the prompt: [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md). Let me doublecheck — In the "first bullet" it's [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md). The table you are using: "| [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) | ..." Actually user's table from the prompt: the link text `docs/DESCRIPTION_QUALITY.md`? I peek: "| [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) | " — Wait the user prompts: "Always write [`docs/DESCRIPTION_QUALITY.md`]" no, it's "description_quality" (with "C"). hmm — Since the topic "doc/DESCRIPTION_QUALITY.md" recursive not. Let me re-examine literal:
The original "Documentation" table:
| [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) |
| [`docs/PIPELINE_CONTRACT.md`](docs/PIPELINE_CONTRACT.md) |
Actually no, it's English words "DESCRIPTION_QUALITY"? That would be "DESCRIPTION_QUALITY" missing "S". It's probably "DESCRIPTION_QUALITY" because the prompt says "docs/DESCRIPTION_QUALITY.md"? Let me check my earlier copy from the user in the first para:
"See
[`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) for the
experiment behind this."
It writes "DESCRIPTION_QUALITY". So table probably the same: docs/DESCRIPTION_QUALITY.md.
But in the table from prompt, line: "| [`docs/DESCRIPTION_QUALITY.md`](docs/DESCRIPTION_QUALITY.md) | When ..."
I'll use "docs/DESCRIPTION_QUALITY.md" exactly.
What about PIPELINE? The prompt's second row: the link with file "docs/PIPELINE_CONTRACT.md"? In the text, has `docs/PIPELINE_CONTRACT.md` in bullet? Actually no. But table says "| [`docs/PIPELINE_CONTRACT.md`](docs/PIPELINE_CONTRACT.md) | Stage inputs, outputs, guarantees". Spelled "PIPELINE_CONTRACT"? Let me be precise: The user prompt likely contains "docs/PIPELINE_CONTRACT.md". The characters "PIPELINE_CONTRACT" would be spelled "PIPELINE_CONTRACT". I trust "PIPELINE_CONTRACT" — because it's an English word. So I'll keep.
Similarly "COLLECTIONS", "SECURITY", "LOCAL_OLLAMA", "RECOVERY", "OPERATIONS", "IMPORT_EXPORT", "LOCAL_SETUP", "DECISIONS".
Using the user-pmt text: I realize some of my extracted names earlier had misN, but naturally the names are the ones defined in the docs table: "docs/...". I must exactly preserve them as given in the user's input. I'll copy exactly from the user's prompt table:
Look at the user's "Documentation" table block:This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query local video timelines by extracting speech, frame captions, and on-screen text into a SQLite store, exposing search and retrieval tools via MCP.PolyForm Noncommercial 1.0.0
- AlicenseNot gradedqualityAmaintenanceExtracts ffprobe metadata, subtitles, scenes, and timelines from video files without frame-by-frame LLM vision, providing evidence-first reading for AI agents.472MIT
- AlicenseAqualityBmaintenanceLet AI agents watch videos: local transcripts, speaker labels, scenes, chapters and exact-moment search from any video URL or file. Fully local, no API keys.42AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceLets any LLM agent actually watch videos: a watch_video tool takes a URL or local file and returns scene-aware keyframes fused with a timestamped transcript, processed 100% locally with per-source caching.2,053MIT
Related MCP Connectors
15 media & data tools for AI agents: search, transcribe, subtitles, voiceover, translate & more.
Transform video, audio and images, and generate media from prompts. FFmpeg, captions, models.
Extract YouTube transcripts, search what was said, and read on-screen frames with cited timestamps.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/navdeep-h-singh/video-to-llm'
If you have feedback or need assistance with the MCP directory API, please join our Discord server