破損した(mp3?)ファイルを復元する方法

破損した(mp3?)ファイルを復元する方法

私はファイルを受け取ったhttps://drive.google.com/file/d/10Fqr6Ipu2J8yKU_m3-EMzsVj7XeSYEdV/view?usp=sharing. 開くhttps://hexed.it/おそらく mp3 ファイルであることがわかります (ファイルの末尾の ID3 情報に基づく)。タスクは、ファイル ヘッダーを復元して、ファイルを開くことができるようにすることです (おそらく音楽プレーヤーで)。手がかりがあれば、ぜひ教えてください。

ファイル ヘッダーが空のバイトであることに気づいたので、動作している mp3 ファイルから開始バイトをコピーしてみました。また、判読可能なテキストを含む最後の数バイトをファイルの先頭に移動してみました。どちらも機能しませんでした。

答え1

MP3ファイルありません必須のヘッダー。これらは単なるMPEGオーディオフレームの生のシリーズであり、各フレームには独自の4バイトのミニヘッダー(1つのb)。その他はすべて余分なものです。(ID3 タグと LAME ヘッダーでさえ、どちらもかなり後から追加されたものですが、無効なフレームとして偽装されており、ほとんどのプレーヤーはこれを無視することが分かっています。)

さらに、フレーム形式は自己同期化されています。フレームは任意の時点でカットでき、デコーダーは先頭の不要なハーフフレームを無視し、同期ビットを探して0xFFF次のフレームの開始を見つけます。つまり、文字通り MP3 ファイルの任意の部分をデコーダーに投げ込んでも再生されるはずです。再生されない場合は、おそらく MP3 ファイルではありません。

あなたのファイルはMP3ではなく、ID3タグ形式を使用する別のものであると結論付けます(まれですが、珍しくはありません)。さらに、ファイルの最後のビットはとてもID3タグのような、4文字のチャンク識別子の多くは、ID3v2では一般的である「T」で始まりません。チャンク形式のような国際交流基金またはWAV/リフ(どちらも確かに ID3 タグを埋め込んでいます!) ですが、MP3 ではそうではありません。

(そうですね、ID3 タグ自体もチャンク形式ですが、MP3 全体としてはそうではありません。これがポイントです。)

IFF とその AIFF/RIFF 派生形式以外にも、タグ付き/チャンク形式の形式は数多くあります。たとえば、PNG や ISO BMFF (MP4/HEIF/AVIF ファイルに使用) は概念的には似ていますが、ファイル内で使用される特定のチャンク名 ( 、LIST)INFOは RIFF 特有のもので、さまざまな Windows 関連の形式に使用されます。たとえば、オーディオの場合は .wav、ビデオの場合は .avi、アニメーション マウス カーソルの場合は .ani などです。data先頭近くにある も、おそらくチャンク タグです。

これらの RIFF サブフォーマットのうち、IART(アーティスト)、ICRD(日付)、IGNR(ジャンル)、id3␣(埋め込まれた ID3 タグ) のチャンクは WAV ファイルの典型です。欠けているのはトップレベルのRIFFチャンクだ(そしておそらくfmt␣チャンクの一部)、これによりプレーヤーがファイルを認識できなくなります。

fmt␣オフセット 0x10 は、別の .wav ファイルと比較するとチャンクの完全な内容のように見えるため、欠落している最初の 8 バイトは次のようになります。

00000000  52 49 46 46 __ __ __ __  57 41 56 45 66 6d 74 20  |RIFF____WAVEfmt |

…空の部分はトップレベルのチャンクの長さです (または単に「ファイル全体」を示す場合は 0xFFFFFFFF)。全体的な構造は次のようになります。

RIFF[WAVE]
 ├─fmt␣   (PCM S16LE)
 ├─data   (~Never gonna give you up~)
 ├─LIST[INFO]
 │  ├─IART = "GCTF"
 │  ├─ICRD
 │  └─IGNR = "Drum & Bass"
 └─id3␣   (embedded ID3, not RIFF-format)
    ├─TPE1 = "GCTF"
    ├─TDRC
    └─TCON = "Drum & Bass"

ヘッダーを修復しようとする場合は、fqを使用して検査します (実際の MP3 ファイルやその他の一般的な形式でも適切に機能します)。

$ fq . test.wav
$ fq .chunks[] test.wav
$ fq .chunks[2].chunks[] test.wav

ここに画像の説明を入力してください

あるいは、PCM データ全体 (4 バイト長) を含むチャンク全体を持っているのでdata、その部分だけを抽出し、さまざまな生の PCM 形式を総当たり方式で試す方が簡単かもしれません (組み合わせはそれほど多くありません)。

関連情報