O comando ffmpeg falha silenciosamente dentro do script, mas funciona quando executado diretamente

1

Tem um script que gera um fluxo rtmp que é executado dentro de uma tela usando o ffmpeg, mas isso falha por algum motivo? Se ele for executado diretamente na linha de comando, ele funcionará, então tentei executá-lo abrindo > tela, executá-lo e fechar a tela com ctrl + d, mas mesmo assim às vezes fecha por motivo.

Existe uma maneira de registrar o stderr do ffmpeg dentro do script para ver porque 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 ~

    
por C.Astraea 05.01.2018 / 09:46

3 respostas

3

Is there a way to log the stderr from ffmpeg inside the script to see why the command fails inside the script but works when run directly?

Aqui você vai, encaminhar fluxo 2, stderr, para um arquivo em tmp . Ah, e porque você não quer que ele sobrescreva o arquivo tmp o tempo todo, adicione o PID ao seu nome:

my_command 2> /tmp/ffmpeg_error$$.log

Agora, aplicado ao seu ffmpeg:

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 2> /tmp/ffmpeg_error$$.log
    
por 05.01.2018 / 10:41
1

Sem mais informações, a primeira coisa que me vem à mente é que, quando você executa o script, você provavelmente tem um ambiente mínimo. Você está executando 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:

./script.sh > result.log 2> error.log

Se você está chamando ffmpeg de um script, você deve adicionar redirecionamentos no final do seu comando ffmpeg dentro desse script. Você faria algo assim dentro do seu script:

ffmpeg (your-params-here) > result.log 2> error.log
    
por 05.01.2018 / 10:12
-1

Experimente o sinal -nostdin para ffmpeg .

Embora possivelmente não esteja diretamente relacionado à pergunta original dos top-posters, este é o principal resultado de pesquisa no momento em que "ffmpeg falha dentro do script", então estou compartilhando minhas descobertas na esperança de que alguém seja ajudado .

Eu bato isso sempre que estou executando ffmpeg de dentro de um cat 'file' | while read INFILE ; do loop . Executar ffmpeg 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 adicionando -nostdin curou meu problema, pois acho que o while read e ffmpeg estavam brigando por stdin. Estou aberto para ouvir explicações de outras pessoas sobre o motivo pelo qual -nostdin funcionou no meu caso.

    
por 13.06.2018 / 06:09