私はプログラミングの背景知識がほとんどまたはまったくなく、複数のビデオファイルからオーディオを抽出するためのバッチ処理を作成する必要があります。実行は、Nautilusのスクリプトフォルダにbash .shとして保存されたNautilus / Gnomeファイルのコンテキストメニューを介して行われます。次のコードは1つのファイルに対して機能しますが、複数のファイルを選択しても機能しません。コードが機能するように修正するのに役立つ人はいますか?
#!/bin/bash
FILENAME=$(echo $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | sed -e 's/\r//g')
FILENAME2=$(echo "$FILENAME" | cut -f 1 -d '.')
ffmpeg -i "${FILENAME}" -vn -acodec pcm_s16le -ac 2 -ar 48000 "${FILENAME2}".wav
# finished message box
zenity --info --title "Procesing completed" --text "${FILENAME2}.wav at 48kHz has been generated." --width=700
答え1
このスクリプトではテストできませんが、ffmpeg
機能します。
#!/bin/bash
{
readarray FILENAME <<< "$(echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | sed -e 's/\r//g')"
echo -e "Logs: $(date)\n" > ~/Desktop/data.txt
for file in "${FILENAME[@]}"; do
file=$(echo "$file" | tr -d $'\n')
echo "Current file: $file" >> ~/Desktop/data.txt
ffmpeg -i "$file" -vn -acodec pcm_s16le -ac 2 -ar 48000 "${file%.*}.wav"
zenity --info --title "Procesing completed" --text "${file%.*}.wav at 48kHz has been generated." --width=700
done
} 2>~/Desktop/ffmpeg.logs
上記のコードは、aが処理されるたびzenity
にmp4
メッセージを印刷します。ただし、すべてのファイルが処理されたときにメッセージを表示するには、次のスクリプトを使用できます。
#!/bin/bash
{
readarray FILENAME <<< "$(echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | sed -e 's/\r//g')"
echo -e "Logs: $(date)\n" > ~/Desktop/data.txt
for file in "${FILENAME[@]}"; do
file=$(echo "$file" | tr -d $'\n')
echo "Current file: $file" >> ~/Desktop/data.txt
ffmpeg -i "$file" -vn -acodec pcm_s16le -ac 2 -ar 48000 "${file%.*}.wav"
done
zenity --info --title "Procesing completed" --text "$( printf "%s.wav\n" "${FILENAME[@]%.*}") at 48kHz has been generated." --width=700
} 2>~/Desktop/ffmpeg.logs
このスクリプトを使用することをお勧めします。失敗したファイルと正常に生成されたファイルを検出する機能のため:
#!/bin/bash
{
readarray FILENAME <<< "$(echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | sed -e 's/\r//g')"
echo -e "Logs: $(date)\n" > ~/Desktop/data.txt
okFiles=()
errFiles=()
for file in "${FILENAME[@]}"; do
file=$(echo "$file" | tr -d $'\n')
echo -e "\n===========================" >> ~/Desktop/data.txt
echo "Current file: $file" >> ~/Desktop/data.txt
ffmpeg -i "$file" -vn -acodec pcm_s16le -ac 2 -ar 48000 "${file%.*}.wav" && {
okFiles+=("${file%.*}.wav")
:
} || {
errFiles+=("${file%.*}.wav")
}
done
if [[ ${#okFiles[@]} -gt 0 ]]; then
zenity --info --title "Procesing completed" --text "$(printf '%s\n' ${okFiles[@]})\n at 48kHz have/has been generated." --width=700
fi
if [[ ${#errFiles[@]} -gt 0 ]]; then
zenity --info --title "Error while processing some files" --text "Following files:\n$(printf "%s\n" "${errFiles[@]}")\ncould not be generated." --width=700
fi
} 2>~/Desktop/ffmpeg.logs
について:
{
code
code
} 2>~/Desktop/ffmpeg.logs
各ファイルを処理するときに問題を検出するために使用します。たとえば、一部のファイルでエラーが発生した場合は、ffmpeg
そのパス内のログを確認できます。~/Desktop/ffmpeg.logs
ただし、処理するすべてのファイルをスクリプトが呼び出される場所ではなく特定のパスに配置するには、次のようにします(前readarray
)。
{
cd ~/Audios/path/to/dir #the path you want can be placed here
readarray ...
code
} 2>~/Desktop/ffmpeg.logs
FILENAME2
最後に、私が使用して以来、もはや必要ではないことがわかります"${file%.*}.wav"
(参照Bash パラメータの説明)。