Кто-нибудь знаком со структурой данных mp4? - PullRequest
32 голосов
/ 17 июня 2010

Где в файловой структуре mp4 его длительность?

Ответы [ 9 ]

13 голосов
/ 25 июня 2010

Возможно, это не ответ на вашу проблему, но он был моим: http://mediainfo.sourceforge.net/

(у него есть библиотека и открытый исходный код, так что вы можете просто проверить нужные вам части)

8 голосов
/ 01 июля 2013

См. https://github.com/sannies/mp4parser проект. Это библиотека Java, которая показывает структуру файлов mp4.

6 голосов
/ 04 сентября 2010

Для читателя Red5 MP4 я использовал атом «mvhd», так как он содержит поля масштаба времени и длительности.Получение длительности от атома будет отличаться в зависимости от используемой версии, ниже вы можете увидеть пример: public long create_full_atom(MP4DataStream bitstream) throws IOException { long value = bitstream.readBytes(4); version = (int)value >> 24; flags = (int)value & 0xffffff; readed += 4; return readed; }</p> <p>public long create_movie_header_atom(MP4DataStream bitstream) throws IOException { create_full_atom(bitstream); if (version == 1) { creationTime = createDate(bitstream.readBytes(8)); modificationTime = createDate(bitstream.readBytes(8)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(8); readed += 28; } else { creationTime = createDate(bitstream.readBytes(4)); modificationTime = createDate(bitstream.readBytes(4)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(4); readed += 16; } int qt_preferredRate = (int)bitstream.readBytes(4); int qt_preferredVolume = (int)bitstream.readBytes(2); bitstream.skipBytes(10); long qt_matrixA = bitstream.readBytes(4); long qt_matrixB = bitstream.readBytes(4); long qt_matrixU = bitstream.readBytes(4); long qt_matrixC = bitstream.readBytes(4); long qt_matrixD = bitstream.readBytes(4); long qt_matrixV = bitstream.readBytes(4); long qt_matrixX = bitstream.readBytes(4); long qt_matrixY = bitstream.readBytes(4); long qt_matrixW = bitstream.readBytes(4); long qt_previewTime = bitstream.readBytes(4); long qt_previewDuration = bitstream.readBytes(4); long qt_posterTime = bitstream.readBytes(4); long qt_selectionTime = bitstream.readBytes(4); long qt_selectionDuration = bitstream.readBytes(4); long qt_currentTime = bitstream.readBytes(4); long nextTrackID = bitstream.readBytes(4); readed += 80;<br> return readed;<br> } В дополнение к этому я использовал значения для вычисления времени воспроизведения и fps следующим образом: double fps = (videoSampleCount * timeScale) / (double) duration; double videoTime = ((double) duration / (double) timeScale); Переменная videoSampleCount происходит из атома "stsz".

6 голосов
/ 13 июля 2010

Насколько я знаю - контейнер "mp4" является производным от структуры атома QuickTime. Вы можете прочитать описание формата файла QuickTime.

Разбор быстрых атомов не имеет большого значения (посмотрите на проект atomicParsley ). Я не уверен в MP4, но что касается MOV-файлов - в атоме mvhd (заголовок фильма) есть поле "duration", а в атоме "tkhd" (заголовок дорожки) Эта длительность обычно представляет собой количество кадров, умноженное на атрибут «шкала времени». Шкала времени может быть найдена в тех же атомах.

4 голосов
/ 25 июня 2010

MP4 - это «контейнерный» формат, который в основном означает, что он может содержать несколько различных аудио или видео потоков. И у каждого потока может быть свое значение продолжительности ...

Чтобы выкопать то, что вам нужно, вам понадобятся дополнительные справочные файлы. Я мог бы предложить поискать здесь и здесь ... но вам, вероятно, придется пойти дальше, чтобы найти различные типы аудио / видео потоков, которые вы хотите поддерживать.

1 голос
/ 25 марта 2015

В основном структура MP4 - это дерево. Макрообласти:

  • ftyp - тип файла
  • moov - содержит метаданные (название песни, авторы, URL и другая информация)
  • бесплатно - пустая область для разделения заголовка и данных
  • mdat - содержит аудио кадры

Вы можете попробовать этот бесплатный инструмент MP4 Analyzer

http://www.thinmultimedia.co.kr/products/MP4Reader_download.html

1 голос
/ 06 ноября 2013

Использование MP4Parser http://code.google.com/p/mp4parser/, как упоминалось в предыдущем постере - у них даже есть образец, который обеспечивает продолжительность:

https://mp4parser.googlecode.com/svn/trunk/examples/src/main/java/com/googlecode/mp4parser/GetDuration.java

0 голосов
/ 11 июля 2015

Продолжительность фильма указана в заголовке фильма mvhd. Продолжительность в секундах выводится из двух полей в mvhd.

  • 4-байтовая шкала времени
  • Продолжительность 4 байта

Это строки 380 и 382 в спецификации, опубликованной @Tom Brito.

Итак, с учетом шкалы времени 'ts' и продолжительности 'dur' Duration in seconds = dur / ts

0 голосов
/ 19 октября 2012

Media Box Viewer может быть использован. Это MP4 и парсер Quicktime. Когда вы открываете файл Quicktime, вы можете увидеть структуру атома. Ищите видео описание атома. Одним из его свойств является продолжительность. Media Box Viewer можно загрузить с www.jdxsoftware.org .

...