The file format of 3GP is found by Google. <br/> a PHP example is provided. It is very practical. <br/> <? <Br/> function get3gpinfo ($ videofn, $ DEBUG = false) <br/>{< br/> $ info = array (); <br/> $ fheader = "nsize/a4type/a4brand/nversion"; <br/> $ length = 4 + 4 + 4 + 4; <br/> $ fp = fopen ($ videofn, "rb"); <br/> $ DATA = fread ($ FP, $ length ); <br/> $ header = unpack ("@ 0/$ fheader", $ data); <br/> If (substr ($ header ['brand'], 0, 3 )! = '3gp ') <br/> return false; <br/> $ DATA = fread ($ FP, $ header ['SIZE']-$ length ); <br/> $ header ['compatiblebrand'] = $ data; <br/> $ info ['type'] = $ header ['type']; <br/> $ info ['brand'] = $ header ['brand']; <br/> $ info ['compatiblebrand'] = $ header ['compatiblebrand']; <br/> if ($ Debug) <br/>{< br/> echo "<br> header:"; <br/> print_r ($ header ); <br/> echo "<br>"; <br/>}< br/> $ BK = ""; </P> <p> while (! Feof ($ FP) <br/>{< br/> $ f_atom = "nsize/a4name"; <br/> $ l_atom = 4 + 4; <br/> $ DATA = fread ($ FP, $ l_atom); <br/> If (! $ Data) <br/> break; <br/> $ atom = unpack ("@ 0/$ f_atom", $ data ); <br/> // print_r ($ atom); <br/> $ p_atom = ftell ($ FP); <br/> // echo "<br> "; <br/> switch ($ atom ['name']) <br/>{< br/> case 'moov ': <br/> $ level = 0; <br/> break; <br/> case 'mdat ': <br/> $ level = 0; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'mvhd ': <br/> $ level = 1; <br/> $ DATA = fread ($ FP, $ atom ['SIZE']-$ L _ Atom); <br/> $ f_mvhd = "h2version/h6flag/h8creationtime/h8modificationtime/ntimescale/nduration/x80notuse "; <br/> $ array = unpack ("@ 0/$ f_mvhd", $ data ); <br/> $ info ['len'] = $ array ['duration']/$ array ['timescale']; <br/> break; <br/> case 'trak': <br/> $ level = 1; <br/> break; <br/> case 'iods ': <br/> $ level = 1; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'tkhd ': <br/> $ Level = 2; <br/> $ f_tkhd = "h2version/h6falg/h8ctime/h8mtime/ntrackid/x4r1/ndruation/x52r2/ntrackwidth/ntrackheight "; <br/> $ DATA = fread ($ FP, $ atom ['SIZE']-$ l_atom ); <br/> $ array = unpack ("@ 0/$ f_tkhd", $ data ); <br/> $ info ['track'] ['id'] [] = $ array ['trackid']; <br/> $ info ['track'] ['width'] [] = $ array ['trackwidth']> 16; <br/> $ info ['track'] ['height'] [] = $ array ['trackheight']> 16; <br/> Break; <Br/> case 'tref': <br/> $ level = 2; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'rtng ': <br/> $ level = 2; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'uuuid ': <br/> if ($ level <3) <br/> $ level = 2; <br/> else <br/> $ level = 3; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'mdia ': <br/> $ level = 2; <br/> // $ da Ta = fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'mdhd ': <br/> $ level = 3; <br/> $ f_mdhd = "h2version/h6flag/h8ctime/h8mtime/ntimescale/nduration/x4r "; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom ); <br/> $ array = unpack ("@ 0/$ f_mdhd", $ data ); <br/> $ info ['track'] ['len'] [] = $ array ['duration']/$ array ['timescale']; <br/> $ timescale = $ array ['timescale']; <br/> break; <br/> case' Hdlr ': <br/> $ level = 3; <br/> $ f_hdlr = "h2version/h6flag/a4type/a4subtype/a4manufacturer/h8cflag/h8cmask "; <br/> $ l_hdlr = 1 + 3 + 4 + 4 + 4 + 4 + 4; <br/> $ DATA = fread ($ FP, $ l_hdlr ); <br/> $ array = unpack ("@ 0/$ f_hdlr", $ data ); <br/> $ info ['track'] ['type'] [] = $ array ['subtype']; <br/> $ tracktype = $ array ['subtype']; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom-$ l_hdlr); <br/> break; <br/> case 'minf': <B R/> $ level = 3; <br/> // $ DATA = fread ($ FP, $ moov ['SIZE']-$ l_moov); <br/> break; <br/> case 'smhd': <br/> $ level = 4; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'vmhd ': <br/> $ level = 4; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'hmhd ': <br/> $ level = 4; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'nmhd': <Br/> $ level = 4; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'dinf': <br/> $ level = 4; <br/> // $ DATA = fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'dref': <br/> $ level = 5; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'stbl ': <br/> $ level = 4; <br/> // $ DATA = fread ($ FP, $ atom ['SIZE']-$ l_atom ); <br/> break; <br/> case 'stsd': <Br/> $ level = 5; <br/> $ f_stsd = "h2version/h6falg/nentries/ndescsize/a4dataformat/x6reserved/h4dataindex "; <br/> $ l_stsd = 1 + 3 + 4 + 4 + 4 + 6 + 2; <br/> $ DATA = fread ($ FP, $ l_stsd ); <br/> $ array = unpack ("@ 0/$ f_stsd", $ data ); <br/> $ info ['track'] ['dataformat'] [] = $ array ['dataformat']; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom-$ l_stsd); <br/> break; <br/> case 'stts': <br/> $ level = 5; <br/> $ f_s TTS = "h2version/h6flag/nentries"; <br/> $ l_stts = 1 + 3 + 4; <br/> $ DATA = fread ($ FP, $ l_stts ); <br/> $ array = unpack ("@ 0/$ f_stts", $ data); <br/> $ f_stts_e = "nsamplecount/nsampleduration "; <br/> $ l_stts_e = 4 + 4; <br/> $ totalsampleduration = 0; <br/> for ($ I = 0; $ I <$ array ['entries']; $ I ++) <br/>{< br/> $ DATA = fread ($ FP, $ l_stts_e ); <br/> $ t_array = unpack ("@ 0/$ f_stts_e", $ data); <br/> $ totalsampled Uration + = $ t_array ['sampleduration']; <br/>}< br/> if ($ tracktype = 'vide ') <br/>{< br/> $ avgsampleduration = $ totalsampleduration/$ array ['entries']; <br/> $ info ['framerate'] = $ timescale/$ avgsampleduration; <br/>}< br/> // $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'stss': <br/> $ level = 5; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case' STSC ': <br/> $ level = 5; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom ); <br/> break; <br/> case 'stsz ': <br/> $ level = 5; <br/> $ DATA = fread ($ FP, 4 ); <br/> // $ array = unpack ("nentries", fread ($ FP, 4 )); <br/> // $ S = $ atom ['SIZE']-$ l_Atom-4; <br/> // $ F = "nsamplesize/N ". ($ S/4-1 ). "samplecount"; <br/> $ F = "nsamplesize/nsamplecount"; <br/> $ DATA = fread ($ FP, 8 ); <br/> $ array = unpack ("@ 0/$ F", $ dat A); <br/> if ($ array ['samplesize']) <br/>{< br/> $ totalsize = $ array ['samplessize'] * $ array ['samplescount']; <br/> $ info ['track'] ['bitrate'] [] = intval ($ totalsize/$ info ['len'] * 8/1000 + 0.005) * 100) /100; <br/>}< br/> else <br/>{< br/> $ totalsize = 0; <br/> for ($ I = 0; $ I <$ array ['samplecount']; $ I ++) <br/>{< br/> $ t_array = unpack ("@ 0/nentrysize ", fread ($ FP, 4); <br/> $ totalsize + = $ T _ Array ['entrysize']; <br/>}< br/> $ info ['track'] ['bitrate'] [] = intval ($ totalsize/$ info ['len'] * 8/1000 + 0.005) * 100)/100; <br/>}< br/> $ info ['track'] ['datasize '] [] = $ totalsize; <br/> break; <br/> case 'meta': <br/> $ level = 3; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'udta ': <br/> if ($ level> 1) <br/> $ level = 2; <br/> else <br/> $ level = 1; <br/> // $ dat A = fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> case 'hnti ': <br/> if ($ level> 0) <br/> $ level = 3; <br/> else <br/> $ level = 1; <br/> break; <br/> case 'sdp ': <br/> if ($ level> 0) <br/> $ level = 4; <br/> else <br/> $ level = 2; <br/> $ f_sdp = "". ($ atom ['SIZE']-$ l_atom ). "SDP"; <br/> $ DATA = fread ($ FP, $ atom ['SIZE']-$ l_atom ); <br/> $ array = unpack ("@ 0/$ f_sdp", $ data); <br/> $ info ['track'] ['Sdp '] [] = $ array ['sdp']; <br/> break; <br/> case 'rtp ': <br/> $ level = 4; <br/> $ f_sdp = "". ($ atom ['SIZE']-$ l_atom ). "RTP"; <br/> $ DATA = fread ($ FP, $ atom ['SIZE']-$ l_atom ); <br/> $ array = unpack ("@ 0/$ f_sdp", $ data); <br/> break; <br/> case 'stco ': <br/> $ level = 5; <br/> $ DATA = @ fread ($ FP, $ atom ['SIZE']-$ l_atom); <br/> break; <br/> default: <br/> $ level = 0; <br/> $ DATA = @ fread ($ FP, $ atom ['si Ze ']-$ l_atom); <br/> break; <br/>}< br/> if ($ Debug) <br/>{< br/> for ($ I = 0; $ I <$ level; $ I ++) <br/> echo "$ BK "; <br/> echo "| -". $ atom ['name']. ":"; <br/> If (count ($ array)> 0) <br/> print_r ($ array); <br/> echo "<br> "; <br/>}< br/> $ array = array (); <br/>}// while (! Feof ($ FP); // ftell ($ FP) <$ atom ['SIZE']-$ l_moov); <br/> fclose ($ FP ); <br/> return $ Info; <br/>}</P> <p> $ info = get3gpinfo (get ['fn '], get ['D']); <br/> If (! $ Info) <br/>{< br/> echo "not 3GP file !!! "; <Br/> exit; <br/>}< br/> echo" <br> "; <br/> echo" type :". $ info ['type']. "<br>"; <br/> echo "brand :". $ info ['brand']. "<br>"; <br/> echo "compatiblebrand :". $ info ['compatiblebrand']. "<br>"; <br/> echo "Len :". $ info ['len']. "secs <br>"; <br/> echo "framerate :". $ info ['framerate']. "<br>"; <br/> for ($ I = 0, $ J = 0; $ I <count ($ info ['track'] ['type']); $ I ++) <br/>{< br/> echo "<br> "; <br/> echo "track ". ($ I + 1 ). "ID :". $ Info ['track'] ['id'] [$ I]. "<br>"; <br/> echo "track ". ($ I + 1 ). "Type :". $ info ['track'] ['type'] [$ I]. "<br>"; <br/> echo "track ". ($ I + 1 ). "Format :". $ info ['track'] ['dataformat'] [$ I]. "<br>"; <br/> echo "track ". ($ I + 1 ). "datasize :". $ info ['track'] ['datasize '] [$ I]. "bytes <br>"; <br/> echo "track ". ($ I + 1 ). "Len :". $ info ['track'] ['len'] [$ I]. "secs <br>"; <br/> echo "track ". ($ I + 1 ). "bitrate :". $ info ['track'] ['bitr Ate '] [$ I]. "kbps <br>"; <br/> echo "track ". ($ I + 1 ). "width :". $ info ['track'] ['width'] [$ I]. "<br>"; <br/> echo "track ". ($ I + 1 ). "Height :". $ info ['track'] ['height'] [$ I]. "<br>"; <br/> if ($ info ['track'] ['type'] [$ I] = 'hint ') <br/> echo "track ". ($ I + 1 ). "SDP :". $ info ['track'] ['sdp '] [$ J ++]. "<br>"; <br/>}< br/>?>