Go to file
RyuJongJin 65098287e8 시험: remote_idle_test 흔들림 고침을 rc_next f43f067 에서 가져옴 (slow() 0.1초 간격 · 3초 제한, SFTP 준비 단계 10초 - 15, 코드 변경 없음)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:34:31 +09:00
android WIP Android HWP · HWPX 보기 1단계 (관리자 지시 10/20): rhwp v0.8.7 (MIT, 커밋 1a76570 고정) 를 얇은 C ABI (tool/rhwp_ffi) 와 함께 NDK 로 빌드 (tool/build_rhwp_android.sh - git sparse 받기 · Rust 1.93.1 · Cargo.lock --locked · 16KB 정렬 · 경로 /jj 로 바꿈) → APK 의 libjj_rhwp.so 를 dart:ffi 로 · 보기 화면 HwpSource: 보는 쪽의 5쪽 묶음만 PDF 로 바꾸고 다음 묶음을 미리, 묶음마다 3분 제한, 실패한 묶음은 그 쪽에 이유 · 다시 보면 다시 · 닫으면 멈춤 · 파일 탐색기: 보기 컴포넌트를 켰을 때 앱 안에서, 열지 못하면 이유를 알리고 다른 앱으로 · 문서의 가로 쪽은 자동으로 반 나누지 않음 (내 판단) · 라이선스 화면 · Android 고지 · 시험 hwp_source_test (가짜 엔진, Windows 통합) (검토 대기) 2026-10-20 17:43:20 +09:00
assets WIP Android HWP · HWPX 보기 1단계 (관리자 지시 10/20): rhwp v0.8.7 (MIT, 커밋 1a76570 고정) 를 얇은 C ABI (tool/rhwp_ffi) 와 함께 NDK 로 빌드 (tool/build_rhwp_android.sh - git sparse 받기 · Rust 1.93.1 · Cargo.lock --locked · 16KB 정렬 · 경로 /jj 로 바꿈) → APK 의 libjj_rhwp.so 를 dart:ffi 로 · 보기 화면 HwpSource: 보는 쪽의 5쪽 묶음만 PDF 로 바꾸고 다음 묶음을 미리, 묶음마다 3분 제한, 실패한 묶음은 그 쪽에 이유 · 다시 보면 다시 · 닫으면 멈춤 · 파일 탐색기: 보기 컴포넌트를 켰을 때 앱 안에서, 열지 못하면 이유를 알리고 다른 앱으로 · 문서의 가로 쪽은 자동으로 반 나누지 않음 (내 판단) · 라이선스 화면 · Android 고지 · 시험 hwp_source_test (가짜 엔진, Windows 통합) (검토 대기) 2026-10-20 17:43:20 +09:00
integration_test next10: hwp_pdf (ced0ae9) + rsync_narrow (dfed3fa: 412 Rsync 화면 오른쪽 창 · 옵션 이름 줄바꿈) - 시험판 986 2026-10-20 17:54:41 +09:00
lib next10: hwp_pdf (ced0ae9) + rsync_narrow (dfed3fa: 412 Rsync 화면 오른쪽 창 · 옵션 이름 줄바꿈) - 시험판 986 2026-10-20 17:54:41 +09:00
packages Chrome 엔진: 관리자 권한이면 시작 안 함 (설정으로 허용) · 20초 안전망 · 인증 없는 숨긴 문 (207) · DNS 강제를 앱 시작 맨 앞에 2026-10-12 00:23:20 +09:00
test 시험: remote_idle_test 흔들림 고침을 rc_next f43f067 에서 가져옴 (slow() 0.1초 간격 · 3초 제한, SFTP 준비 단계 10초 - 15, 코드 변경 없음) 2026-10-20 18:34:31 +09:00
test_assets JJ_MKVMaker v1.0.0 2026-09-30 19:35:19 +09:00
test_driver JJ_MKVMaker v1.0.0 2026-09-30 19:35:19 +09:00
tool WIP Android HWP · HWPX 보기 1단계 (관리자 지시 10/20): rhwp v0.8.7 (MIT, 커밋 1a76570 고정) 를 얇은 C ABI (tool/rhwp_ffi) 와 함께 NDK 로 빌드 (tool/build_rhwp_android.sh - git sparse 받기 · Rust 1.93.1 · Cargo.lock --locked · 16KB 정렬 · 경로 /jj 로 바꿈) → APK 의 libjj_rhwp.so 를 dart:ffi 로 · 보기 화면 HwpSource: 보는 쪽의 5쪽 묶음만 PDF 로 바꾸고 다음 묶음을 미리, 묶음마다 3분 제한, 실패한 묶음은 그 쪽에 이유 · 다시 보면 다시 · 닫으면 멈춤 · 파일 탐색기: 보기 컴포넌트를 켰을 때 앱 안에서, 열지 못하면 이유를 알리고 다른 앱으로 · 문서의 가로 쪽은 자동으로 반 나누지 않음 (내 판단) · 라이선스 화면 · Android 고지 · 시험 hwp_source_test (가짜 엔진, Windows 통합) (검토 대기) 2026-10-20 17:43:20 +09:00
windows WIP 86 보충 (관리자 · 15): 덮어쓰기에도 받는 쪽이 더 새것이면 그대로 · Windows 에서 쓸 수 없는 이름은 미리 건너뜀 · 릴리스에 7-Zip 꼭 (검토 대기) 2026-10-17 14:47:39 +09:00
.gitignore whisper_ggml 사본: 분석에서 build · 플랫폼 폴더 제외, 플러그인 사본의 pubspec.lock 무시 2026-10-02 21:57:44 +09:00
.metadata JJ_MKVMaker v1.0.0 2026-09-30 19:35:19 +09:00
LICENSE JJ_MKVMaker v1.0.0 2026-09-30 19:35:19 +09:00
README.md 라이선스 고지 (62 · 63 · 64) · AI 릴리스 전 수정 (152 · 156 · 157 · 159) 2026-10-09 16:20:15 +09:00
analysis_options.yaml 모르는 구성 요소 보존 (225) · Tor 대기 표시 (226) · 막은 파일 주소 되돌림 (227) · 포트 다시 잡기 2026-10-11 22:56:22 +09:00
pubspec.lock Merge branch 'wifi_89' into next 2026-10-18 01:01:31 +09:00
pubspec.yaml 버전 2026.10.18_001 2026-10-18 12:03:22 +09:00

