Kde ve struktuře mp4 souboru je doba trvání?
To nemusí být odpověď na váš problém, ale mělo to být: http://mediainfo.sourceforge.net/
(Má knihovnu a je to open source, takže stačí zkontrolovat, které části potřebujete)
Viz https://github.com/sannies/mp4parser project. Jedná se o knihovnu Java, která zobrazuje strukturu souborů mp4.
Pokud vím - kontejner "mp4" je odvozen od struktury atomů QuickTime. Můžete si přečíst popis formátu souboru QuickTime.
Analyzování quicktime atomů není velký problém (podívejte se na atomicParsley project ). Nejsem si jistý, pro MP4, ale jako pro MOV-soubory - tam je "trvání" pole v "mvhd" (film záhlaví) atom a také v "tkhd" (záhlaví stopy) atom. Tato doba je obvykle počet snímků vynásobených atributem "time scale". Časové měřítko lze nalézt ve stejných atomech.
Pro čtečku Red5 MP4 jsem použil atom "mvhd", protože obsahuje pole času i trvání. Získání doby trvání od atomu se bude lišit podle použité verze, níže je uveden příklad: 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;
}
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;
return readed;
}
Na postranní poznámce jsem použil hodnoty pro výpočet hracího času a fps tak:
Proměnná videoSampleCount pochází z "stsz" atomu. double fps = (videoSampleCount * timeScale) / (double) duration;
double videoTime = ((double) duration / (double) timeScale);
MP4 je "kontejnerový" formát, který v podstatě znamená, že může obsahovat řadu různých audio nebo video proudů. Každý proud by mohl mít vlastní hodnotu trvání ...
Chcete-li vykopat to, co potřebujete, budete chtít nějaké další referenční soubory. Mohl bych navrhnout, abyste se podívali na zde a zde ... ale pravděpodobně budete muset hledat i jiné typy proudů A/V, které chcete podporovat.
Použitím programu MP4Parser http://code.google.com/p/mp4parser/ jako předchozí zmíněný plakát mají dokonce i vzorek, který poskytuje trvání:
Struktura MP4 je v podstatě strom. Makro oblasti jsou:
Můžete vyzkoušet tento freeware MP4 Analyzer nástroj
http://www.thinmultimedia.co.kr/products/MP4Reader_download.html
Doba trvání filmu je v záhlaví filmu mvhd. Délka v sekundách je odvozena ze dvou polí v mvhd.
Jedná se o řádky 380 a 382 ve specifikaci @Tom Brito.
Tak daný časový rozsah 'ts' a trvání 'dur' Duration in seconds = dur / ts