86 (관리자 지시 · 승인):
- ZIP 만들기 (archive 4.3.0, MIT): 길게 누르기 [ZIP 으로 묶기] (표시한 것 모두 · 바깥 것만) - 이름 · 압축 정도
(빠르게 1 · 보통 6 (처음 값) · 작게 9, 설정 zipLevel 로 기억) · 넣을 곳 (지금 폴더 · 다른 창). 링크 · junction 은 넣지 않음.
.jjpart 에 쓰고 다 되면 이름 바꾸기 - 취소 · 실패면 만들다 만 ZIP 이 남지 않음. 같은 이름이면 "이름 (2).zip".
- 풀기: 길게 누르기 [압축 풀기] (ZIP · 7z · RAR), 7z · RAR 은 열면 풀기, 보기의 ZIP 화면 [풀기] 도 같은 흐름.
풀 곳 (압축 옆 새 폴더 · 압축이 있는 폴더 · 다른 창), 같은 이름 (이름 바꾸기 · 건너뛰기 · 덮어쓰기 - 처음은 복사 설정대로), 진행 창 · 취소.
- 7z · RAR: 7-Zip 25.01 (7z.exe · 7z.dll) 을 실행 파일 옆 7zip\ 에 동봉 (tool/fetch_7zip.ps1 - 공식 MSI, SHA-256 고정,
관리자 설치로 풀기만). RAR 은 풀기만 (unRAR 라이선스) - RAR 만들기 선택지 없음.
Android 는 아직 (lib7zz.so 빌드는 마감 뒤로) - 막지 않고 "다른 앱으로 열기" 안내.
- 보안 (관리자 판단) - 셋 다 목록을 먼저 읽고 검사:
· 밖으로 나가는 경로 (../ · 절대 경로 · 드라이브 · UNC · ':') 는 막고 확인 창 · 끝 알림에 (zip slip).
· 압축 안의 심볼릭 링크 · junction 은 만들지 않고 건너뛰고 알림.
· 풀린 크기가 대상의 빈 공간보다 크면 풀기 전에 알리고 묻는다 ([그래도 풀기]).
· 비밀번호: 보이지 않는 칸으로 묻고, 7-Zip 에는 명령 줄이 아니라 표준 입력으로만 (작업 기록 · app.log 에 없음).
ZIP 은 가운데 목록에서 암호 표시를 읽어, 비밀번호 없이 암호 글자를 그대로 쓰지 않는다. 틀리면 다시 묻는다.
- 라이선스: assets/licenses/7ZIP_LICENSE.txt (원문 - LGPL 2.1+ · BSD 3/2-clause · unRAR 제한), 라이선스 화면 (7-Zip · LGPL),
THIRD_PARTY_NOTICES (판 · 소스 7z2501-src.7z · RAR 은 만들지 않음), 설치 폴더 7zip\ 에 License.txt · LGPL-2.1.txt.
- 내 판단: 진행은 탐색기 진행 패널이 아니라 진행 창 (취소) - 진행 패널은 복사 · 이동 (TransferJob) 전용이라.
보충 (관리자 지시): [품질 올리기] 다듬기 정도 설정 - 약하게 0.15 / 보통 0.25 (처음 값) / 강하게 0.4. fetch 스크립트에 받은 주소 · 판 · 날짜.
- 시험: archive_ops_test (막는 이름 · 계획 · ZIP 만들기 · 풀기 · 같은 이름 · zip slip · 비밀번호 · 취소, 실제 7-Zip 목록 · 풀기 ·
표준 입력 비밀번호 · 머리 암호 · 틀린 비밀번호), archive_ui_test (확인 창 · 취소 · 다른 앱 안내 · 묶기), licenses_test (7-Zip),
ai_quality_test (다듬기 정도).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|---|---|---|
| android | ||
| assets | ||
| integration_test | ||
| lib | ||
| packages | ||
| test | ||
| test_assets | ||
| test_driver | ||
| tool | ||
| windows | ||
| .gitignore | ||
| .metadata | ||
| LICENSE | ||
| README.md | ||
| analysis_options.yaml | ||
| pubspec.lock | ||
| pubspec.yaml | ||
README.md
![]()
JJ_MKVMaker
동영상에 자막을 넣어 MKV 로 만들고, 자막을 편집 · AI 로 생성 · 번역하고, 동영상을 재생하는 무료 Windows 프로그램입니다. (Android 이식 예정)
- 모든 AI 처리(음성인식 · 번역)는 내 PC 안에서 이루어집니다. 영상이나 자막을 외부로 보내지 않습니다.
- 설치 없이 폴더째 실행합니다. 필요한 프로그램이 없으면 처음 실행할 때 물어보고 받아 줍니다.
- 무료 · 오픈 소스 (MIT) · 광고 없음
주요 기능
| 기능 | 내용 |
|---|---|
| MKV 만들기 | 동영상 + 자막(여러 언어) → jj_mkv\동일파일명.mkv. 같은 폴더의 자막 자동 추가, 내장 자막 삭제·수정, 언어 태그 |
| 인코딩 | 원본 유지(재인코딩 없음) 또는 H.264 · H.265 · VP9 · AV1 · MPEG-4, 720p ~ 8K, 화질 3단계 |
| 자막 편집 | SRT · SMI · ASS · VTT · 내장 자막 편집, 문자셋 변환(UTF-8 · CP949 · Shift-JIS · GBK · UTF-16) |
| 싱크 맞추기 | 영상을 보면서 편집, 타임라인에서 끌어서 이동·길이 조절, "선택 줄부터 여기로 맞추기" |
| AI 자막 | Whisper 음성인식 → 파일명_AI.srt, NLLB 번역 → 파일명_ko.srt · _en · _ja … (200개 언어) |
| 자막 번역 | 이미 있는 자막(예: 영어)을 원하는 언어로 번역해 MKV 에 추가. 인터넷에서 받은 자막도 한국어로 함께 번역 |
| 인터넷 자막 찾기 | OpenSubtitles.com 검색 (영상 해시로 "이 파일용" 자막 우선) |
| 동영상 플레이어 | 재생 목록, 전체 화면, 팝업(항상 위), 원본의 0.5·1·2·4배, 자막·음성 트랙 선택, 속도 |
| 탐색기 연결 | 오른쪽 클릭 "JJ_MKVMaker 로 재생" / "JJ_MKVMaker 로 자막 만들기", 끌어다 놓기. 더블클릭(연결 프로그램)으로 열면 바로 재생 또는 목록에 추가, 켜져 있는 창 / 새 창 (환경 설정) |
| 창 · 종료 | 창 위치 · 동영상 목록 기억, 여러 창의 목록 자동 맞춤. 종료(✕)를 누르면 백그라운드로 계속 / 모두 종료 / 매번 고르기 (환경 설정). 완전 종료는 트레이 아이콘 > 종료 |
| 다운로드 | Ctrl+C 로 복사한 YouTube 주소 → yt-dlp, 마그넷 · .torrent → aria2 (백그라운드, 트레이). 다 받은 영상은 편집 목록에 자동 추가 |
| 웹 브라우저 | 앱 안 브라우저(Edge WebView2)로 보다가 [다운로드], 즐겨찾기(Chrome · Edge · Whale 에서 가져오기), 로그인 쿠키를 yt-dlp 와 공유, 다른 언어 페이지를 화면 언어로 자동 번역 (Google 번역), JavaScript 끄기 |
| 작업 대기열 · 화면 분할 | AI 자막 · 번역 · MKV 만들기를 차례로 백그라운드 실행, 브라우저 옆 [작업 현황] 에서 진행 확인 |
| 일괄 작업 | 동영상 목록에서 여러 개를 체크(전체 선택 · 이름/날짜 정렬) → [자막 만들기] · [자막 만들기 & MKV 만들기] · [선택한 파일 재생] · [MKV 만들기] |
| 상태 표시 · 화면 크기 | 모든 화면 오른쪽 위에 CPU · MEM · 다운로드 디스크 남은 용량, 화면 크기 [−] 100% [+], 환경 설정 · 종료 버튼 |
| 끌어다 놓기 · 오른쪽 클릭 | 어느 화면에서든 동영상 · 폴더를 놓으면 목록에 추가. 목록에서 오른쪽 클릭: 폴더 열기 · 재생 · 자막 만들기 · 자막 찾기 · 삭제 |
실행
- Releases 에서
JJ_MKVMaker_v*_win64.zip을 받아 원하는 폴더에 풉니다. jj_mkvmaker.exe를 실행합니다. (Windows 10/11 64비트)- 폴더 전체가 프로그램입니다. 맨 위의
jj_mkvmaker.exe는Lib\안의 프로그램을 실행하는 시작 프로그램이고, 작업 기록은Logs\에 남습니다. exe 파일 하나만 옮기면 동작하지 않습니다.
처음 쓸 때 내려받는 것 (한 번만):
| 항목 | 크기 | 언제 |
|---|---|---|
| Whisper base / small 음성인식 모델 | 148MB / 488MB | 처음 "AI 자막 만들기" 할 때 |
| NLLB-200 번역 모델 | 약 910MB | 처음 번역할 때 |
모델은 프로그램 폴더의 models\ 에 저장됩니다. (환경 변수 JJ_MKVMAKER_MODELS 로 위치 변경 가능)
인터넷 자막 찾기 (선택)
OpenSubtitles 의 무료 API 키가 필요합니다.
- opensubtitles.com 가입
- 프로필 → API consumers → New consumer 에서 키 만들기
- 프로그램의 환경 설정 → 인터넷 자막 에 키 입력 (아이디·비밀번호는 선택, 넣으면 하루 받기 횟수가 늘어남)
단축키
| 화면 | 단축키 |
|---|---|
| 플레이어 | Space 재생/정지 · ←/→ 10초 · Shift+←/→ 1분 · ↑/↓ 음량 · F 전체 화면 · Esc 나가기 · N/P 다음/이전 · M 음소거 · S 자막 · L 재생 목록 |
| 자막 편집 | Ctrl+Space 재생/정지 · Alt+←/→ 1초 · Alt+Shift+←/→ 0.1초 · F7 새 줄 · F8 선택 줄 재생 · F9 시작=현재 · F10 끝=현재 |
| 브라우저 | Ctrl+L 주소창 · F5 새로고침 · Alt+←/→ 뒤로/앞으로 · Ctrl+D 즐겨찾기 · Ctrl+Shift+B 즐겨찾기 관리 · Ctrl+Shift+J 작업 현황 |
| 어디서나 | Ctrl+Shift+X 창 보이기 / 트레이로 숨기기 (환경 설정에서 변경) |
버전
년.월.일_순번 (예: 2026.09.30_001). 같은 날 다시 내면 순번이 늘고, 날이 바뀌면 001 부터 다시 시작합니다.
번호 올리기: powershell -File tool\next_version.ps1 (pubspec.yaml 에는 Flutter 형식 2026.9.30+1 로 적힙니다)
소스에서 빌드
필요: Flutter 3.47+, Visual Studio 2022 Build Tools (C++ 데스크톱), Windows 개발자 모드, PATH 에 nuget.exe (앱 안 브라우저 WebView2 빌드용)
git clone <이 저장소>
cd app
powershell -File tool\fetch_ffmpeg.ps1 # third_party\ffmpeg\windows 에 FFmpeg 준비
powershell -File tool\fetch_tools.ps1 # third_party\tools\windows 에 yt-dlp · aria2 · Deno 준비
powershell -File tool\fetch_rsync.ps1 # third_party\rsync\windows 에 rsync (MSYS2, SHA256 고정) 준비
flutter pub get
flutter build windows --release # build\windows\x64\runner\Release
Android 의 rsync: Git Bash 에서 sh tool/build_rsync_android.sh (Android NDK 로 rsync 3.4.1 소스를 빌드해 third_party/rsync/android 에 둠, APK 에 들어감)
테스트: flutter test (AI 모델 · 인터넷이 필요한 테스트는 자동으로 건너뜀)
구조
lib/
├─ core/ 자막 · 문자셋 · FFmpeg 명령 · 재생 목록 규칙 등 순수 로직 (플랫폼 무관)
├─ app/ 화면 상태 · 설정 · 다운로드 관리
├─ ui/ 화면 (어두운 테마)
├─ services/ 플랫폼 경계 (인터페이스)
└─ platform/
├─ common/ Windows · Android 공용 구현 (mpv 플레이어, Whisper, NLLB, OpenSubtitles)
└─ windows/ Windows 전용 (FFmpeg 프로세스, 트레이, 단축키, 탐색기 메뉴, yt-dlp, aria2)
packages/whisper_ggml/ Windows 힙 손상 버그를 고친 whisper_ggml 사본 (JJ_PATCH.md)
Android 이식 시 platform/android/ 구현과 services/platform_services.dart 분기만 추가하면 됩니다.
라이선스
- JJ_MKVMaker 소스 코드: MIT
- 포함 · 사용하는 구성 요소: THIRD_PARTY_NOTICES.txt (라이선스 원문: assets/licenses)
- FFmpeg · yt-dlp 실행 파일 · rsync (GPLv3+) · aria2 (GPLv2+) 는 수정하지 않은 별도 실행 파일로 함께 제공
- libmpv (LGPL), PDFium (BSD), whisper.cpp · ONNX Runtime · stable-diffusion.cpp (MIT), Deno (MIT)
- Android 판은 GPLv3 구성 요소 (FFmpegKit · youtubedl-android · rsync) 를 포함하며, 대응 소스는 같은 판 번호의 태그 (예: v1.2.3) 입니다.
- NLLB-200 번역 모델은 CC-BY-NC 4.0 (비상업적 이용만) — 이 프로그램은 무료 배포이며, 모델은 사용자가 직접 내려받습니다
주의
- YouTube 등에서 받은 영상, 토렌트로 받은 파일, 인터넷에서 받은 자막의 저작권 책임은 이용자에게 있습니다. 권리가 있는 콘텐츠만 받으세요. YouTube 이용 약관도 확인하세요.
- 토렌트는 받는 동안 다른 사용자에게 조각을 올려 줍니다. 받기가 끝나면 올려 주기(시딩)는 바로 멈춥니다.
- "CapCut", "MakeMKV", "VLC" 는 각 소유자의 상표이며 이 프로그램과 관계가 없습니다.