Tem um script que gera um fluxo rtmp que é executado dentro de uma tela usando ffmpeg, mas falha por algum motivo? Se rodar direto na linha de comando funciona então tentei rodar abrindo > screen , rodando e fechando a tela com ctrl + d mas mesmo assim as vezes fecha por motivo.
Existe uma maneira de registrar o stderr do ffmpeg dentro do script para ver por que o comando falha dentro do script, mas funciona quando executado diretamente?
#!/bin/bash
if [ "$1" = "run" ]; then
source $HOME/.bash_aliases
while [ 1 ]; do
ffmpeg -f x11grab -s 1000x563 -framerate 30 -i $DISPLAY+10,151 -f pulse -ac 2 -i default -c:v libx264 -preset ultrafast -tune zerolatency -x264opts keyint=30:min-keyint=10 -b:v 2000k -pix_fmt yuv420p -s 1000x562 -c:a aac -b:a 160k -ar 44100 -t '4:00:00' -threads 0 -f flv rtmp://IPADDRESS:1935/live1/$CHANNEL
done
else
killall -9 ffmpeg > /dev/null 2>&1
sleep 5s;
screen -ls | grep ffmpeg > /dev/null 2>&1
if [ "$?" = "1" ]; then
screen -mdS ffmpeg $0 run
fi
fi
Obrigado ~
Aqui está, encaminhe o fluxo 2, stderr, para um arquivo em
tmp
. Ah, e como você não quer sobrescrever o arquivo tmp o tempo todo, adicione o PID ao seu nome:Agora, aplicado ao seu ffmpeg:
Sem mais informações, a primeira coisa que me vem à cabeça é que, ao executar o script, você provavelmente terá um ambiente mínimo. Você está executando a partir do cron? Nesse caso, você pode não ter acesso a $CHANNEL, por exemplo.
Em qualquer caso, você pode chamar seu script usando 2> para redirecionar a saída de erro padrão para um arquivo. Por exemplo:
Se você estiver chamando o ffmpeg de um script, deverá adicionar redirecionamentos no final do comando ffmpeg dentro desse script. Você faria algo assim dentro do seu script:
Tente a
-nostdin
bandeira paraffmpeg
.Embora possivelmente não esteja diretamente relacionado à pergunta original dos principais pôsteres, este é o principal resultado da pesquisa no momento para "ffmpeg falha de dentro do script", então estou compartilhando minha descoberta de qualquer maneira na esperança de que alguém seja ajudado.
Eu acertei isso sempre que corri
ffmpeg
de dentro de um arquivocat 'file' | while read INFILE ; do loop
. Executarffmpeg
fora desse loop ou por si só funcionaria bem. Adicionar o loop faria com que ele despejasse dados no console. Não sei exatamente por que, mas adicionar-nostdin
curou meu problema, pois acho que o while read e o ffmpeg estavam brigando por stdin. Estou aberto a ouvir as explicações de outras pessoas sobre o motivo pelo qual-nostdin
funcionou no meu caso.