ffmpeg 命令在脚本内默默失败,但直接运行时有效

ffmpeg 命令在脚本内默默失败,但直接运行时有效

有一个脚本可以生成使用 ffmpeg 在屏幕内运行的 rtmp 流,但由于某种原因失败了?如果它直接在命令行中运行它,它就可以工作,所以我尝试通过打开 > screen 来运行它,运行它并使用 ctrl + d 关闭屏幕,但即使如此,它有时也会因原因关闭。

有没有办法从脚本内的 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.哦,因为您不希望它一直覆盖 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

答案2

如果没有更多信息,我首先想到的是,当您运行脚本时,您可能拥有一个最小的环境。你是从 cron 运行它吗?如果是这样,您可能无法访问 $CHANNEL 等。

在任何情况下,您都可以使用 2> 调用脚本,将标准错误输出重定向到文件。例如:

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

如果您从脚本调用 ffmpeg,那么您应该在该脚本内的 ffmpeg 命令末尾添加重定向。您可以在脚本中执行类似的操作:

ffmpeg (your-params-here) > result.log 2> error.log

答案3

尝试将-nostdin标志设置为ffmpeg.

尽管可能与顶级发布者的原始问题没有直接关系,但这是目前“ffmpeg 从脚本内失败”的最佳搜索结果,因此我无论如何都会分享我的发现,希望对其他人有所帮助。

每当ffmpegcat 'file' | while read INFILE ; do loop.在该循环之外运行ffmpeg或单独运行都可以正常工作。添加循环会导致它将数据转储到控制台。我不太清楚为什么,但添加-nostdin解决了我的问题,因为我认为 while read 和 ffmpeg 正在争夺标准输入。我愿意听取其他人关于为什么-nostdin在我的案例中有效的解释。

相关内容