Estou trabalhando na criação de vários fluxos codificados a partir da entrada de arquivo único (.mp4). Fluxo de entrada não tem áudio.
Cada fluxo codificado é criado cortando uma parte diferente da entrada e, em seguida, codificado com a mesma taxa de bits no sistema de 32 núcleos.
Aqui estão os cenários que estou tentando, como explicado no ffmpeg wiki, para criar múltiplas saídas.
link
Scenario1 (usando uma única instância do ffmpeg)
ffmpeg -i input.mp4 \
-filtro: v crop = iw / 2: ih / 2: 0: 0 -c: v libx264 -b: v 5M out_1.mp4 \
-filtro: v cultura = iw / 2: ih / 2: iw / 2: 0 -c: v libx264 -b: v 5M out_2.mp4 \
-filtro: v crop = iw / 2: ih / 2: 0: ih / 2 -c: v libx264 -b: v 5M out_3.mp4
Neste caso, estou assumindo que o ffmpeg decodificará a entrada apenas uma vez e será fornecido a todos os filtros de cultura. Por favor, corrija-me se isso não estiver certo.
Scenario2 (Usando várias instâncias do ffmpeg e, portanto, três processos separados)
ffmpeg -i input.mp4 -filtro: v crop = iw / 2: ih / 2: 0: 0 -c: v libx264 -b: v 5M out_1.mp4
ffmpeg -i input.mp4 -filtro: v cultura = iw / 2: ih / 2: iw / 2: 0 -c: v libx264 -b: v 5M out_2.mp4
ffmpeg -i input.mp4 -filtro: v crop = iw / 2: ih / 2: 0: ih / 2 -c: v libx264 -b: v 5M out_3.mp4
No meu caso, eu realmente preciso codificar um número ainda maior de fluxos cortando seções diferentes do vídeo de entrada. Estou mostrando três aqui apenas para simplificar este exemplo.
Agora, em termos de desempenho do fps, vejo que o cenário 2 tem melhor desempenho. Ele também usa cpu ao máximo (mais de 95% de utilização da cpu).
O cenário 1 tem menos fps e a utilização da CPU é muito menor (perto de 65%). Além disso, neste caso, como eu aumento o número de fluxos a serem codificados, a utilização da CPU não aumenta linearmente. quase se torna 1,5x quando eu vou de um fluxo para dois. Mas depois disso, os incrementos são muito baixos (provavelmente 10% e até menos com mais streams).
Então, minha pergunta é:
Eu quero usar ffmpeg de instância única porque evita a decodificação várias vezes e também, porque a entrada que eu tenho poderia ser tão grande quanto 4K ou até maior.
O que devo fazer para obter melhor utilização da CPU (> 90%) e, consequentemente, melhores fps? também, por que a utilização da cpu não está aumentando linearmente com o número de fluxos a serem codificados?
Por que a instância única do ffmpeg não é tão boa quanto várias instâncias? Parece-me que, com uma única instância do ffmpeg, todos os códigos não estão sendo executados em paralelo.
Editar:
Aqui está a maneira mais simples possível de reproduzir e explicar o problema, caso as coisas não sejam tão claras. Tenha em mente que isso é apenas para fins experimentais para entender o problema.
Instância única: ffmpeg -y -i input.mp4 -c: v libx264 -x264opts threads = 1 -b: v 1M -f null - -c: v libx264 -x264opts threads = 1 -b: v 1M -f null - -c: v encadeamentos libx264 -x264opts = 1 -b: v 1M -f nulo -
Várias Instâncias: ffmpeg -y -i input.mp4 -c: v libx264 -x264opts threads = 1 -b: v 1M -f null - | ffmpeg -y -i input.mp4 -c: v encadeamentos libx264 -x264opts = 1 -b: v 1M -f null - | ffmpeg -y -i input.mp4 -c: v encadeamentos libx264 -x264opts = 1 -b: v 1M -f nulo -
Note que estou limitando x264 a um único thread. No caso de instância única, eu esperaria que o ffmpeg gerasse um encadeamento de codificação para cada codificação x264 e os executasse em paralelo. Mas vejo que apenas um núcleo de cpu é totalmente utilizado, o que me faz acreditar que apenas uma sessão de codificação está sendo executada por vez. Por outro lado, com o caso de várias instâncias, vejo que três núcleos cpu são totalmente utilizados, o que significa que todos os três códigos estão sendo executados em paralelo.
Eu realmente espero que alguns especialistas possam participar e ajudar com isso.