«codec not currently supported in container»: mp4 умеет A-law

·

4 мин чтения

Жёсткий циановый контейнер отвергает амбер-звуковую волну на пороге, рядом такой же контейнер спокойно держит её внутри
Паспорт генерации изображения

МодельQwen-Image 2512

КвантованиеQ6_K GGUF

Сид9

Шаги26

CFG2.5

Размер1360×768

Сэмплерeuler · simple

Время генерации18:36

Промт генерации изображения

Dark neon 'underside of progress' scene, cyberpunk workshop mood. A rigid teal-cyan container box with a narrow slot-tag refusing a warm amber sound-wave at its threshold; right beside it an identical box calmly holds the same amber wave inside, glowing and playing; a cold pedantic gatekeeper versus sound that fits elsewhere. Etched metal casings, tiny stamped codec markings, rivets and seams, transformer hum, dust in the light beam. Deep shadow, volumetric haze, warm amber and cyan color palette, shallow depth of field, cinematic film still on 35mm, intricately detailed, ultra-detailed, fine textures, rich layered background, ornate mechanical detail, sharp focus, moody atmosphere.

История о том, как одна строчка в логе ffmpeg может заставить поверить в техническую невозможность того, что уже работает.

Симптом проявился мгновенно и сухо. Пытаюсь сохранить живой поток с камеры в mp4 - HEVC для видео и G.711 A-law для звука. Инструмент записи выплевывает ошибку и закрывается, даже не создав файл: Could not find tag for codec pcm_alaw... codec not currently supported in container. Следом прилетает финальный аккорд: Could not write header.

Вердикт кажется очевидным. Контейнер mp4 просто не поддерживает этот кодек. Технический тупик, который не требует обсуждений: либо менять формат контейнера, либо перекодировать звук.

Попытки найти лазейку

Первым делом попробовал MPEG-TS. Казалось бы, транспортный поток должен переварить всё. Файл записался, но на выходе получилась пустышка: звук превратился в bin_data, который не воспроизводит ни один плеер. В TS нет стандартного типа потока для A-law, и данные просто лежат там «сырым» куском, который никто не знает, как читать.

Ситуация выглядела безнадёжной. Два разных контейнера двумя разными способами подтвердили: «так нельзя». Я уже начал перестраивать архитектуру архива, чтобы хранить видео без звука, смирившись с тем, что A-law и mp4 - вещества, которые не смешиваются.

Файл, который не должен существовать

В этот момент возник вопрос: а как сама камера пишет архив на свою SD-карту? Она ведь делает именно это - записывает видео со звуком в mp4, и эти файлы прекрасно играются в любом приложении.

Вытащил карту памяти, закинул файлы на компьютер и прогнал через ffprobe. Результат ударил по уверенности:

major_brand: mp42
Stream #0:1: Audio: pcm_alaw (alaw / 0x77616C61), 16000 Hz, mono, s16, 128 kb/s

A-law спокойно лежал внутри mp4. Он не просто там был - он работал. Оказалось, что «неподдерживаемый кодек» поддерживается на уровне спецификации или, по крайней мере, на уровне некоторых реализаций. Миф был не про формат файла, а про конкретный инструмент, который я использовал для записи.

Где зарыта собака

Попытки заставить ffmpeg сделать так же провалились. Ни флаг -strict experimental, ни попытка принудительно назначить тег через -tag:a alaw не помогли. Ошибка оставалась прежней.

Вместе с ИИ полез в исходники, чтобы понять, почему инструмент отказывается писать то, что умеет читать. Ответ нашелся в файле movenc.c. Внутри него живет таблица ff_codec_movaudio_tags - своего рода «белый список» разрешенных аудио-кодеков для контейнеров семейства MOV/MP4.

Механика простая и жестокая: муксер ffmpeg сверяет кодек с этой захардкоженной таблицей до того, как применит любые пользовательские теги. Если кодека нет в списке - запись обрывается с той самой ошибкой про «неподдерживаемый контейнер». Камера же использует собственный муксер, который плевать хотел на подобные списки и просто пишет данные в файл.

Починить это стандартными средствами команды невозможно. Только пересборка ffmpeg с патчем исходников, чтобы добавить pcm_alaw в таблицу. В данной задаче это было признано избыточным - проще оставить звук на SD-карте, а в основном архиве держать только видео.

Изнанка ошибки

Эта история подсветила одну неприятную особенность технического языка. Формулировка codec not currently supported in container звучит как фундаментальное ограничение формата. Она заставляет поверить, что вы уперлись в стену стандарта.

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

ИИ здесь сработал как хороший ревизор: он не просто согласился с логом ошибки, а помог развести гипотезу «формат не поддерживает» и «инструмент отказывается писать». Когда мы увидели hex-код тега 0x77616C61 (что в ASCII читается просто как "alaw") в реальном файле, стало ясно, что стена - иллюзорная. Она существует только внутри кода ffmpeg.

Часть темы «Умный дом без облака» - там собраны остальные разборы этого стека.

Как зашло?