Jas*_*per 5 linux mp3 ogg ffmpeg
我最近遇到了硬盘故障,无法挽救我所有的音乐文件。由于我没有足够的可用存储空间来对磁盘进行完整备份,因此我尝试了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
Run Code Online (Sandbox Code Playgroud)
所以ffmpeg
似乎依赖于一些元数据(04:18 是我的媒体播放器中也显示的持续时间),而mp3_check
似乎实际上读取了整个文件。我可以用它来编写一个涵盖 mp3 的脚本,但是:
是否有比比较ffmpeg
和mp3_check
输出更简单的解决方案来查找损坏的文件?
如果没有mp3_check
可用的Ogg 文件,我将如何执行此操作?
这是我现在使用的脚本:
#!/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
Run Code Online (Sandbox Code Playgroud)
报告的持续时间始终比和ffmpeg
之一长。后者有时也会有1秒的差异。可以作为某些 Linux 发行版(Ubuntu、Arch,...?)的软件包,必须从源代码构建。mp3_check
mp3info
mp3info
mp3_check
归档时间: |
|
查看次数: |
438 次 |
最近记录: |