Как декодировать Base64 в MP4
- Вставьте Base64 в поле Base64 или data URI. Префикс
data:video/mp4;base64,можно не убирать. Длинные строки открывайте кнопкой Открыть файл .txt; всё, что больше 4 MB, декодируется без показа в текстовом поле. - Плеер загрузит ролик. Длительность и Размеры появятся, когда браузер прочитает индекс, например
0:02.0и96 × 64 pxдля примера. - Посмотрите на область подсказок: для настоящего MP4 она пуста, иначе там будет назван формат.
- Нажмите Скачать файл.
Декодирование и воспроизведение остаются внутри браузера; странице запрещено выполнять сетевые запросы, кроме счётчика просмотров Cloudflare.
MP4, MOV, M4A: одна структура, несколько форматов
Файлы MP4 состоят из боксов, и первый бокс, ftyp, содержит бренд, который говорит, какому варианту формата следует файл. Инструмент читает этот бренд:
Бренд в ftyp | Определяется как | Подсказка на этой странице |
|---|---|---|
isom, mp41, mp42, avc1, iso6 и большинство остальных | MP4 | Нет |
qt | MOV (QuickTime) | «Похоже на MOV, а не на MP4.» с кнопкой Скачать как .mov |
M4A | M4A | «Похоже на M4A, а не на MP4.»: только аудио |
3gp4, 3gp5 и другие бренды 3g | 3GP, старое видео с телефонов | «Похоже на 3GP, а не на MP4.» |
heic, mif1, avif | HEIC, AVIF | «Похоже на HEIC, а не на MP4.»: статичные изображения в той же структуре боксов |
Ролик с брендом MP4 всё равно может содержать только звук. Он воспроизводится, а в строке Размеры написано только аудио. Если WebM прислали как «MP4», появится подсказка «Похоже на WebM, а не на MP4.»
Где лежит индекс и почему это важно для битых файлов
В каждом MP4 есть бокс moov: это индекс, по которому плеер находит каждый кадр. Многие кодировщики, включая ffmpeg, по умолчанию пишут его в конец файла, после медиаданных в mdat. С флагом -movflags +faststart ffmpeg переносит его в начало, чтобы потоковое воспроизведение могло начаться до того, как файл придёт целиком.
На этой странице весь файл находится в памяти, поэтому для полного ролика положение индекса не важно. Оно важно, когда Base64 обрезали из-за лимита размера в логе, столбце базы данных или очереди сообщений:
- Индекс в конце: обрезка уносит индекс, и ничего не воспроизводится. Инструмент всё равно пишет MP4, потому что первые байты целы, а плеер сообщает, что не может воспроизвести файл, и в строке Длительность стоит «н/д».
- Индекс в начале: браузер читает индекс, показывает полную длительность и играет, пока не кончатся данные.
Так что если длинный ролик не работает, а короткий работает, сравните декодированный размер с исходным, прежде чем винить кодек.
Как разобрать боксы на Python
Структура боксов достаточно проста, чтобы обойти её без библиотек: четыре байта размера, четыре байта типа, затем содержимое. Этот скрипт выводит боксы верхнего уровня и бренды:
import base64, struct
def mp4_boxes(data):
pos = 0
while pos + 8 <= len(data):
size, kind = struct.unpack(">I4s", data[pos:pos + 8])
if size == 1:
size = struct.unpack(">Q", data[pos + 8:pos + 16])[0]
elif size == 0:
size = len(data) - pos
yield kind.decode("latin-1"), pos, size
if size < 8:
break
pos += size
with open("clip.b64") as f:
data = base64.b64decode(f.read())
for kind, pos, size in mp4_boxes(data):
print(kind, pos, size)
if kind == "ftyp":
body = data[pos + 8:pos + size]
brands = [body[i:i + 4].decode("latin-1") for i in range(8, len(body), 4)]
print(" major:", body[:4].decode("latin-1"), "compatible:", brands)
Для ролика H.264, созданного ffmpeg, он выведет ftyp 0 32 с основным брендом isom, затем free, mdat и последним moov. moov перед mdat означает faststart; боксы moof означают фрагментированный MP4, какой делают для стриминга и какой используется в примере на этой странице. Если moov в списке нет, файл неполный.
Поддержка кодеков в разных браузерах описана на странице Base64 в видео. Закодировать ролик поможет MP4 в Base64, а о декодировании больших данных написано в статье Base64 в Python.
Вопросы и ответы
Как превратить Base64 в файл MP4?
Вставьте строку в поле выше, проверьте ролик в плеере и нажмите Скачать файл. Видео сохранится как decoded.mp4, байт в байт таким, каким его закодировали.
Почему браузер пишет, что не может воспроизвести MP4, хотя это MP4?
Либо внутри кодек, которого нет в вашем браузере, чаще всего HEVC, либо файл неполный и в нём нет индекса. ffprobe на скачанном файле различит эти случаи: он назовёт кодек или сообщит, что атом moov не найден.
Сохранять ли MOV как .mp4?
Лучше нажать Скачать как .mov: это расширение совпадает с содержимым. У MOV и MP4 во многом общая структура, поэтому переименование на практике часто срабатывает, но некоторые плееры проверяют бренд и отказываются открывать файл, если он не совпадает.