我几乎没有编程背景,需要创建一个批处理来提取多个视频文件的音频。执行是通过 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参数解释)。