我正在尝试循环浏览几个mp4文件并转换为其他格式。以下工作,但它只转换一个文件,循环停止。最初文件位于文件夹videos
中,当我转换后,我移动到文件夹formatted_vids
。如何正确循环所有mp4文件?
FILE_PATH="/media/videos/"
find $FILE_PATH -name "*.mp4" | while read file
do
filename=$(basename "$file")
extension="${filename##*.}"
video_file="${filename%.*}"
dir="/media/formatted_vids/${filename%.mp4}"
mkdir -p "$dir"
mv "$file" "$dir"
ffmpeg -i $dir/${filename} -c:a libfdk_aac -vbr 3 output.m4a "$dir/${filename%.mp4}-%03d.m4a";
done
初始文件夹
|-- /media/videos/
| |-- xxxx-test_file-aa1
| |--xxxx-test_file-aa1.mp4
| |-- xxxx-test_file-bb2
|--xxxx-test_file-bb2.mp4
将文件移至文件夹:
|-- /media/formatted_vids/
| |-- xxxx-test_file-aa1
| |--xxxx-test_file-aa1.aac
| |-- xxxx-test_file-bb2
|--xxxx-test_file-bb2.aac
答案 0 :(得分:0)
如果文件名或路径包含空格,则lashgar的答案将中断。
请尝试以下操作以获取包含空格支持的解决方案
find $FILE_PATH -name "*.mp4" -print0 |
while IFS= read -r -d '' file; do
filename=$(basename "$file")
extension="${filename##*.}"
video_file="${filename%.*}"
dir="/media/formatted_vids/${filename%.mp4}"
mkdir -p "$dir"
mv "$file" "$dir"
ffmpeg -i $dir/${filename} -c:a libfdk_aac -vbr 3 output.m4a "$dir/${filename%.mp4}-%03d.m4a" < /dev/null
done
请注意,我必须在ffmpeg命令的末尾添加一个< /dev/null
,这是为了避免使用this error。
在具有空间支持的while循环中,信贷转到this answer。
在修复自己的媒体转换脚本时遇到了这个问题。如果有人对我的脚本感兴趣,该脚本可将具有HEVC编码的mkv视频文件转换为具有AVC编码的mpg文件,您可以找到它here。