Как конвертировать MP4 в Base64
- Перетащите файл
.mp4в поле или выберите его через диалог. - Воспроизведите его в превью. Если здесь он не играет, то и из data URI в этом браузере, скорее всего, не заиграет.
- Для тегов
<video>оставьте в Формат вывода вариант Data URI, а для API выберите Чистый Base64 или JSON. - Нажмите Скопировать результат или, для больших файлов, Сохранить как .txt.
Длина в Base64 для разных битрейтов
Размер MP4 примерно равен битрейту, умноженному на длительность. Для ролика в 10 секунд:
| Общий битрейт | Размер файла | Длина Base64 |
|---|---|---|
| 0,5 Мбит/с | 625 000 байт | 833 336 симв. |
| 1 Мбит/с | 1 250 000 байт | 1 666 668 симв. |
| 2,5 Мбит/с | 3 125 000 байт | 4 166 668 симв. |
| 5 Мбит/с | 6 250 000 байт | 8 333 336 симв. |
Записи с телефона часто идут с битрейтом 10 Мбит/с и выше, так что уже десять секунд такого видео без обработки дают больше 16 миллионов символов. Сначала перекодируйте ролик в меньшее разрешение и битрейт; проверенная команда ffmpeg для этого есть на странице Видео в Base64.
Бренд ftyp в первых символах
Первый блок MP4 объявляет основной бренд, который сообщает плеерам, какой спецификации следует файл. Его видно в Base64:
| Бренд | Что означает | Base64 (блок ftyp в 32 байта) |
|---|---|---|
isom | базовый медиафайл ISO, общий бренд (по умолчанию в ffmpeg) | AAAAIGZ0eXBpc29t |
mp42 | MP4 версии 2 | AAAAIGZ0eXBtcDQy |
M4V | вариант видео MP4 от Apple | AAAAIGZ0eXBNNFYg |
qt | фильм QuickTime (.mov) | AAAAIGZ0eXBxdCAg |
Пятый символ меняется вместе с размером блока (G для 24 байт, H для 28, I для 32), поэтому код распознавания должен искать GZ0eXB после первых пяти символов. Бренд qt значит, что перед вами фильм QuickTime с расширением .mp4; он может и воспроизводиться, но если получатель проверяет тип, указывайте video/quicktime.
Встраивание и отправка
Короткий зацикленный ролик без звука в самодостаточной HTML-странице:
<video autoplay muted loop playsinline src="data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21p..."></video>
Отправка ролика в JSON-запросе из Node.js:
import { readFile } from "node:fs/promises";
const video = await readFile("clip.mp4");
const body = JSON.stringify({
mimeType: "video/mp4",
data: video.toString("base64"),
});
Имена полей здесь условные; используйте те, что указаны в документации вашего API. Подробнее в статье Base64 в Node.js.
Проблемы, с которыми можно столкнуться
- Data URI играет в Safari, но не в Chrome или Firefox. Скорее всего, видеодорожка в HEVC. Перекодируйте в H.264.
- Страница зависает при загрузке. Браузер разбирает огромную строку. Data URI больше нескольких мегабайт лучше заменить URL файла или Blob URL.
- Получатель говорит, что файл повреждён. Сравните длину после декодирования с исходным размером файла в счётчике: у обрезанной строки пропадает конец файла, а многие MP4 хранят там свой индекс. Base64 в MP4 покажет, воспроизводится ли декодированный ролик.
Вопросы и ответы
Почему Base64 моего MP4 начинается с AAAA?
MP4 начинается с размера первого блока, ftyp, записанного 4-байтовым числом. У любого обычного заголовка первые три байта нулевые, а нулевые байты кодируются в A. Дальше идут имя блока ftyp и бренд, например AAAAIGZ0eXBpc29t для бренда isom.
Будет ли MP4 из data URI воспроизводиться во всех браузерах?
Да, если видео в H.264, а звук в AAC. MP4 с HEVC (H.265) воспроизводятся в Safari и лишь в некоторых других браузерах, в зависимости от системы. Сам по себе контейнер воспроизведение не гарантирует.
Как отправить MP4 в API в виде Base64?
Выберите Чистый Base64, если в документации API не сказано про data URI, и укажите тип video/mp4. Сверьте лимит размера в API с длиной после кодирования: она на треть больше файла.