WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru
функция не описана

getid3_matroska::Analyze() public WP 1.0

Это метод класса: getid3_matroska{}

Хуков нет.

Возвращает

true/false.

Использование

$getid3_matroska = new getid3_matroska();
$getid3_matroska->Analyze();

Код getid3_matroska::Analyze() WP 5.5.1

wp-includes/ID3/module.audio-video.matroska.php
<?php
public function Analyze()
{
	$info = &$this->getid3->info;

	// parse container
	try {
		$this->parseEBML($info);
	} catch (Exception $e) {
		$this->error('EBML parser: '.$e->getMessage());
	}

	// calculate playtime
	if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
		foreach ($info['matroska']['info'] as $key => $infoarray) {
			if (isset($infoarray['Duration'])) {
				// TimecodeScale is how many nanoseconds each Duration unit is
				$info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000);
				break;
			}
		}
	}

	// extract tags
	if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) {
		foreach ($info['matroska']['tags'] as $key => $infoarray) {
			$this->ExtractCommentsSimpleTag($infoarray);
		}
	}

	// process tracks
	if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
		foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) {

			$track_info = array();
			$track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']);
			$track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true);
			if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; }

			switch ($trackarray['TrackType']) {

				case 1: // Video
					$track_info['resolution_x'] = $trackarray['PixelWidth'];
					$track_info['resolution_y'] = $trackarray['PixelHeight'];
					$track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0);
					$track_info['display_x']    = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']);
					$track_info['display_y']    = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']);

					if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; }
					if (isset($trackarray['PixelCropTop']))    { $track_info['crop_top']    = $trackarray['PixelCropTop']; }
					if (isset($trackarray['PixelCropLeft']))   { $track_info['crop_left']   = $trackarray['PixelCropLeft']; }
					if (isset($trackarray['PixelCropRight']))  { $track_info['crop_right']  = $trackarray['PixelCropRight']; }
					if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate']  = round(1000000000 / $trackarray['DefaultDuration'], 3); }
					if (isset($trackarray['CodecName']))       { $track_info['codec']       = $trackarray['CodecName']; }

					switch ($trackarray['CodecID']) {
						case 'V_MS/VFW/FOURCC':
							getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);

							$parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']);
							$track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']);
							$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
							break;

						/*case 'V_MPEG4/ISO/AVC':
							$h264['profile']    = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1));
							$h264['level']      = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1));
							$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1));
							$h264['NALUlength'] = ($rn & 3) + 1;
							$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1));
							$nsps               = ($rn & 31);
							$offset             = 6;
							for ($i = 0; $i < $nsps; $i ++) {
								$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
								$h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
								$offset       += 2 + $length;
							}
							$npps               = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1));
							$offset            += 1;
							for ($i = 0; $i < $npps; $i ++) {
								$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));
								$h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);
								$offset       += 2 + $length;
							}
							$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264;
							break;*/
					}

					$info['video']['streams'][$trackarray['TrackUID']] = $track_info;
					break;

				case 2: // Audio
					$track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0);
					$track_info['channels']    = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1);
					$track_info['language']    = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng');
					if (isset($trackarray['BitDepth']))  { $track_info['bits_per_sample'] = $trackarray['BitDepth']; }
					if (isset($trackarray['CodecName'])) { $track_info['codec']           = $trackarray['CodecName']; }

					switch ($trackarray['CodecID']) {
						case 'A_PCM/INT/LIT':
						case 'A_PCM/INT/BIG':
							$track_info['bitrate'] = $track_info['sample_rate'] * $track_info['channels'] * $trackarray['BitDepth'];
							break;

						case 'A_AC3':
						case 'A_EAC3':
						case 'A_DTS':
						case 'A_MPEG/L3':
						case 'A_MPEG/L2':
						case 'A_FLAC':
							$module_dataformat = ($track_info['dataformat'] == 'mp2' ? 'mp3' : ($track_info['dataformat'] == 'eac3' ? 'ac3' : $track_info['dataformat']));
							getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.$module_dataformat.'.php', __FILE__, true);

							if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) {
								$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set');
								break;
							}

							// create temp instance
							$getid3_temp = new getID3();
							if ($track_info['dataformat'] != 'flac') {
								$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
							}
							$getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'];
							if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') {
								$getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length'];
							}

							// analyze
							$class = 'getid3_'.$module_dataformat;
							$header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat'];
							$getid3_audio = new $class($getid3_temp, __CLASS__);
							if ($track_info['dataformat'] == 'flac') {
								$getid3_audio->AnalyzeString($trackarray['CodecPrivate']);
							}
							else {
								$getid3_audio->Analyze();
							}
							if (!empty($getid3_temp->info[$header_data_key])) {
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key];
								if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
									foreach ($getid3_temp->info['audio'] as $sub_key => $value) {
										$track_info[$sub_key] = $value;
									}
								}
							}
							else {
								$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']);
							}

							// copy errors and warnings
							if (!empty($getid3_temp->info['error'])) {
								foreach ($getid3_temp->info['error'] as $newerror) {
									$this->warning($class.'() says: ['.$newerror.']');
								}
							}
							if (!empty($getid3_temp->info['warning'])) {
								foreach ($getid3_temp->info['warning'] as $newerror) {
									$this->warning($class.'() says: ['.$newerror.']');
								}
							}
							unset($getid3_temp, $getid3_audio);
							break;

						case 'A_AAC':
						case 'A_AAC/MPEG2/LC':
						case 'A_AAC/MPEG2/LC/SBR':
						case 'A_AAC/MPEG4/LC':
						case 'A_AAC/MPEG4/LC/SBR':
							$this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated');
							break;

						case 'A_VORBIS':
							if (!isset($trackarray['CodecPrivate'])) {
								$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set');
								break;
							}
							$vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1);
							if ($vorbis_offset === false) {
								$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword');
								break;
							}
							$vorbis_offset -= 1;

							getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);

							// create temp instance
							$getid3_temp = new getID3();

							// analyze
							$getid3_ogg = new getid3_ogg($getid3_temp);
							$oggpageinfo['page_seqno'] = 0;
							$getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo);
							if (!empty($getid3_temp->info['ogg'])) {
								$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg'];
								if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {
									foreach ($getid3_temp->info['audio'] as $sub_key => $value) {
										$track_info[$sub_key] = $value;
									}
								}
							}

							// copy errors and warnings
							if (!empty($getid3_temp->info['error'])) {
								foreach ($getid3_temp->info['error'] as $newerror) {
									$this->warning('getid3_ogg() says: ['.$newerror.']');
								}
							}
							if (!empty($getid3_temp->info['warning'])) {
								foreach ($getid3_temp->info['warning'] as $newerror) {
									$this->warning('getid3_ogg() says: ['.$newerror.']');
								}
							}

							if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) {
								$track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal'];
							}
							unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset);
							break;

						case 'A_MS/ACM':
							getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);

							$parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']);
							foreach ($parsed as $sub_key => $value) {
								if ($sub_key != 'raw') {
									$track_info[$sub_key] = $value;
								}
							}
							$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;
							break;

						default:
							$this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"');
							break;
					}

					$info['audio']['streams'][$trackarray['TrackUID']] = $track_info;
					break;
			}
		}

		if (!empty($info['video']['streams'])) {
			$info['video'] = self::getDefaultStreamInfo($info['video']['streams']);
		}
		if (!empty($info['audio']['streams'])) {
			$info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']);
		}
	}

	// process attachments
	if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) {
		foreach ($info['matroska']['attachments'] as $i => $entry) {
			if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) {
				$info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']);
			}
		}
	}

	// determine mime type
	if (!empty($info['video']['streams'])) {
		$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska');
	} elseif (!empty($info['audio']['streams'])) {
		$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska');
	} elseif (isset($info['mime_type'])) {
		unset($info['mime_type']);
	}

	// use _STATISTICS_TAGS if available to set audio/video bitrates
	if (!empty($info['matroska']['tags'])) {
		$_STATISTICS_byTrackUID = array();
		foreach ($info['matroska']['tags'] as $key1 => $value1) {
			if (!empty($value1['Targets']['TagTrackUID'][0]) && !empty($value1['SimpleTag'])) {
				foreach ($value1['SimpleTag'] as $key2 => $value2) {
					if (!empty($value2['TagName']) && isset($value2['TagString'])) {
						$_STATISTICS_byTrackUID[$value1['Targets']['TagTrackUID'][0]][$value2['TagName']] = $value2['TagString'];
					}
				}
			}
		}
		foreach (array('audio','video') as $avtype) {
			if (!empty($info[$avtype]['streams'])) {
				foreach ($info[$avtype]['streams'] as $trackUID => $trackdata) {
					if (!isset($trackdata['bitrate']) && !empty($_STATISTICS_byTrackUID[$trackUID]['BPS'])) {
						$info[$avtype]['streams'][$trackUID]['bitrate'] = (int) $_STATISTICS_byTrackUID[$trackUID]['BPS'];
						@$info[$avtype]['bitrate'] += $info[$avtype]['streams'][$trackUID]['bitrate'];
					}
				}
			}
		}
	}

	return true;
}