https://github.com/brunojcamargo/transcoder
Este projeto foi criado com fins educacionais, para aprender como funciona o processo completo de transcodificação de vídeo adaptativa para HLS utilizando FFmpeg e Go.
https://github.com/brunojcamargo/transcoder
docker ffmpeg go hls transcoder
Last synced: 7 months ago
JSON representation
Este projeto foi criado com fins educacionais, para aprender como funciona o processo completo de transcodificação de vídeo adaptativa para HLS utilizando FFmpeg e Go.
- Host: GitHub
- URL: https://github.com/brunojcamargo/transcoder
- Owner: brunojcamargo
- Created: 2025-05-25T00:51:11.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2025-05-25T22:01:07.000Z (10 months ago)
- Last Synced: 2025-06-18T07:01:43.035Z (10 months ago)
- Topics: docker, ffmpeg, go, hls, transcoder
- Language: Go
- Homepage:
- Size: 150 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
🎞️ HLS Transcoder (Go + FFmpeg (CPU/GPU) )
================================
**Este projeto foi criado com fins educacionais**, para aprender como funciona o processo completo de **transcodificação de vídeo adaptativa para HLS** utilizando `FFmpeg` e `Go`.
* * *
🚀 O que ele faz
----------------
* Recebe um vídeo de entrada (`.mp4` ou `.ts`)
* Gera múltiplos "flavors" (resoluções): de `2160p`, `1080p`,`720p`,`480p`,`360p` e `180p`
* Cria arquivos segmentados `.ts` e playlists `.m3u8` para cada resolução
* Gera um **manifesto adaptativo** `master.m3u8` com todas as versões
* Inclui um player HTML