README.md

JJ_MKVMaker

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% [+], 환경 설정 · 종료 버튼
끌어다 놓기 · 오른쪽 클릭 어느 화면에서든 동영상 · 폴더를 놓으면 목록에 추가. 목록에서 오른쪽 클릭: 폴더 열기 · 재생 · 자막 만들기 · 자막 찾기 · 삭제

실행

  1. Releases 에서 JJ_MKVMaker_v*_win64.zip 을 받아 원하는 폴더에 풉니다.
  2. jj_mkvmaker.exe 를 실행합니다. (Windows 10/11 64비트)
  3. 폴더 전체가 프로그램입니다. 맨 위의 jj_mkvmaker.exe 는 Lib\ 안의 프로그램을 실행하는 시작 프로그램이고, 작업 기록은 Logs\ 에 남습니다. exe 파일 하나만 옮기면 동작하지 않습니다.

처음 쓸 때 내려받는 것 (한 번만):

항목 크기 언제
Whisper base / small 음성인식 모델 148MB / 488MB 처음 "AI 자막 만들기" 할 때
NLLB-200 번역 모델 약 910MB 처음 번역할 때

모델은 프로그램 폴더의 models\ 에 저장됩니다. (환경 변수 JJ_MKVMAKER_MODELS 로 위치 변경 가능)

인터넷 자막 찾기 (선택)

OpenSubtitles 의 무료 API 키가 필요합니다.

  1. opensubtitles.com 가입
  2. 프로필 → API consumers → New consumer 에서 키 만들기
  3. 프로그램의 환경 설정 → 인터넷 자막 에 키 입력 (아이디·비밀번호는 선택, 넣으면 하루 받기 횟수가 늘어남)

단축키

화면 단축키
플레이어 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" 는 각 소유자의 상표이며 이 프로그램과 관계가 없습니다.