检测截断的 mp3 或 ogg 文件

检测截断的 mp3 或 ogg 文件

我最近硬盘坏了,无法挽救我所有的音乐文件。由于我没有足够的存储空间来对磁盘进行完整备份,我尝试备份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必须从源代码构建。

相关内容