尝试使用我的 Bash 脚本中的简单变量来为 ffmpeg 编写代码,但出现错误

尝试使用我的 Bash 脚本中的简单变量来为 ffmpeg 编写代码,但出现错误

当我像这样运行它时,它有效:

ffmpeg -re -y -i /home/video.webm -ss 2 \
-i /home/audio.ogg -map 0:0 -map 1:0  \
-c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k \
-bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -async 1 \
-f flv "rtmps://live-api-s.facebook.com:443/rtmp/xxx"

但是,当我引入一个变量时,遇到了一个问题:

STREAM=-f flv \"rtmps://live-api-s.facebook.com:443/rtmp/xxx\"

ffmpeg -re -y -i /home/video.webm -ss 2 \
-i /home/audio.ogg -map 0:0 -map 1:0  \
-c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k \
-bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -async 1 \
$STREAM

当我运行这个时,我得到:

At least one output file must be specified

我尝试过多种不同的方法来做到这一点,但都有错误。

答案1

这一行:

STREAM=-f flv \"rtmps://live-api-s.facebook.com:443/rtmp/xxx\"

flv \"rtmps://live-api-s.facebook.com:443/rtmp/xxx\"尝试在STREAM环境变量设置为 的情况下运行-f。你没收到吗bash: flv: command not found

比较STREAM=-f env

该变量未针对当前 shell 设置,$STREAM稍后将扩展为空字符串。但即使你这样做了:

# but don't
STREAM='-f flv "rtmps://live-api-s.facebook.com:443/rtmp/xxx"'

不会起作用。$STREAM后来没有引用进行单词拆分和文件名生成并且从变量扩展中出现的引号对于扩展变量的 shell 来说并不是特殊的。

看看这个:我们如何运行存储在变量中的命令?在你的情况下,使用数组的解决方案如下:

STREAM=(-f flv "rtmps://live-api-s.facebook.com:443/rtmp/xxx")
ffmpeg … "${STREAM[@]}"

还请考虑变量名称为小写

相关内容