2015-08-11 5 views
1

Для всех, кто имеет опыт использования jcodec, я понимаю, что библиотека еще не может кодировать аудио (она может ее декодировать).Может ли jcodec добавлять аудио в файл MP4?

Однако jcodec действительно есть PCMMP4MuxerTrack class, который позволяет вам addSamples (ByteBuffer) необработанных данных PCM для звуковой дорожки при кодировании ваш MP4 видео. Это создает видеофайл MP4 со звуком.

Я успешно добавлен фиктивный PCM аудио в качестве MP4 файл, который я экспортируемые и VLC играл это правильно, так что это, кажется, работает ...


Но если это работает, почему я продолжаю видя, что люди говорят, что MP4 не поддерживает аудио PCM (one source)?

Мне просто повезло, что VLC точно воспроизводит мой MP4-файл со звуком? Может ли он не работать на других игроках/операционных системах?

+0

«Почему я все время вижу, что люди говорят, что MP4 не поддерживает аудио PCM?», Потому что это не так. MP4 - MPEG для хранения только MPEG-кодеков (видео h.264/h.265 и аудио AAC/MP3). В VLC перейдите к ** Tools **, затем ** Codec Information **. Поток 0 обычно является видео, а stream1 - аудио. Говорит ли звук MP4a? (тогда JCodec конвертировал PCM в AAC или MP3), иначе это означает, что вам повезло, что VLC сыграл его. Проверьте также перетаскивание файла на вкладку браузера (он может работать, поскольку браузеры понимают как AAC, так и PCM). Если браузеры могут играть, это тоже достаточно? –

+0

А, это действительно очень полезно, я не знал, что трюк VLC. Это действительно PCM, что хорошо знать, так как мне было интересно, если jcodec конвертирует в AAC/MP3 за кулисами - не думаю. – FTLRalph

+0

К сожалению, Java не является моим основным языком, но я понимаю медиаформаты. Я не понимаю, как JCodec может писать PCM, но не AAC/MP3-байты в том же месте? Если вы ** [смотрите здесь] (https://github.com/jcodec/jcodec/tree/master/src/main/java/org/jcodec/containers/mp4/muxer) **, то я думаю, что либо ** MP4Muxer .java ** или ** FramesMP4MuxerTrack.java ** поможет вам добавить звуковые кадры. Звук MP3 и AAC разделяется на сами кадры, поэтому, возможно, «за цикл» захватывает каждый байт AAC и мультиплексор? –

ответ

2

Я надеюсь, что это работает, вы мне скажите .. Открыть файл AAC в Java, чтобы читать его байты

1) Подготовить переменные

int frameLength; 
byte[] header = new byte[7]; //a byte array of 7 slots 

2) Теперь скопируйте первые 7 байт потока AAC файлов в этот «заголовок» массив

frameLength = (header[3]&0x03) << 11 | 
       (header[4]&0xFF) << 3 | 
       (header[5]&0xFF) >> 5 ; 

3) с 8-го байта в AAC года вы можете скопировать все байты до FrameLength минус 7. минус 7, потому что извлеченный FrameLength включает в себя 7 БЮТ es заголовка AAC (называемого заголовком ADTS), а в MP4 у вас есть звук минус ADTS, поэтому каждая копия кадра должна пропускать эти 7 байтов.

Совет: Первые 5 байтов заголовка остаются одинаковыми для каждого кадра, поэтому вы можете искать этот паттерн байтов по всему файлу для определения позиций каждого кадра AAC, и если вы знаете предыдущее начало кадра, тогда вы также можете разработать длину.

Теперь у вас есть один кадр AAC, и вы можете попробовать использовать FramesMP4MuxerTrack.java, который имеет функцию addFrame(MP4Packet pkt) где MP4Packet pkt будут скопированный AAC кадр байты. Вы вызываете функцию каждый раз, когда у вас новый кадр AAC.

+0

Большое спасибо за то, что нашли время, чтобы собрать все это, это кажется мне действительно полезным и дает мне возможность работать, любопытно видеть если этот подход будет работать. Еще раз спасибо. – FTLRalph