我编写了这个小脚本,使用 avconv 从视频中批量提取音频。它运行良好,但奇怪的是它不再工作了(因为我已将编解码器从 aac 更改为 mp3)。
该脚本应该测试文件夹中的每个文件。如果是视频,它应该从中提取音频。
有人能帮我解决这个问题吗?
#!/bin/sh
#
# Batch conversion of audio extraction from video
# doesnt work with mkv files (file -i *.mkv returns application/octet)
FOLDER_SRC="/home/J/Music/TestBatchConv"
for myvid in $(find ${FOLDER_SRC})
do
if file -i $myvid | grep -q video ;
then avconv -i $myvid -acodec libmp3lame "${myvid}.mp3"
fi
done
exit 0
答案1
似乎你正在使用旧版本的file
where无法正确检测 MKV 文件。 您可以使用这个~/.magic
文件识别file
MKV。
但实际上,检查视频文件是否有效的最可靠方法是直接运行avconv
,看看是否失败。您可以执行以下操作:
#!/bin/bash
FOLDER_SRC="/home/J/Music/TestBatchConv"
find "$FOLDER_SRC" -type f -print0 | while IFS= read -r -d '' myvid; do
echo "Trying to convert $myvid"
avconv -i "$myvid" -c:a libmp3lame -q:a 4 "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done
如果该文件不是有效的视频,或者有任何错误,avconv
则将退出。
一些提示和说明:
有无需解析
ls
或的输出find
。只需执行for myvid in "$FOLDER_SRC"/*
,或者对于递归版本,使用**
带有globstar
选项的 glob。此处,该find … | while …
行可以替换为:shopt -s globstar for myvid in "$FOLDER_SRC/**"; do
不要忘记
"$myvid"
在循环中正确引用它,否则名称中带有空格的视频会破坏您的脚本。- 您可以删除原始文件扩展名,方法是删除最后一个点后的任何内容
${myvid%.*}
并将其替换为.mp3
。 - 你应该告诉
avconv
使用可变比特率编码例如libmp3lame
,值为-q:a 4
,范围为 0–10,默认值为 4。这通常会为您提供更好的音频质量。
答案2
对于那些感兴趣的人,这里是最终的工作代码:
#!/bin/bash
#
# Batch conversion of audio extraction from video
echo $BASH_VERSION
FOLDER_SRC="/home/J/Music/TestBatchConv"
shopt -s globstar
for myvid in "$FOLDER_SRC"/**
do
echo "$myvid"
avconv -i "$myvid" -acodec libmp3lame "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done
exit 0