Uma versão "simples" da aplicação.

Primeiro é assumido que a entrada tem uma faixa de vídeo, e uma faixa de áudio, não serão feitas verificações nessa versão. É esperado que o contêiner suporta operações de busca "seek". Pois ele será acessado diretamente via HTTP pelo ffmpeg no cliente, e isso reduziria a carga no servidor.

Inicialmente o video será dividido em segmentos com uma duração fixa, mas futuramente pode ser separado por número de quadros. Enquanto o áudio será processado como um único segmento.

Para adicionar um arquivo para ser processado, será necessário preencher quatro campos, encoder de vídeo, encoder de áudio, parâmetros de vídeo e parâmetros de áudio. Os parâmetros serão passados para o ffmpeg entre o encoder e a saída.
Ex. ffmpeg $INPUT -c $ENCODER $PARAMS $OPTIONS $OUTPUT.

No exemplo, $OPTIONS seria usado pela aplicação para definir alguns parâmetros que o programa precisa para funcionar, como utilizar a saída padrão para passar informações do progresso da operação. $INPUT e $OUTPUT contém parâmetros para autenticação e para enviar a saída no formato correto para o servidor.

Essa versão não possui mecanismos de restrição de acesso, mas todas as operações serão autenticadas para identificar a origem, e assim registrar nos logs.

Na API REST haverá um método de gerar tokens de autenticação, todos os clientes, e usuários da interface web poderão utilizar esse método para gerar um token de acesso. Também deve ser possível verificar o andamento dos arquivos em processamento.

O servidor, deve fornecer um interface web capaz enviar um arquivo para processamento, exibir o andamento, e baixar a saída.

Fora a geração do token de autenticação, a entrada e saída das tarefas, a comunicação entre o cliente e o servidor se dá por gRPC.

Para que um cliente execute uma tarefa, o servidor irá enviar: a entrada, o caminho de saída, o tipo de tarefa e conforme o tipo, o intervalo da entrada, o encoder e os parâmetros.
Exemplo: a tarefa de juntar as partes possui os segmentos de vídeo, o segmento de áudio, e o caminho de saída. Outro exemplo, o servidor usará uma tarefa para obter a duração do arquivo e criar os segmentos. Para isso é enviada a entrada, o tipo e a saída, o servidor interpreta a saída para gerar os segmentos.

Futuramente informações sobre a implementação serão adicionadas nessa página.

Edit: Tentarei começar pela interface, e ir implementando as partes necessárias para prover as funcionalidades na interface web. Inicialmente, ao compilar o servidor, ele irá copiar o conteúdo dos arquivos para o binário e, então, fornecer os arquivos pela interface web. Essa interface será bem simplificada, focada em oferecer as funções necessárias para utilizar e monitorar o serviço, e não em uma boa experiência para o usuário.

Funcionalidade

Pela interface web, deve ser possível:

  • Enviar um arquivo para processamento
  • Inserir os argumentos a serem usados no FFmpeg
  • Visualizar as tarefas criadas, e o seu andamento
  • Visualizar os workers, e as tarefas que estão fazendo
  • Baixar os arquivos completos

Objetivo v0.1.0

Para essa versão, não será implementado autenticação, e apenas um worker irá processar o arquivo. O objetivo é desenvolver a interface e a arquitetura da aplicação. No caso de falha a tarefa é encerrada com erro.

É assumido que os arquivos possuem video e audio, e caso o cliente não informe os parâmetros, será utilizado valores padrões: -c:v libsvtav1 -preset 4 -crf 27 -c:a opus -b:a 96k.

Servidor

Arquivos

Como o servidor precisa armazenar arquivos em disco, será utilizado uma interface que associe um arquivo a um UUID. Dessa forma o programa possui acesso a uma simples abstração do sistema de arquivos.

Para simplificar essa versão, será utilizado uma pasta temporária, não necessariamente persistindo dados entre instâncias do programa.

Job manager

Job manager será responsável por gerenciar a entrada e saída de cada tarefa. Será utilizada a interface descrita acima para os arquivos.

A API web, permitirá acesso a algumas funções do job manager, por exemplo, para verificar os estados das tarefas, adicionar novas, e obter a saída.

API

Os jobs são incluídos via POST em /api/jobs.

A entrada, do job pode ser acessada em /api/jobs/{ID}/source.

Informações sobre os jobs, como os parâmetros, entrada, e suas tasks ficam disponíveis em /api/jobs/{ID}/info

Clientes conectados

O servidor mantém uma lista dos clientes 'conectados'. Essa lista pode identificar quais tarefas um cliente está executando.

API gRPC

Essa é a interface acessada pelos clientes. Essa interface é utilizada por permitir streaming de forma simples do que utilizar uma API REST.

Internamente o servidor expõe uma interface nativa, sendo a base da gRPC.

Clientes

Os clientes criarão uma conexão com o servidor, e serão registrados como clientes. O cliente então, deverá constantemente informar o seu estado, após algum tempo sem que o servidor receba uma atualização de estado, o cliente é removido do servidor.