ffmpegコマンドはスクリプト内で自動的に失敗しますが、直接実行すると機能します。

ffmpegコマンドはスクリプト内で自動的に失敗しますが、直接実行すると機能します。

ffmpegを使用して画面内で実行されるrtmpストリームを生成するスクリプトがありますが、どのような理由で失敗しますか?コマンドラインから直接実行すると動作するので > screen を開いて実行した後 ctrl+d で screen をオフにして実行してみましたが、それでもなんとなく終了することがあります。

スクリプト内でコマンドが失敗しますが、直接実行した場合に動作する理由を確認するために、スクリプト内のffmpegからstderrを記録する方法はありますか?

#!/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

ありがとうございます〜

ベストアンサー1

スクリプト内でコマンドが失敗しますが、直接実行した場合に動作する理由を確認するために、スクリプト内のffmpegからstderrを記録する方法はありますか?

ここでは、ストリーム2、stderrをtmp.Aに渡し、tmpファイルを上書きしたくないので、名前にPIDを追加します。

my_command 2> /tmp/ffmpeg_error$$.log

今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

おすすめ記事