
私はこの大容量ファイルを扱っています(データ。DAT、〜900 MB)これには他のいくつかのファイルが含まれています。 PS2ゲームからの内容です。
サウンドサンプル(位置:.AIFF形式)これは私が求めている形式で、サイズの大部分を占めています。
PS2をオンラインで検索した後.DAT私は彼らが基本的に開発者に依存していることを知り、このゲーム/ツールはかなり曖昧で、オンラインでそれに関する多くの情報を見つけることができないので、プロセスを直接自動化しようとしています。
Hex Editorでファイルをスキャン中にいくつかの問題が見つかりました。.AIFFヘッダー、ブロックを新しいブロックに複製する.AIFFファイルがあれば、追加の操作なしで再生できます。
非常に限られたbashの知識から抜け出し、ここで同様の質問を読んで次の表現を思い出すのに時間がかかりました。
gcsplit -f "sample-" -b "%04d.aif" DATA.DAT /FORM/ '{*}'
(私はOSXでcoreutilsを使用しているので、csplitではgプレフィックスを使用します)
一方.AIFFファイルは文字列「FORM」で始まり、ファイル内のすべてのサンプルが本質的に隣り合っていること(サンプルに不要な終了ノイズを生成しない無視できる量のデータ間隔)を考慮して、正規表現が次のようになると思います。しました。方法
/FORM/
ファイルを分離するだけで十分です。
ただし、各分割ファイルはサウンドサンプル間のガベージデータを出力します。.AIFFタイトルが再生できなくなります。
以下は、サウンドサンプルを分割する16進データのスクリーンショットです。
この実際の例は約1500バイトで始まります。
この式がファイルをオフセットに分割するのはなぜですか?
答え1
Csplitはテキストユーティリティです。ラインベースです。パターンは/FORM/
「FORM
含む行」を意味します。行は LF (newline とも呼ばれ、 ^J, … で書ける newline) 以外のバイトシーケンスであり、その後\n
には LF バイト (または GNU ユーティリティを使用する場合ファイルの末尾に) があります。したがって、観察された「ゴミ」は、FORM
以前のLF文字と部分文字列の間のすべてです。
マニュアルページと--help
簡単な説明では、コマンドが何をしているのかを既に知っていると仮定しているので、説明なしで「断片」だけに言及しています。あなたは読まなければなりません完全な文書その部分の説明を確認してください。
csplitではあなたが望むことはできません。 GNU awkを使用してこれを行うことができます。 (他のバージョンのawkには、任意のレコード区切り文字やNULLバイト処理のサポートなど、必要な機能がない可能性があります。)
gawk -v RS='FORM' -v ORS='' '{
print "FORM" $0 >sprintf("sample-%04d.aif", n++)
}' DATA.DAT
ただし、圧縮データに正確に4バイトが含まれていると、FORM
誤った場所で切り捨てられる可能性があります。これは手動チェックのワンタイムタスクには十分ですが、信頼できるものが必要な場合はフォーマット認識ツールを使用することをお勧めします。
答え2
テキストベースのユーティリティは、バイナリファイルの操作には適していません。
より良い結果を得ることもできます図書館/AIFC、Pyサウンドファイルまたはffmpegコマンドラインアプリケーションです。