- A transcodificação multithread da CLI do FFmpeg foi apresentada em sua primeira forma “totalmente funcional” após cerca de 2 anos de trabalho e mais de 700 commits preparatórios
- Como o escopo das mudanças é grande, ainda existe a possibilidade de que alguns recursos tenham sido quebrados, e testes e revisão seguem como tarefas centrais antes da mesclagem real
-fix_sub_duration_heartbeatdificilmente evita comportamento não determinístico em execução assíncrona por causa das suposições de sincronização entre decoder, encoder e muxer- O overhead de threading em geral é pequeno, mas em tarefas com pouquíssimo trabalho por pacote o custo pode se destacar mais do que o ganho de desempenho
- Se o gargalo não estiver concentrado em um único componente e cada componente ainda não estiver totalmente multithread, o uso de CPU e o tempo real de processamento podem melhorar bastante em ambientes multicore
Pontos principais do patch de multithreading da CLI do FFmpeg
- Após cerca de 2 anos de trabalho e mais de 700 commits preparatórios, a primeira versão “fully functional” da CLI multithread do FFmpeg foi publicada como um conjunto de patches
- Como a escala das mudanças é grande, pode haver quebras ainda não identificadas, então são necessários testes e revisão com base em casos reais de uso
- Em geral, o overhead de threading é pequeno, mas em workloads com pouquíssimo trabalho por pacote esse overhead pode se tornar relevante
- Se a transcodificação não for dominada por um único componente e cada componente ainda não estiver saturado por seu próprio multithreading, o uso de CPU e o tempo de execução podem melhorar em sistemas multicore
Restrições de funcionamento e problemas conhecidos
- A opção
-fix_sub_duration_heartbeatna estrutura atual pressupõe sincronização entre componentes separados- O fluxo-alvo é a sincronização do encoder e muxer para o decoder
- Quando cada componente roda de forma assíncrona, o comportamento se torna fundamentalmente não determinístico
- Hoje o comportamento já é difícil de prever, mas ao executar com a mesma opção os resultados entre execuções são determinísticos
- No patch 16/24, essa opção é desativada, e será necessária uma forma melhor de tratá-la
Composição do conjunto de 24 patches
- O conjunto de patches é composto por 24 partes no total
- 01-09/24 são correções preparatórias e podem ser enviadas antes do restante da série
- 10-17/24 movem codificação e filtragem para threads e fazem as mudanças preparatórias necessárias
- O threading nessa etapa é “falso”, no sentido de que a thread principal espera a conclusão das outras, então ainda não há execução realmente paralela
- Como o overhead temporário pode ser grande ou alguns corner cases podem quebrar, é mais adequado enviar isso depois que o conjunto completo estiver pronto
- 18/24 é o maior patch individual e adiciona o scheduler de transcodificação, mas nesse ponto ele ainda não funciona de fato
- 19-24/24 convertem componentes individuais para usar o scheduler
- Eles foram separados para facilitar a revisão, mas devem ser combinados no envio final
- Materiais relacionados podem ser vistos no vídeo recente da apresentação no VDD e no branch
ffmpeg_threading- VDD talk
- ffmpeg_threading branch
1 comentários
Opiniões no Hacker News
Em um servidor ARM de 4 núcleos, ficou cerca de 2 vezes mais rápido, e o overhead da paralelização não parece ser grande
ffmpeg_threading/ffmpeglevou 7,771 segundos, enquanto offmpegexistente levou 13,841 segundos, com uso de CPU de 218% e 114%, respectivamenteFico curioso para saber como seria usando aceleração por hardware tanto para decodificação quanto para codificação de vídeo em uma placa NVIDIA:
ffmpeg -hwaccel cuda -i $inputFile -codec:a copy -codec:v hevc_nvenc $outputAs outras operações parecem ter um custo de desempenho relativamente pequeno, então, embora a melhoria seja bem-vinda, imagino que o impacto real seja bastante limitado
Teria sido melhor linkar https://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/3165... em vez do tweet
No fim, o ponto principal do tweet também é esse link
Para entender isso, é bom assistir à apresentação do Anton no VideoLAN Dev Days 2023: https://www.youtube.com/watch?v=Z4DS3jiZhfo&t=1221
Isso me faz imaginar um caminho para lidar de forma mais poderosa com animação de propriedades
O tweet aponta para http://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/31655..., que por sua vez referencia o código em https://git.khirnov.net/libav.git/log/?h=ffmpeg_threading
Fico curioso se isso será aplicado automaticamente ou se será preciso combinar parâmetros de linha de comando de forma complicada
Fico curioso se existe algum software de edição de vídeo que use ffmpeg
Em certo momento pensei em criar algo que desenhasse formas em SVG e usasse ffmpeg, ou que adicionasse uma UI, ou apenas texto, mas não cheguei a começar
O Avidemux tem um pouco essa vibe, e o interior do ffmpeg é bem cru; como ele não foi feito para ser acessado por uma GUI, um editor baseado nele provavelmente seria lento, estranho e difícil de manter
Algo como um editor modular que gerasse prévias com um descritor de comandos ou um visualizador de pipeline parece possível
O ffmpeg é poderoso, mas o fato de ser usado apenas pela linha de comando acaba afastando alguns usuários. No passado escrevi um script em Python que recebia um número aleatório de clipes e criava um mosaico com o filtro
xstack, mas não foi fácilhttps://vsdb.top/
https://www.vapoursynth.com/
Como software de nicho baseado em ffmpeg, vi o losslesscut: https://github.com/mifi/lossless-cut
O Staxrip também é grande: https://github.com/staxrip/staxrip
Mas não conheço bem um editor “completo”
Seria bom se as pequenas tarefas de transcodificação que faço para o Plex ficassem mais rápidas
Minha placa de vídeo não oferece suporte a transcodificação por hardware, então estou animado
Eu estava procurando formas de aumentar a velocidade de transcodificação, e uma era a aceleração por GPU, enquanto a outra era aumentar o número de threads
Só que é difícil encontrar o número ideal de threads
Mas, se possível, aceleração por GPU é muito melhor
Fico curioso sobre quais são os requisitos de licença para uma implantação em larga escala do ffmpeg. Em que casos é preciso pagar?
http://ffmpeg.org/legal.html
Ou seja, é gratuito, mas, se você usar alguns módulos, pode haver problemas ao misturá-lo com código proprietário
É bom ver o FFmpeg melhorando. Espero que em breve também vejamos suporte a Dolby AC4