Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save yesworld/b910a4dc4cf58b0ac5dff1ef3cb90f78 to your computer and use it in GitHub Desktop.
Save yesworld/b910a4dc4cf58b0ac5dff1ef3cb90f78 to your computer and use it in GitHub Desktop.

Был интересный опыт, когда с другом восстанавливали .wav файл. Я решил описать наш мучительный процесс, вдруг кому-то пригодится.

Предыстория

Бывают грустные истории, когда диктофон зависает/или выдает ошибку при сохранении файла. Следовательно, при попытке открыть поврежденный файл мы получаем ошибки, типа: не удалось декодировать формат, неверный формат или программа не распознала формат файла.

Пытаемся разобраться

Так как открыть файл у нас не получилось, решили по гуглить. Мы хотели понять, как скормить .wav файл проигрывателю. Нашли кучу советов: загрузить его в Raw(сыром формате), поиграться с настройками и т.д. Все эти попытки потерпели фиаско.

Решили изучить, что такое вообще wav, нашли инфу про заголовки и их описание:

схематическое представление формата wav файла

Устанавливаем хекс редактор (wxHexEditor), открываем и пытаемся хоть что-то найти похожее на заголовок. поврежденный файл без заголовка

Провал... их не было. Решили записать новую запись с удачным сохранением. Открыли его в редакторе и смотрим заголовки. нормальная запись, заголовок не выделен

Копируем заголовки и вставляем в наш битый файл (далее БФ)! Судорожно сохраняем и запускаем файл в проигрывателе, и ничего не работает! (Я, как настоящий мужик, начал рыдать в углу комнаты)

Перед тем как что-то построить, нужно что-то сломать.

Мы решили разобраться, как можно сломать нормальный файл и получить такую уродскую картину, как поврежденный файл.

Рисунок: сверху склеенный БФ, внизу нормальная запись. открытые два файла в audacity

Оказалось что, если удалить в хексРедаторе 1 байт в нормальном файле и сохранить, картина становится похожей. А если вернуть байт, даже пустой забитый нулями, то все становится нормально.

Написание баш скрипта

Решили побайтово удалять и сохранять файл, чтобы получить нормальную картину, как на рисунке выше. Создали 2 файла, один только заголовки, а другой поврежденный файл (предварительно его обрезав чуть меньше мегабайта).

Написали небольшой скрипт, который удаляет один байт из файла и склеивает с заголовком, после чего сохраняет с порядковым номером.

#!/bin/bash

for i in {1..1000}
do
	cat header.wav > "./wav/$i.wav"
	tail -c +$i raw.wav >> "./wav/$i.wav"
done

Запускаем скрипт и с трепетом, на краешке стульчика, ждем результат. К сожалению, нам пришлось просматривать эти файлы вручную, но как лучше сделать по другому мы не знали. Закидывали по 250 файлов в audacity и просматривали дорожки: куча битых фалов

Скроллить пришлось недолго, потому что на 537 файле мы нашли, то что искали: вот он, 537 файл с нормальным звуком

Осталось дело за малым. Смотрим этот файл в хеш редаторе, где он остановился. Открываем БФ в редакторе и удаляем после заголовка нужную нам длину байтов. Вот и все, двухчасовой файл нормально воспроизводится.

##P.s.

Скорее всего, это можно было сделать проще. Кто знает, как облегчить работу или как-то ее оптимизировать, пишите, добавлю в этот "гайд".

Всем спасибо за внимание.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment