83 $info = &$this->getid3->info;
87 $FLVdataLength =
$info[
'avdataend'] -
$info[
'avdataoffset'];
88 $FLVheader = $this->
fread(5);
90 $info[
'fileformat'] =
'flv';
91 $info[
'flv'][
'header'][
'signature'] = substr($FLVheader, 0, 3);
95 if ($info[
'flv'][
'header'][
'signature'] != self::magic) {
97 unset($info[
'flv'], $info[
'fileformat']);
101 $info[
'flv'][
'header'][
'hasAudio'] = (bool) ($TypeFlags & 0x04);
102 $info[
'flv'][
'header'][
'hasVideo'] = (bool) ($TypeFlags & 0x01);
105 $FLVheaderFrameLength = 9;
106 if ($FrameSizeDataLength > $FLVheaderFrameLength) {
107 $this->
fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);
110 $found_video =
false;
111 $found_audio =
false;
113 $found_valid_meta_playtime =
false;
115 $info[
'flv'][
'framecount'] =
array(
'total'=>0,
'audio'=>0,
'video'=>0);
116 $flv_framecount = &$info[
'flv'][
'framecount'];
117 while ((($this->
ftell() + 16) < $info[
'avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime)) {
118 $ThisTagHeader = $this->
fread(16);
125 $NextOffset = $this->
ftell() - 1 + $DataLength;
126 if ($Timestamp > $Duration) {
127 $Duration = $Timestamp;
130 $flv_framecount[
'total']++;
133 $flv_framecount[
'audio']++;
136 $info[
'flv'][
'audio'][
'audioFormat'] = ($LastHeaderByte >> 4) & 0x0F;
137 $info[
'flv'][
'audio'][
'audioRate'] = ($LastHeaderByte >> 2) & 0x03;
138 $info[
'flv'][
'audio'][
'audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01;
139 $info[
'flv'][
'audio'][
'audioType'] = $LastHeaderByte & 0x01;
144 $flv_framecount[
'video']++;
147 $info[
'flv'][
'video'][
'videoCodec'] = $LastHeaderByte & 0x07;
149 $FLVvideoHeader = $this->
fread(11);
163 if (($numOfSequenceParameterSets & 0x1F) != 0) {
169 $sps = $this->
fread($spsSize);
170 if (strlen($sps) == $spsSize) {
172 $spsReader->readData();
173 $info[
'video'][
'resolution_x'] = $spsReader->getWidth();
174 $info[
'video'][
'resolution_y'] = $spsReader->getHeight();
183 $PictureSizeType = $PictureSizeType & 0x0007;
184 $info[
'flv'][
'header'][
'videoSizeType'] = $PictureSizeType;
185 switch ($PictureSizeType) {
196 $info[
'video'][
'resolution_x'] = $PictureSizeEnc[
'x'] & 0xFF;
197 $info[
'video'][
'resolution_y'] = $PictureSizeEnc[
'y'] & 0xFF;
203 $info[
'video'][
'resolution_x'] = $PictureSizeEnc[
'x'] & 0xFFFF;
204 $info[
'video'][
'resolution_y'] = $PictureSizeEnc[
'y'] & 0xFFFF;
208 $info[
'video'][
'resolution_x'] = 352;
209 $info[
'video'][
'resolution_y'] = 288;
213 $info[
'video'][
'resolution_x'] = 176;
214 $info[
'video'][
'resolution_y'] = 144;
218 $info[
'video'][
'resolution_x'] = 128;
219 $info[
'video'][
'resolution_y'] = 96;
223 $info[
'video'][
'resolution_x'] = 320;
224 $info[
'video'][
'resolution_y'] = 240;
228 $info[
'video'][
'resolution_x'] = 160;
229 $info[
'video'][
'resolution_y'] = 120;
233 $info[
'video'][
'resolution_x'] = 0;
234 $info[
'video'][
'resolution_y'] = 0;
242 if (!isset($info[
'video'][
'resolution_x'])) {
245 $info[
'video'][
'resolution_x'] = ($PictureSizeEnc[
'x'] & 0xFF) << 3;
246 $info[
'video'][
'resolution_y'] = ($PictureSizeEnc[
'y'] & 0xFF) << 3;
251 if (!empty($info[
'video'][
'resolution_x']) && !empty($info[
'video'][
'resolution_y'])) {
252 $info[
'video'][
'pixel_aspect_ratio'] = $info[
'video'][
'resolution_x'] / $info[
'video'][
'resolution_y'];
261 $this->
fseek(-1, SEEK_CUR);
262 $datachunk = $this->
fread($DataLength);
265 $eventName =
$reader->readData();
266 $info[
'flv'][
'meta'][$eventName] =
$reader->readData();
269 $copykeys =
array(
'framerate'=>
'frame_rate',
'width'=>
'resolution_x',
'height'=>
'resolution_y',
'audiodatarate'=>
'bitrate',
'videodatarate'=>
'bitrate');
270 foreach ($copykeys as $sourcekey => $destkey) {
271 if (isset($info[
'flv'][
'meta'][
'onMetaData'][$sourcekey])) {
272 switch ($sourcekey) {
275 $info[
'video'][$destkey] = intval(round($info[
'flv'][
'meta'][
'onMetaData'][$sourcekey]));
277 case 'audiodatarate':
278 $info[
'audio'][$destkey] =
getid3_lib::CastAsInt(round($info[
'flv'][
'meta'][
'onMetaData'][$sourcekey] * 1000));
280 case 'videodatarate':
283 $info[
'video'][$destkey] = $info[
'flv'][
'meta'][
'onMetaData'][$sourcekey];
288 if (!empty($info[
'flv'][
'meta'][
'onMetaData'][
'duration'])) {
289 $found_valid_meta_playtime =
true;
298 $this->
fseek($NextOffset);
301 $info[
'playtime_seconds'] = $Duration / 1000;
302 if ($info[
'playtime_seconds'] > 0) {
303 $info[
'bitrate'] = (($info[
'avdataend'] - $info[
'avdataoffset']) * 8) / $info[
'playtime_seconds'];
306 if ($info[
'flv'][
'header'][
'hasAudio']) {
307 $info[
'audio'][
'codec'] = self::audioFormatLookup($info[
'flv'][
'audio'][
'audioFormat']);
308 $info[
'audio'][
'sample_rate'] = self::audioRateLookup($info[
'flv'][
'audio'][
'audioRate']);
309 $info[
'audio'][
'bits_per_sample'] = self::audioBitDepthLookup($info[
'flv'][
'audio'][
'audioSampleSize']);
311 $info[
'audio'][
'channels'] = $info[
'flv'][
'audio'][
'audioType'] + 1;
312 $info[
'audio'][
'lossless'] = ($info[
'flv'][
'audio'][
'audioFormat'] ? false :
true);
313 $info[
'audio'][
'dataformat'] =
'flv';
315 if (!empty($info[
'flv'][
'header'][
'hasVideo'])) {
316 $info[
'video'][
'codec'] = self::videoCodecLookup($info[
'flv'][
'video'][
'videoCodec']);
317 $info[
'video'][
'dataformat'] =
'flv';
318 $info[
'video'][
'lossless'] =
false;
322 if (!empty($info[
'flv'][
'meta'][
'onMetaData'][
'duration'])) {
323 $info[
'playtime_seconds'] = $info[
'flv'][
'meta'][
'onMetaData'][
'duration'];
324 $info[
'bitrate'] = (($info[
'avdataend'] - $info[
'avdataoffset']) * 8) / $info[
'playtime_seconds'];
326 if (isset($info[
'flv'][
'meta'][
'onMetaData'][
'audiocodecid'])) {
327 $info[
'audio'][
'codec'] = self::audioFormatLookup($info[
'flv'][
'meta'][
'onMetaData'][
'audiocodecid']);
329 if (isset($info[
'flv'][
'meta'][
'onMetaData'][
'videocodecid'])) {
330 $info[
'video'][
'codec'] = self::videoCodecLookup($info[
'flv'][
'meta'][
'onMetaData'][
'videocodecid']);
const GETID3_FLV_TAG_VIDEO
const GETID3_FLV_TAG_META
const GETID3_FLV_TAG_AUDIO
getID3() by James Heinrich info@getid3.org //
static LittleEndian2Int($byteword, $signed=false)
const GETID3_FLV_VIDEO_VP6FLV_ALPHA
const GETID3_FLV_VIDEO_H264
static CastAsInt($floatnum)
static PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8')
Create styles array
The data for the language used.
const H264_AVC_SEQUENCE_HEADER
fseek($bytes, $whence=SEEK_SET)
static BigEndian2Int($byteword, $synchsafe=false, $signed=false)
const GETID3_FLV_VIDEO_H263