У меня есть mp4 файл, у которого отсутствует примерно 1Мб в начале файла. И есть хороший mp4, сделанный той же камерой, что и первый. И есть желание "восстановить" битый файл. Поправьте меня, если я ошибаюсь. В видео потоке есть ключевые кадры, и предположу, что в начале ключевого кадра есть некая сигнатура, по которой его можно найти. И я могу просто найти эту сигнатуру, отрезать все, что идет до нее, и к этим данным подставить метаданные от хорошего файла, и полученный файл можно будет просмотреть в видео-проигрывателе.
Здравствуйте, Aniskin, Вы писали:
A>У меня есть mp4 файл, у которого отсутствует примерно 1Мб в начале файла. И есть хороший mp4, сделанный той же камерой, что и первый. И есть желание "восстановить" битый файл. Поправьте меня, если я ошибаюсь. В видео потоке есть ключевые кадры, и предположу, что в начале ключевого кадра есть некая сигнатура, по которой его можно найти. И я могу просто найти эту сигнатуру, отрезать все, что идет до нее, и к этим данным подставить метаданные от хорошего файла, и полученный файл можно будет просмотреть в видео-проигрывателе.
Здравствуйте, Aniskin, Вы писали:
A>У меня есть mp4 файл, у которого отсутствует примерно 1Мб в начале файла. И есть хороший mp4, сделанный той же камерой, что и первый. И есть желание "восстановить" битый файл. Поправьте меня, если я ошибаюсь. В видео потоке есть ключевые кадры, и предположу, что в начале ключевого кадра есть некая сигнатура, по которой его можно найти. И я могу просто найти эту сигнатуру, отрезать все, что идет до нее, и к этим данным подставить метаданные от хорошего файла, и полученный файл можно будет просмотреть в видео-проигрывателе.
Здравствуйте, Aniskin, Вы писали:
AD>>Аудио в нем есть? A>Да.
Эх, с аудио оно сложнее...
Да, я бы попробовал прогу, что kov_serg выше посоветовал. Там есть какая-то эвристика, может чего и нарулит.
В целом ситуация такая:
Если атом 'moov' в конце файла, то все относительно не сложно. Вся мета есть, потерян только начальный кусок видео. Можно взять stco/co64 атом и по его оффсетам понять, сколько пропало из начала, потом добить начало заголовком атома 'mdat' и данные нулями.
Потом уже можно попробовать скормить какому-нибудь ффмпег.
Если атом 'moov' был вначале и именно он утерян, то дела в целом плохи.
Проблем добавляет аудио. В mdat аудио и видео идут вперемешку, а оффсеты и размеры указаны в 'moov' атоме, которго нет.
Какой-нибудь h264/avc1 имеет формат данных [nalu size][nalu data]... и все фреймы в теории можно восстановить. Особенно если каждый их них по 1 nalu занимает. Но тут надо еще pts и dts восстанавливать. Если b-frame нет, то это проще. Иначе не очень. SPS/PPS можно взять из аналогичного файла и если что подправить.
Каких-то специальных явных сигнатур для аудио нет, как и для видео. В зависиомости от формата можно пробовать детектить старт/стоп чанка аудио по заголовку, тут прям вероятности и эвристика.
В общем, это вполне реально, но запарно. Надо в форматах разбираться неплохо и попрогать придется. Та прога как база ок, дальше красноглазить.
https://www.iso.org/standard/83102.html
Как ни странно эта техническая информация платная. Но если очень поискать то найти можно. Но если собрать всё в одном месте можно огрести от правоторговцев.
Вообще wireshark умеет показывать mp4 поток.
Здравствуйте, Aniskin, Вы писали:
A>У меня есть mp4 файл, у которого отсутствует примерно 1Мб в начале файла. И есть хороший mp4, сделанный той же камерой, что и первый. И есть желание "восстановить" битый файл. Поправьте меня, если я ошибаюсь. В видео потоке есть ключевые кадры, и предположу, что в начале ключевого кадра есть некая сигнатура, по которой его можно найти. И я могу просто найти эту сигнатуру, отрезать все, что идет до нее, и к этим данным подставить метаданные от хорошего файла, и полученный файл можно будет просмотреть в видео-проигрывателе.
В принципе всё может оказаться даже проще. Eсли там видео было в H.264, а аудио в AAC, то достаточно найти сигнатуру первого любого валидного семпла и поменять avc1 заголовки на annex.b, по месту заменив длину семпла на 0x00000001. Все семплы лежать рядышком компактно в MDAT.
Здравствуйте, Aniskin, Вы писали:
A>У меня есть mp4 файл, у которого отсутствует примерно 1Мб в начале файла. И есть хороший mp4, сделанный той же камерой, что и первый. И есть желание "восстановить" битый файл. Поправьте меня, если я ошибаюсь. В видео потоке есть ключевые кадры, и предположу, что в начале ключевого кадра есть некая сигнатура, по которой его можно найти. И я могу просто найти эту сигнатуру, отрезать все, что идет до нее, и к этим данным подставить метаданные от хорошего файла, и полученный файл можно будет просмотреть в видео-проигрывателе.
Я бы просто ради интереса попробовал бы скопировать из битого файла то, что можно прочитать, в новый файл силами ffmpeg:
ffmpeg -i bad.mp4 -c copy output.mp4
Далее в видео-редакторе обрезать и/или синхронизировать звук.
Если ffmpeg не осилит, тогда брать тяжёлую артиллерию и разбираться в форматах.
Здравствуйте, andrey.desman, Вы писали:
AD>Какой-нибудь h264/avc1 имеет формат данных [nalu size][nalu data]... и все фреймы в теории можно восстановить. Особенно если каждый их них по 1 nalu занимает. Но тут надо еще pts и dts восстанавливать. Если b-frame нет, то это проще. Иначе не очень. SPS/PPS можно взять из аналогичного файла и если что подправить.
h264/avc1 — это как раз мой случай (moov целый). Читаю разную документацию и не вижу в ней упоминания терминов pts/dts/SPS/PPS. Можете ли вы сказать пару слов о них.
Я смотрю корректный mp4 файл и в нем первый Nalu имеет тип 6 "Supplemental enhancement information (SEI)", следующий имеет тип 5 "Coded slice of an IDR picture" (как я понимаю — это ключевой кадр), затем несколько имею тип 1 ("Coded slice of a non-IDR picture"), затем снова 5, затем снова несколько 1, и так до конца файла. Про тип 6 пишут, что он не обязателен. И если я все правильно понимаю, то мне нужно найти первый целый Nalu с типом 5, откинуть все Nalu до него, подправить tkhd/mdhd/stts/ctts/stsc/stsz/stco, и вроде бы должен получится корректный файла. Или я не правильно понимаю?
Здравствуйте, Aniskin, Вы писали:
A>h264/avc1 — это как раз мой случай (moov целый). Читаю разную документацию и не вижу в ней упоминания терминов pts/dts/SPS/PPS. Можете ли вы сказать пару слов о них.
Здравствуйте, kov_serg, Вы писали:
_>Как ни странно эта техническая информация платная. Но если очень поискать то найти можно.
А кто-нибудь встречал в сети ISO/IEC 14496-10:2022. Версию от 2004 года можно найти, а вот от 2022 нет, или я не там ищу. Или как купить эту спецификацию будучи жителем РФ?
Здравствуйте, Aniskin, Вы писали:
_>>Как ни странно эта техническая информация платная. Но если очень поискать то найти можно.
A>А кто-нибудь встречал в сети ISO/IEC 14496-10:2022. Версию от 2004 года можно найти, а вот от 2022 нет, или я не там ищу. Или как купить эту спецификацию будучи жителем РФ?
Здравствуйте, kov_serg, Вы писали:
A>>А кто-нибудь встречал в сети ISO/IEC 14496-10:2022. Версию от 2004 года можно найти, а вот от 2022 нет, или я не там ищу. Или как купить эту спецификацию будучи жителем РФ?
_>Да
В целом, свою задачу я успешно для себя решил, битый AVC1+AAC LC успешно восстанавливается и без moov, но с образцом хорошего файла, на выходе имею корректный mp4, который корректно проигрывается в видеоплеерах. Решил еще поковырять H.265/HEVC, но с документацией сильно сложнее. Может быть есть в ваших загашниках ISO/IEC 23008-2:2023?