複数のファイルのノーチラススクリプト(ffmpeg)

複数のファイルのノーチラススクリプト(ffmpeg)

私はプログラミングの背景知識がほとんどまたはまったくなく、複数のビデオファイルからオーディオを抽出するためのバッチ処理を作成する必要があります。実行は、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が処理されるたびzenitymp4メッセージを印刷します。ただし、すべてのファイルが処理されたときにメッセージを表示するには、次のスクリプトを使用できます。

#!/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 パラメータの説明)。

関連情報