{"id":28799690,"url":"https://github.com/brunojcamargo/transcoder","last_synced_at":"2026-05-06T17:34:28.324Z","repository":{"id":295362792,"uuid":"989851412","full_name":"brunojcamargo/transcoder","owner":"brunojcamargo","description":"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.","archived":false,"fork":false,"pushed_at":"2025-05-25T22:01:07.000Z","size":154,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-22T06:28:18.666Z","etag":null,"topics":["docker","ffmpeg","go","hls","transcoder"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brunojcamargo.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-25T00:51:11.000Z","updated_at":"2025-05-27T22:13:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"47d3d108-a19b-4833-a3d4-89ecdbd9077e","html_url":"https://github.com/brunojcamargo/transcoder","commit_stats":null,"previous_names":["brunojcamargo/transcoder"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/brunojcamargo/transcoder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunojcamargo%2Ftranscoder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunojcamargo%2Ftranscoder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunojcamargo%2Ftranscoder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunojcamargo%2Ftranscoder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brunojcamargo","download_url":"https://codeload.github.com/brunojcamargo/transcoder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunojcamargo%2Ftranscoder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32704520,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T08:33:17.875Z","status":"ssl_error","status_checked_at":"2026-05-06T08:33:17.221Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","ffmpeg","go","hls","transcoder"],"created_at":"2025-06-18T07:00:18.132Z","updated_at":"2026-05-06T17:34:28.308Z","avatar_url":"https://github.com/brunojcamargo.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"🎞️ HLS Transcoder (Go + FFmpeg (CPU/GPU) )\n================================\n\n**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`.\n\n* * *\n\n🚀 O que ele faz\n----------------\n\n*   Recebe um vídeo de entrada (`.mp4` ou `.ts`)\n*   Gera múltiplos \"flavors\" (resoluções): de `2160p`, `1080p`,`720p`,`480p`,`360p` e `180p`\n*   Cria arquivos segmentados `.ts` e playlists `.m3u8` para cada resolução\n*   Gera um **manifesto adaptativo** `master.m3u8` com todas as versões\n*   Inclui um player HTML\n\n![Fluxo](flow.png)\n\n* * *\n\n🛠️ Tecnologias usadas\n----------------------\n\n*   **Go** – servidor HTTP + execuções paralelas com goroutines\n*   **FFmpeg** – transcodificação real dos vídeos\n*   **HLS.js** – reprodução do vídeo HLS no navegador com seletor de qualidade\n*   **Docker** - para rodar o projeto.\n\n* * *\n\n▶️ Como rodar\n-------------\n\n1.  Coloque um vídeo em `input/input.mp4` ou `input/input.ts`\n2.  Execute o projeto com:\n    `docker compose up`\n3.  No navegador, acesse:\n    *   `http://localhost:8666/transcode` → inicia a transcodificação\n    *   `http://localhost:8666/hls.html` → player\n    *   `http://localhost:8666/progress` → retorna o progresso % de cada flavor\n\n* * *\n\n## ⚙️ Processamento Paralelo\n\nEste 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.\n\n### 🔄 Como funciona:\n- Cada tarefa de transcodificação é executada em uma **goroutine separada**.\n- O uso de `sync.WaitGroup` garante que o programa aguarde a finalização de todas as resoluções antes de continuar.\n- Isso permite ganhos significativos de performance, especialmente em servidores com múltiplos núcleos.\n\n\u003e ✅ Resultado: Transcodificações muito mais rápidas do que um processamento sequencial.\n\n* * *\n\n⚠️ Limitações\n-------------\n\n*   Funciona **apenas com HLS** (não gera arquivos para DASH, CMAF, WebM etc.)\n*   Não faz upload via navegador (input deve estar no diretório local)\n*   Não possui persistência ou banco de dados\n*   Não aplica DRM\n\n* * *\n\n📚 Objetivo\n-----------\n\nEste projeto foi feito durante um estudo prático sobre transcodificação, streaming adaptativo (ABR), containers de mídia e servidores simples em Go.\n\n* * *\n🧪 Teste Local CPU\n--------------------------------\n### 📽️ Detalhes do Vídeo de Entrada\n\n*   **Duração:** 2 minutos e 50 segundos\n*   **Resolução:** 3840x2160 (4K UHD)\n*   **Codec de vídeo:** VP9 (Profile 0)\n*   **Codec de áudio:** AAC (stereo, 127 kbps)\n*   **Frame rate:** 29.97 fps\n*   **Tamanho do arquivo:** 193.873.781 bytes (~193,9 MB)\n*   **Bitrate médio:** ~9.991 kbps\n*   **Arquivo de entrada:** `input.mp4`\n*   **Data de criação:** 24/05/2025 (via metadata)\n\n⚙️ Transcodificação\n----------------------------\n\n*   **Tempo total:** 15 minutos e 48.60 segundos `pode variar de acordo com os recursos disponives.`\n\n### 📤 Flavors gerados\n\n| Qualidade | Resolução   | Bitrate alvo | Caminho de saída    |\n|-----------|-------------|--------------|---------------------|\n| 2160p     | 3840x2160   | 14.000 kbps  | `output/2160p`      |\n| 1080p     | 1920x1080   | 6.000 kbps   | `output/1080p`      |\n| 720p      | 1280x720    | 3.000 kbps   | `output/720p`       |\n| 480p      | 854x480     | 1.000 kbps   | `output/480p`       |\n| 360p      | 640x360     | 600 kbps     | `output/360p`       |\n| 180p      | 320x180     | 300 kbps     | `output/180p`       |\n\n### 🖥️ Hardware utilizado\n\n- **CPU:** Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz\n- **RAM:** 16 GB\n\n### 💾 Uso de Disco\n*   **Total gerado:** 558,6 MB\n*   **Itens gerados:** 182 arquivos\n* * *\n\n🧪 Teste Local CPU (\u003c=360p | GPU \u003e 360p)\n--------------------------------\n### 📽️ Detalhes do Vídeo de Entrada\n\n*   **Duração:** 2 minutos e 50 segundos\n*   **Resolução:** 3840x2160 (4K UHD)\n*   **Codec de vídeo:** VP9 (Profile 0)\n*   **Codec de áudio:** AAC (stereo, 127 kbps)\n*   **Frame rate:** 29.97 fps\n*   **Tamanho do arquivo:** 193.873.781 bytes (~193,9 MB)\n*   **Bitrate médio:** ~9.991 kbps\n*   **Arquivo de entrada:** `input.mp4`\n*   **Data de criação:** 24/05/2025 (via metadata)\n\n⚙️ Transcodificação\n----------------------------\n\n*   **Tempo total:** 4 minutos e  25.98 segundos `pode variar de acordo com os recursos disponives.`\n\n### 📤 Flavors gerados\n\n| Qualidade | Resolução   | Bitrate alvo | Caminho de saída    |\n|-----------|-------------|--------------|---------------------|\n| 2160p     | 3840x2160   | 14.000 kbps  | `output/2160p`      |\n| 1080p     | 1920x1080   | 6.000 kbps   | `output/1080p`      |\n| 720p      | 1280x720    | 3.000 kbps   | `output/720p`       |\n| 480p      | 854x480     | 1.000 kbps   | `output/480p`       |\n| 360p      | 640x360     | 600 kbps     | `output/360p`       |\n| 180p      | 320x180     | 300 kbps     | `output/180p`       |\n\n### 🖥️ Hardware utilizado\n\n- **CPU:** Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz\n- **GPU:** Intel UHD Graphics 630, AMD Radeon Pro 5300M\n- **RAM:** 16 GB\n\n### 💾 Uso de Disco\n*   **Total gerado:** 558,6 MB\n*   **Itens gerados:** 182 arquivos\n* * *\n\n🧪 Teste Local CPU (\u003c=360p | GPU \u003e 360p)\n--------------------------------\n### 📽️ Detalhes do Vídeo de Entrada\n\n*   **Duração:** 2 horas, 2 minutos e 0 segundos\n*   **Resolução:** 1920x1080 (Full HD)\n*   **Codec de vídeo:** H.264 (Main)\n*   **Codec de áudio:** AAC (stereo, 320 kbps)\n*   **Frame rate:** 29,97 fps\n*   **Tamanho do arquivo:** 4.103.518.112 bytes (~4,10 GB)\n*   **Bitrate médio:** ~4.484 kbps\n*   **Arquivo de entrada:** `input.ts`\n*   **Data de criação:** *não disponível nos metadados*\n\n⚙️ Transcodificação\n----------------------------\n\n*   **Tempo total:** 1 h 27 m 1.32 segundos `pode variar de acordo com os recursos disponives.`\n\n### 📤 Flavors gerados\n\n| Qualidade | Resolução   | Bitrate alvo | Caminho de saída    |\n|-----------|-------------|--------------|---------------------|\n| 2160p     | 3840x2160   | 14.000 kbps  | `output/2160p`      |\n| 1080p     | 1920x1080   | 6.000 kbps   | `output/1080p`      |\n| 720p      | 1280x720    | 3.000 kbps   | `output/720p`       |\n| 480p      | 854x480     | 1.000 kbps   | `output/480p`       |\n| 360p      | 640x360     | 600 kbps     | `output/360p`       |\n| 180p      | 320x180     | 300 kbps     | `output/180p`       |\n\n### 🖥️ Hardware utilizado\n\n- **CPU:** Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz\n- **GPU:** Intel UHD Graphics 630, AMD Radeon Pro 5300M\n- **RAM:** 16 GB\n\n### 💾 Uso de Disco\n*   **Total gerado:** 24,31 GB\n*   **Itens gerados:** 7.333 arquivos\n* * *","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrunojcamargo%2Ftranscoder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrunojcamargo%2Ftranscoder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrunojcamargo%2Ftranscoder/lists"}