tglima
(usa Manjaro Linux)
Enviado em 26/02/2016 - 16:55h
Depois de quase 3 dias batendo cabeça, consegui resolver a minha dúvida. Como acredito que a solução que encontrei pode ser válida para outras inúmeras situações, vou postar o código completo. Depois tento explicar um pouco dessa bagunça que fiz.
#!/bin/bash
# Essas linhas abaixo são responsáveis pela obtenção da data e hora que serão gravados no log.
hoje=⁠⁠⁠⁠⁠⁠$(date +"%d-%m-%y");
horario=$(date +"%H:%M:%S");
# Linhas responsáveis pela criação do log. Elas copiam toda a saída do terminal
# e registram num arquivo de texto especifico.
LOGFILE=convert4xvid.$hoje.txt
exec 1> >(tee -a "$LOGFILE")
#As linhas abaixo gravaram também as saídas com ERROS
exec 2>&1
#A linha abaixo, registra o horário que o processo foi iniciado dentro do arquivo de log.
echo -e "Processo iniciado as: $horario \n" >> $LOGFILE &&
barradeprogresso() {
#Abrimos o kdialg com a função progressbar depois de dois segundos
sleep 2;
barra=$(kdialog --title "Conversão em andamento" --progressbar "Processo de conversão iniciado" 100);
# Carregamos a variavel porc com o valor obtido no log do arquivo.
# São aplicados filtros para que ele busque os valores responsáveis pela porcentagem da conversão.
porc=(`cat $LOGFILE |grep %|cut -c22-24|tr -d ‘%‘|tail -n 1`);
# A rotina de repetição abaixo, verifica a cada 1 segundo o status da conversão
# apos verificar o status ela envia esse resultado para o Kdialog através do qdbus.
# Quando o status da conversão chegar em 100% o ciclo de verificação para.
while [ $porc != 100 ];
do
sleep 1;
porc=(`cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1`);
qdbus $barra Set "" value $porc > /dev/null;
done
# Como a conversão chegou em 100% a linha abaixo encerra o Kdialog
qdbus $barra close > /dev/null;
}
mencoder "$file" -o "$output_file" -vf scale="$resolution" -af channels=2 -ofps "$frames_por_segundo" -srate "$txaudio" -oac mp3lame -lameopts cbr:br=128:mode="$modeaudio" -ovc xvid -ffourcc XVID -xvidencopts bitrate="$txbitrate":vhq=2:threads=1:aspect="$aspectratio" -mc 3 >> $LOGFILE & barradeprogresso;
#Essa linha abaixo, registra o horário em que processo terminou.
echo "Conclusão do processo as: $horario" >> $LOGFILE
exit 0
Agora vamos para uma breve explicação de como consegui chegar ao resultado esperado.
Criei uma maneira de gerar um log em tempo real das saídas mostradas pelo mencoder, para isso usei essa parte do código:
hoje=⁠⁠⁠⁠⁠⁠$(date +"%d-%m-%y");
horario=$(date +"%H:%M:%S");
LOGFILE=convert4xvid.$hoje.txt
exec 1> >(tee -a "$LOGFILE")
exec 2>&1
Durante a conversão, o mencoder vai exibindo o status da conversão desse modo:
Pos: 0.1s 1f ( 1%) 0.00fps Trem: 0min 1mb A-V:0.000 [0:0]
Para que a barra de progresso exibisse o valor que me interessava, criei um filtro com a ajuda do grep, do cut, e do tr. O Comando abaixo acessa o log gerado e busca na última linha correspondente a informação que eu precisava.
cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1
Depois com a ajuda de um laço de repetição, fiz com que a cada 1 segundo fosse verificado o status da conversão e fosse passado para o kdialog através do qdbus. As linhas responsáveis por isso são essas abaixo:
while [ $porc != 100 ];
do
sleep 1;
porc=(`cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1`);
qdbus $barra Set "" value $porc > /dev/null;
done
O laço de repetição funcionará até o status da conversão chegar em 100. Depois como a conversão chegou em 100%, envio um sinal para encerrar o kdialog.
qdbus $barra close > /dev/null;
Inicialmente tive que criar 2 scripts, um fazia a conversão do arquivo e outro carregava as informações para o kdialog. Resolvi isso criando uma função e colocando todos os parâmetros referentes ao Kdialog dentro dele, chamei essa função de "barradeprogresso". Veja abaixo o código referente a função:
barradeprogresso() {
#Abrimos o kdialg com a função progressbar depois de dois segundos
sleep 2;
barra=$(kdialog --title "Conversão em andamento" --progressbar "Processo de conversão iniciado" 100);
# Carregamos a variavel porc com o valor obtido no log do arquivo.
# São aplicados filtros para que ele busque os valores responsáveis pela porcentagem da conversão.
porc=(`cat $LOGFILE |grep %|cut -c22-24|tr -d ‘%‘|tail -n 1`);
# A rotina de repetição abaixo, verifica a cada 1 segundo o status da conversão
# apos verificar o status ela envia esse resultado para o Kdialog através do qdbus.
# Quando o status da conversão chegar em 100% o ciclo de verificação para.
while [ $porc != 100 ];
do
sleep 1;
porc=(`cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1`);
qdbus $barra Set "" value $porc > /dev/null;
done
# Como a conversão chegou em 100% a linha abaixo encerra o Kdialog
qdbus $barra close > /dev/null;
}
Agora bastava carregar o mencoder e seus parâmetros + a função barradeprogresso simultaneamente.
mencoder "$file" -o "$output_file" -vf scale="$resolution" -af channels=2 -ofps "$frames_por_segundo" -srate "$txaudio" -oac mp3lame -lameopts cbr:br=128:mode="$modeaudio" -ovc xvid -ffourcc XVID -xvidencopts bitrate="$txbitrate":vhq=2:threads=1:aspect="$aspectratio" -mc 3 >> $LOGFILE & barradeprogresso;
Para terminar com chave de ouro, registro o horário final do processo dentro do log e encerro tudo com o status 0
#Essa linha abaixo, registra o horário em que processo terminou.
echo "Conclusão do processo as: $horario" >> $LOGFILE
exit 0
Sei que o script pode ser melhorado, mas fiquei muito feliz de ver ele funcionando da forma como eu queria.
Agradeço ao madrugada pela força. Mesmo tendo que pesquisar em muitos outros lugares depois, ele dedicou 5 minutos para tentar me ajudar. Valeu mesmo! :)