* * *
🛠️ Tecnologias usadas
----------------------
* **Go** – servidor HTTP + execuções paralelas com goroutines
* **FFmpeg** – transcodificação real dos vídeos
* **HLS.js** – reprodução do vídeo HLS no navegador com seletor de qualidade
* **Docker** - para rodar o projeto.
* * *
▶️ Como rodar
-------------
1. Coloque um vídeo em `input/input.mp4` ou `input/input.ts`
2. Execute o projeto com:
`docker compose up`
3. No navegador, acesse:
* `http://localhost:8666/transcode` → inicia a transcodificação
* `http://localhost:8666/hls.html` → player
* `http://localhost:8666/progress` → retorna o progresso % de cada flavor
* * *
## ⚙️ Processamento Paralelo
Este projeto utiliza **execução paralela com goroutines** para acelerar o processo de transcodificação. Cada resolução de vídeo (ex: 2160p, 1080p, 720p, etc.) é processada simultaneamente, aproveitando ao máximo os núcleos da CPU disponíveis.
### 🔄 Como funciona:
- Cada tarefa de transcodificação é executada em uma **goroutine separada**.
- O uso de `sync.WaitGroup` garante que o programa aguarde a finalização de todas as resoluções antes de continuar.
- Isso permite ganhos significativos de performance, especialmente em servidores com múltiplos núcleos.
> ✅ Resultado: Transcodificações muito mais rápidas do que um processamento sequencial.
* * *
⚠️ Limitações
-------------
* Funciona **apenas com HLS** (não gera arquivos para DASH, CMAF, WebM etc.)
* Não faz upload via navegador (input deve estar no diretório local)
* Não possui persistência ou banco de dados
* Não aplica DRM
* * *
📚 Objetivo
-----------
Este projeto foi feito durante um estudo prático sobre transcodificação, streaming adaptativo (ABR), containers de mídia e servidores simples em Go.
* * *
🧪 Teste Local CPU
--------------------------------
### 📽️ Detalhes do Vídeo de Entrada
* **Duração:** 2 minutos e 50 segundos
* **Resolução:** 3840x2160 (4K UHD)
* **Codec de vídeo:** VP9 (Profile 0)
* **Codec de áudio:** AAC (stereo, 127 kbps)
* **Frame rate:** 29.97 fps
* **Tamanho do arquivo:** 193.873.781 bytes (~193,9 MB)
* **Bitrate médio:** ~9.991 kbps
* **Arquivo de entrada:** `input.mp4`
* **Data de criação:** 24/05/2025 (via metadata)
⚙️ Transcodificação
----------------------------
* **Tempo total:** 15 minutos e 48.60 segundos `pode variar de acordo com os recursos disponives.`
### 📤 Flavors gerados
| Qualidade | Resolução | Bitrate alvo | Caminho de saída |
|-----------|-------------|--------------|---------------------|
| 2160p | 3840x2160 | 14.000 kbps | `output/2160p` |
| 1080p | 1920x1080 | 6.000 kbps | `output/1080p` |
| 720p | 1280x720 | 3.000 kbps | `output/720p` |
| 480p | 854x480 | 1.000 kbps | `output/480p` |
| 360p | 640x360 | 600 kbps | `output/360p` |
| 180p | 320x180 | 300 kbps | `output/180p` |
### 🖥️ Hardware utilizado
- **CPU:** Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
- **RAM:** 16 GB
### 💾 Uso de Disco
* **Total gerado:** 558,6 MB
* **Itens gerados:** 182 arquivos
* * *
🧪 Teste Local CPU (<=360p | GPU > 360p)
--------------------------------
### 📽️ Detalhes do Vídeo de Entrada
* **Duração:** 2 minutos e 50 segundos
* **Resolução:** 3840x2160 (4K UHD)
* **Codec de vídeo:** VP9 (Profile 0)
* **Codec de áudio:** AAC (stereo, 127 kbps)
* **Frame rate:** 29.97 fps
* **Tamanho do arquivo:** 193.873.781 bytes (~193,9 MB)
* **Bitrate médio:** ~9.991 kbps
* **Arquivo de entrada:** `input.mp4`
* **Data de criação:** 24/05/2025 (via metadata)
⚙️ Transcodificação
----------------------------
* **Tempo total:** 4 minutos e 25.98 segundos `pode variar de acordo com os recursos disponives.`
### 📤 Flavors gerados
| Qualidade | Resolução | Bitrate alvo | Caminho de saída |
|-----------|-------------|--------------|---------------------|
| 2160p | 3840x2160 | 14.000 kbps | `output/2160p` |
| 1080p | 1920x1080 | 6.000 kbps | `output/1080p` |
| 720p | 1280x720 | 3.000 kbps | `output/720p` |
| 480p | 854x480 | 1.000 kbps | `output/480p` |
| 360p | 640x360 | 600 kbps | `output/360p` |
| 180p | 320x180 | 300 kbps | `output/180p` |
### 🖥️ Hardware utilizado
- **CPU:** Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
- **GPU:** Intel UHD Graphics 630, AMD Radeon Pro 5300M
- **RAM:** 16 GB
### 💾 Uso de Disco
* **Total gerado:** 558,6 MB
* **Itens gerados:** 182 arquivos
* * *
🧪 Teste Local CPU (<=360p | GPU > 360p)
--------------------------------
### 📽️ Detalhes do Vídeo de Entrada
* **Duração:** 2 horas, 2 minutos e 0 segundos
* **Resolução:** 1920x1080 (Full HD)
* **Codec de vídeo:** H.264 (Main)
* **Codec de áudio:** AAC (stereo, 320 kbps)
* **Frame rate:** 29,97 fps
* **Tamanho do arquivo:** 4.103.518.112 bytes (~4,10 GB)
* **Bitrate médio:** ~4.484 kbps
* **Arquivo de entrada:** `input.ts`
* **Data de criação:** *não disponível nos metadados*
⚙️ Transcodificação
----------------------------
* **Tempo total:** 1 h 27 m 1.32 segundos `pode variar de acordo com os recursos disponives.`
### 📤 Flavors gerados
| Qualidade | Resolução | Bitrate alvo | Caminho de saída |
|-----------|-------------|--------------|---------------------|
| 2160p | 3840x2160 | 14.000 kbps | `output/2160p` |
| 1080p | 1920x1080 | 6.000 kbps | `output/1080p` |
| 720p | 1280x720 | 3.000 kbps | `output/720p` |
| 480p | 854x480 | 1.000 kbps | `output/480p` |
| 360p | 640x360 | 600 kbps | `output/360p` |
| 180p | 320x180 | 300 kbps | `output/180p` |
### 🖥️ Hardware utilizado
- **CPU:** Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
- **GPU:** Intel UHD Graphics 630, AMD Radeon Pro 5300M
- **RAM:** 16 GB
### 💾 Uso de Disco
* **Total gerado:** 24,31 GB
* **Itens gerados:** 7.333 arquivos
* * *