![检测截断的 mp3 或 ogg 文件](https://linux22.com/image/1406606/%E6%A3%80%E6%B5%8B%E6%88%AA%E6%96%AD%E7%9A%84%20mp3%20%E6%88%96%20ogg%20%E6%96%87%E4%BB%B6.png)
我最近硬盘坏了,无法挽救我所有的音乐文件。由于我没有足够的存储空间来对磁盘进行完整备份,我尝试备份cp
尽可能多的曲目,但现在我剩下一些提前结束的文件。
我已经找到了这个答案找出“歌曲长度”此工具效果相同。对于一个损坏的文件,我得到以下输出:
ffmpeg -i broken.mp3 2>&1 | grep Duration
Duration: 00:04:18.14, start: 0.025057, bitrate: 92 kb/s
mp3_check -a broken.mp3 2>&1| grep SONG
SONG_LENGTH 01:43.05
因此ffmpeg
似乎依赖于一些元数据(04:18 是也显示在我媒体播放器中的持续时间),而mp3_check
似乎实际上读取了整个文件。我可以使用它来编写涵盖 mp3 的脚本,但是:
ffmpeg
除了比较和输出之外,是否有更简单的解决方案mp3_check
来查找损坏的文件?
我该如何使用没有mp3_check
可用的 Ogg 文件来做到这一点?
答案1
这是我现在使用的脚本:
#!/bin/bash
echo "checking $1"
find "$1" -name "*.mp3" | while read filename; do
echo "checking $(basename "$filename")"
ffmpeg_dur=$(ffmpeg -i "$filename" 2>&1 | awk -F: '($1 ~ /Duration/) {printf "60*%d+%d\n", $3, $4}' | bc)
# mp3_check_dur=$(mp3_check -a "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /SONG_LENGTH/) {printf "60*%d+%d\n", $2, $3}' | bc )
mp3info_dur=$(mp3info -x "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /Length/) {printf "60*%d+%d\n", $2, $3}' | bc )
if [[ -z $ffmpeg_dur ]] ; then # some files are so broken that ffmpeg doesn't print a length
echo "ERROR (ffmpeg): $filename"
else
len_diff=$(( $ffmpeg_dur - $mp3_check_dur ))
if [[ $len_diff -gt 0 ]] ; then
echo -e "ERROR (length): $filename\t${len_diff}"
fi
fi
done
报告的持续时间ffmpeg
总是比mp3_check
和的持续时间长mp3info
。后者之间有时也会有 1 秒的差异。mp3info
可作为某些 Linux 发行版(Ubuntu、Arch、...?)的软件包使用,mp3_check
必须从源代码构建。