Como posso enfileirar processos?

3

Eu tenho uma câmera de vigilância e um programa grava vídeos quando um movimento é detectado. Basicamente, este programa salva o vídeo em um formato muito pesado.

Minha solução foi chamar um script que converte o vídeo usando o ffmpeg. O script é chamado toda vez que um vídeo é feito.

A conversão leva um tempo relativamente curto, mas muito uso da CPU. O problema surge quando um novo vídeo chega para ser convertido e a conversão do outro não foi concluída. Nessa situação, o script é chamado novamente, resultando em dois ou mais processos ffmpeg que fazem a máquina quase travar durante um tempo considerável.

Como posso enfileirar o trabalho de conversão, para ser executado depois que o anterior é feito? O que eu quero é ter apenas um processo de ffmpeg de cada vez.

    
por Tomas 18.09.2011 / 03:33

2 respostas

5

Você pode usar o programa batch que faz parte do pacote at (ferramentas para enfileiramento de tarefas). Ele é instalado por padrão em muitos sistemas.

    
por 18.09.2011 / 04:56
2

Eu configuraria um diretório de filas e faria com que um processo em segundo plano passasse pelo diretório de filas e gerasse a conversão de ffmpeg. E o exemplo do programa em segundo plano pode ser:

queue=/var/tmp/vidq
outdir=/var/tmp/videos
while true; do  # do forever
    for file in $queue/*; do
        name='basename $file'
        mv -f $file $queue/.current
        ffmpeg -i .current $outdir/$name
        touch -r $queue/.current $outdir/$name
        rm $queue/.current
    done
    sleep 300 # sleep for 5 minutes
done

Você teria que fazer algumas verificações de segurança, como se o arquivo na fila não fosse um arquivo de vídeo. E ajuste o valor do sono. Mas isso geraria o arquivo convertido com o mesmo nome e com o datestamp original.

Outra maneira é ter um bloqueio de arquivo que é verificado, quando o processo ffmpeg sai, o bloqueio é removido e outro processo pode ser iniciado, primeiro criando o bloqueio de arquivo. No entanto, isso significa que a lógica está agora no programa e deve controlar quais arquivos devem ser processados. A solução de diretório de filas acima significa que o programa front-end precisa apenas entregá-lo à fila.

    
por 18.09.2011 / 04:13