feat: adiciona documentação inicial no README.md com descrição do projeto, funcionalidades e instruções de uso
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
# Simple Multimedia Track Audio Editor
|
||||
|
||||
Editor simples de faixas multimídia para combinar vídeo, áudio e legendas em um único arquivo MKV — **sem reencoding**, apenas mux e ajuste de timestamps.
|
||||
|
||||
---
|
||||
|
||||
## Sobre o Projeto
|
||||
|
||||
Este software é um **tradutor** entre a complexidade do FFmpeg e a simplicidade que o usuário precisa. Em vez de lidar com índices de stream, flags e argumentos técnicos, o usuário trabalha com uma interface direta:
|
||||
|
||||
- *"Áudio em português está 1.2 segundos atrasado"*
|
||||
- *"Quero adicionar a legenda em inglês"*
|
||||
- *"Gerar o arquivo final"*
|
||||
|
||||
O MKV é tratado como um banco de dados multimídia: as operações são `INSERT` de faixas, `UPDATE` de timestamps e `SELECT` de informações via `ffprobe`. Nenhum byte de mídia é reprocessado.
|
||||
|
||||
---
|
||||
|
||||
## Funcionalidades
|
||||
|
||||
- Selecionar arquivo de vídeo base
|
||||
- Listar automaticamente as faixas existentes (áudio, legenda, vídeo) via `ffprobe`
|
||||
- Adicionar uma ou mais faixas de áudio externas
|
||||
- Adicionar uma ou mais faixas de legenda
|
||||
- Definir offset de sincronização por faixa (ex: `+1.2s`, `-0.5s`)
|
||||
- Editar o offset de faixas já presentes no arquivo original
|
||||
- Atribuir código de idioma ISO 639-2 a cada faixa (ex: `por`, `eng`)
|
||||
- Exportar faixas individuais para arquivo separado
|
||||
- Remover faixas externas adicionadas antes de gerar o arquivo
|
||||
- Gerar arquivo MKV com todas as faixas configuradas
|
||||
- Progresso em tempo real durante a geração
|
||||
- Cancelar a geração em andamento
|
||||
- Exibição legível de erros do FFmpeg
|
||||
|
||||
---
|
||||
|
||||
## Pré-requisitos
|
||||
|
||||
- [Rust](https://www.rust-lang.org/tools/install) (edição 2024)
|
||||
- [`ffmpeg`](https://ffmpeg.org/download.html) disponível no `PATH`
|
||||
- [`ffprobe`](https://ffmpeg.org/download.html) disponível no `PATH` (incluso na maioria das instalações do FFmpeg)
|
||||
|
||||
Verificar disponibilidade:
|
||||
|
||||
```bash
|
||||
ffmpeg -version
|
||||
ffprobe -version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Instalação e Execução
|
||||
|
||||
```bash
|
||||
# Clonar o repositório
|
||||
git clone <url-do-repositorio>
|
||||
cd simple-multimidia-track-audio-editor
|
||||
|
||||
# Verificar compilação
|
||||
cargo check
|
||||
|
||||
# Rodar os testes
|
||||
cargo test
|
||||
|
||||
# Executar a aplicação
|
||||
cargo run
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Como Usar
|
||||
|
||||
1. **Selecionar vídeo** — clique em "Selecionar vídeo" e escolha o arquivo base. As faixas existentes serão detectadas automaticamente.
|
||||
2. **Adicionar faixas** — use os formulários para adicionar áudio externo ou legendas. Configure idioma e offset de sincronização.
|
||||
3. **Editar faixas existentes** — ajuste o offset de faixas já presentes no arquivo original diretamente na lista.
|
||||
4. **Definir saída** — escolha o caminho do arquivo MKV de saída.
|
||||
5. **Gerar** — clique em "Gerar MKV". O progresso é exibido em tempo real. É possível cancelar a qualquer momento.
|
||||
|
||||
---
|
||||
|
||||
## Garantias do Domínio
|
||||
|
||||
| Invariante | Descrição |
|
||||
|---|---|
|
||||
| **Sem reencoding** | `-c copy` está sempre presente no comando gerado — nunca opcional, nunca configurável |
|
||||
| **`SyncOffset` sem ponto flutuante** | Armazenado como `i64` em milissegundos; a conversão para o formato do FFmpeg ocorre exclusivamente no adapter |
|
||||
| **`TrackId` opaco** | Não expõe índices internos do FFmpeg; o mapeamento para `-map N:tipo` é feito apenas no adapter |
|
||||
| **Output ≠ Source** | O projeto rejeita em construção se o caminho de saída for igual ao de entrada |
|
||||
|
||||
---
|
||||
|
||||
## Arquitetura
|
||||
|
||||
O projeto segue **Clean Architecture** com dependências sempre apontando de fora para dentro:
|
||||
|
||||
```
|
||||
UI (egui/eframe)
|
||||
└── Adapters (FfmpegGateway, FfprobeGateway, FilePickerAdapter)
|
||||
└── Application (Use Cases + Ports)
|
||||
└── Domain (Entities + Value Objects)
|
||||
```
|
||||
|
||||
### Estrutura de pastas
|
||||
|
||||
```
|
||||
src/
|
||||
├── domain/
|
||||
│ ├── entities/ # Project, VideoFile, AudioTrack, SubtitleTrack, MkvOutput, MediaTrackInfo
|
||||
│ └── value_objects/ # TrackId, SyncOffset (ms/i64), TrackLanguage, FilePath
|
||||
├── application/
|
||||
│ ├── use_cases/ # LoadMediaInfo, AddAudioTrack, AddSubtitle, AdjustSync, GenerateOutput, ...
|
||||
│ └── ports/ # Traits: MediaProcessorPort, MediaInfoPort, FileSystemPort
|
||||
├── adapters/
|
||||
│ ├── ffmpeg/ # FfmpegCommandBuilder, FfmpegGateway, FfprobeGateway
|
||||
│ └── filesystem/ # FilePickerAdapter
|
||||
├── infrastructure/
|
||||
│ └── process/ # Execução assíncrona do FFmpeg (tokio), cancelamento via oneshot
|
||||
├── ui/
|
||||
│ ├── app.rs # eframe::App — Project como única fonte de verdade
|
||||
│ └── components/ # Componentes egui reutilizáveis
|
||||
└── main.rs
|
||||
```
|
||||
|
||||
### Stack tecnológica
|
||||
|
||||
| Camada | Tecnologia |
|
||||
|---|---|
|
||||
| Interface | `egui` / `eframe` 0.27 |
|
||||
| Backend | Rust (`std::process::Command`) |
|
||||
| Async | `tokio` 1.x |
|
||||
| Erros | `anyhow` |
|
||||
| Serialização | `serde` + `serde_json` |
|
||||
| Diálogos nativos | `rfd` 0.14 |
|
||||
| Container de saída | MKV (Matroska) |
|
||||
|
||||
---
|
||||
|
||||
## Testes
|
||||
|
||||
33 testes unitários cobrindo:
|
||||
|
||||
- Value objects: `SyncOffset`, `TrackLanguage`, `FilePath`, `TrackId`
|
||||
- Entidades: `Project` (validações de invariantes)
|
||||
- Use cases: todos com mocks (sem I/O real)
|
||||
- `FfmpegCommandBuilder`: presença de `-c copy`, formato de `-itsoffset`, mapeamento de `-map`
|
||||
- `ExportTrack`: comportamento por tipo de faixa
|
||||
- `RemoveTrack`: remoção e erro para ID inexistente
|
||||
|
||||
```bash
|
||||
cargo test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Escopo da v1.0
|
||||
|
||||
**Incluso:**
|
||||
- Mux de múltiplas faixas de áudio e legenda
|
||||
- Ajuste de timestamps por faixa
|
||||
- Leitura de faixas existentes via `ffprobe`
|
||||
- Interface gráfica nativa multiplataforma
|
||||
|
||||
**Fora do escopo:**
|
||||
- Reencoding / transcodificação
|
||||
- Preview de vídeo embutido
|
||||
- Detecção automática de sincronização
|
||||
- Remoção de faixas existentes do arquivo original
|
||||
- Processamento em lote (batch)
|
||||
- Persistência do estado do projeto em disco
|
||||
|
||||
---
|
||||
|
||||
## Licença
|
||||
|
||||
A definir.
|
||||
Reference in New Issue
Block a user