我正在尝试制作一个使用 ffmpeg 录制屏幕和音频的脚本。用户将能够选择录制内容:仅屏幕、仅麦克风、仅扬声器声音或这些的组合。
我正在努力进行录音工作。我最初尝试使用 Alsa,但在录制时我什么也听不到。然后我尝试使用Pulseaudio,但结果很糟糕。现在我尝试使用OpenAL,结果非常好。但是,它的选项有空格,我无法使脚本可靠地工作:
OpenAL 选项有:
[openal @ 0x55c6aa3b77a0] List of OpenAL capture devices on this system:
[openal @ 0x55c6aa3b77a0] Áudio interno Estéreo analógico
[openal @ 0x55c6aa3b77a0] Monitor of Áudio interno Estéreo analógico
根据用户选项和屏幕尺寸,命令行具有不同的变量,包括:
env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough \
-vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi \
${monitorsom} "${openal}" ${micro} "${microal}" ${complexo} \
-thread_queue_size 4096 -framerate 30 \
-f x11grab -s "$(xdpyinfo | grep -oP 'dimensions:\s+\K\S+')" -i :0.0 \
-acodec libfdk_aac -b:a 192k \
-vf 'format=nv12,hwupload' -vcodec h264_vaapi \
-f flv "${nome}"
这种方法的一个大问题是变量监控索姆,开放的,微,微量元素和复杂的可以为空。没有问题监控索姆,微和复杂的,结果命令很好。然而,如果开放的或者微量元素为空,则 ffmpeg 命令失败。如果未选择任何选项(没有声音),则传递的命令为:
env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi '' '' -thread_queue_size 4096 -framerate 30 -f x11grab -s 1366x768 -i :0.0 -acodec libfdk_aac -b:a 192k -vf format=nv12,hwupload -vcodec h264_vaapi -f flv TEST002.flv
它具有在有选项时必须使用的引号,但由于它们为空,因此命令失败。
如果我尝试不同的方法,将变量部分更改为(不带任何引号):
${monitorsom} ${openal} ${micro} ${microal} ${complexo} \
当它们为空时它可以工作,但是当由于空格而有选项时它会失败。我尝试了以下方法来传递带有所需引号的变量:
openal=' "Monitor of Áudio interno Estéreo analógico" '
在变量值中间添加单引号,结果是:
'"Monitor' of Áudio interno Estéreo 'analógico"'
结果,失败了。
如果我尝试使用:
openal=" 'Monitor of Áudio interno Estéreo analógico' "
其结果是:
''\''Monitor' of Áudio interno Estéreo 'analógico'\'''
失败。
有没有办法传递带有所需引号的变量?我想通过:
"Monitor of Áudio interno Estéreo analógico"
或者
'Monitor of Áudio interno Estéreo analógico'
但它也必须接受不带任何引号的值。因此,我相信我应该能够在需要引号时使用引号设置变量值,如果不需要引号或会导致错误,则不使用引号。
谢谢。
答案1
如果问题是空参数导致问题,请考虑使用数组构建命令行,以便可以过滤掉空变量:
opts=()
add_opt() {
for i; do [[ -n "$i" ]] && ops+=("$i"); done
}
add_opt "${monitorsom}" "${openal}" "${micro}" "${microal}" "${complexo}"
然后:
env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough \
-vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi \
"${opts[@]}" \
-thread_queue_size 4096 -framerate 30 \
-f x11grab -s "$(xdpyinfo | grep -oP 'dimensions:\s+\K\S+')" -i :0.0 \
-acodec libfdk_aac -b:a 192k \
-vf 'format=nv12,hwupload' -vcodec h264_vaapi \
-f flv "${nome}"
如果 anopts
为空,"${opts[@]}"
则展开为空,我们已经过滤掉了空变量。
(我会继续将每个选项放入数组中。当我有很长的命令行时,我倾向于这样做:
opts=(
"opt1"
"opt2"
...
)
cmd "${opts[@]}"
这让我更容易跟踪选项。)