用于多个文件的 Nautilus 脚本 (ffmpeg)

用于多个文件的 Nautilus 脚本 (ffmpeg)

我几乎没有编程背景,需要创建一个批处理来提取多个视频文件的音频。执行是通过 Nautilus/Gnome 文件中的上下文菜单完成的,以 bash .sh 形式存储在 Nautilus 的脚本文件夹中。以下代码适用于 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

上面的代码将在zenity每次mp4处理 a 时打印一条消息。但是,如果您想在处理所有文件时显示消息,则可以使用以下脚本:

#!/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参数解释)。

相关内容