有一个脚本可以生成一个使用 ffmpeg 在屏幕内运行的 rtmp 流,但由于某种原因失败了?如果它直接在命令行中运行它就可以工作,所以我尝试通过打开 > screen 来运行它,运行它并使用 ctrl + d 关闭屏幕,但即便如此它有时也会因为某种原因关闭。
有没有办法从脚本中的 ffmpeg 记录标准错误,以查看为什么命令在脚本中失败但直接运行时有效?
#!/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
谢谢~
在这里,将流 2,stderr 转发到
tmp
. 哦,因为您不希望它一直覆盖 tmp 文件,请将 PID 添加到其名称中:现在,应用于您的 ffmpeg:
如果没有更多信息,我首先想到的是,当您运行脚本时,您可能拥有一个最小的环境。你是从cron运行它吗?如果是这样,例如,您可能无法访问 $CHANNEL。
在任何情况下,您都可以使用 2> 调用您的脚本,以将标准错误输出重定向到文件。例如:
如果您从脚本调用 ffmpeg,那么您应该在该脚本内的 ffmpeg 命令末尾添加重定向。你会在你的脚本中做这样的事情:
尝试
-nostdin
标志到ffmpeg
.虽然可能与最热门的原始问题没有直接关系,但这是目前“ffmpeg 在脚本中失败”的最高搜索结果,所以我无论如何都会分享我的发现,希望能帮助其他人。
每当
ffmpeg
从cat 'file' | while read INFILE ; do loop
. 在该循环之外运行ffmpeg
或单独运行将正常工作。添加循环会导致它将数据转储到控制台。我不确定为什么,但添加-nostdin
解决了我的问题,因为我认为 while read 和 ffmpeg 正在争夺标准输入。我愿意听取其他人关于为什么-nostdin
在我的案例中起作用的解释。