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}"
anが空opts
の場合は"${opts[@]}"
空の状態に展開され、空の変数はフィルタリングされます。
(続いて各オプションを配列に入れます。コマンドラインが長い場合は、次のようになりがちです。
opts=(
"opt1"
"opt2"
...
)
cmd "${opts[@]}"
これにより、オプションを簡単に追跡できます。 )