⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.audio-video.riff.php

📁 一个用PHP编写的
💻 PHP
📖 第 1 页 / 共 5 页
字号:
<?php//////////////////////////////////////////////////////////////////// getID3() by James Heinrich <info@getid3.org>               ////  available at http://getid3.sourceforge.net                 ////            or http://www.getid3.org                         ///////////////////////////////////////////////////////////////////// See readme.txt for more details                             /////////////////////////////////////////////////////////////////////                                                             //// module.audio-video.riff.php                                 //// module for analyzing RIFF files                             //// multiple formats supported by this module:                  ////    Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX   //// dependencies: module.audio.mp3.php                          ////               module.audio.ac3.php (optional)               ////                                                            ////////////////////////////////////////////////////////////////////getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);class getid3_riff{	function getid3_riff(&$fd, &$ThisFileInfo) {		// initialize these values to an empty array, otherwise they default to NULL		// and you can't append array values to a NULL value		$ThisFileInfo['riff'] = array('raw'=>array());		// Shortcuts		$thisfile_riff             = &$ThisFileInfo['riff'];		$thisfile_riff_raw         = &$thisfile_riff['raw'];		$thisfile_audio            = &$ThisFileInfo['audio'];		$thisfile_video            = &$ThisFileInfo['video'];		$thisfile_avdataoffset     = &$ThisFileInfo['avdataoffset'];		$thisfile_avdataend        = &$ThisFileInfo['avdataend'];		$thisfile_audio_dataformat = &$thisfile_audio['dataformat'];		$thisfile_riff_audio       = &$thisfile_riff['audio'];		$thisfile_riff_video       = &$thisfile_riff['video'];		$Original['avdataoffset'] = $thisfile_avdataoffset;		$Original['avdataend']    = $thisfile_avdataend;		fseek($fd, $thisfile_avdataoffset, SEEK_SET);		$RIFFheader = fread($fd, 12);		$RIFFsubtype = substr($RIFFheader, 8, 4);		switch (substr($RIFFheader, 0, 4)) {			case 'FORM':				$ThisFileInfo['fileformat']   = 'aiff';				$RIFFheaderSize               = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($RIFFheader, 4, 4));				$thisfile_riff[$RIFFsubtype]  = getid3_riff::ParseRIFF($fd, $thisfile_avdataoffset + 12, $thisfile_avdataoffset + $RIFFheaderSize, $ThisFileInfo);				$thisfile_riff['header_size'] = $RIFFheaderSize;				break;			case 'RIFF':			case 'SDSS':  // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com)			case 'RMP3':  // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s				if ($RIFFsubtype == 'RMP3') {					// RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s					$RIFFsubtype = 'WAVE';				}				$ThisFileInfo['fileformat']   = 'riff';				$RIFFheaderSize               = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($RIFFheader, 4, 4));				$thisfile_riff[$RIFFsubtype]  = getid3_riff::ParseRIFF($fd, $thisfile_avdataoffset + 12, $thisfile_avdataoffset + $RIFFheaderSize, $ThisFileInfo);				$thisfile_riff['header_size'] = $RIFFheaderSize;				if ($RIFFsubtype == 'WAVE') {					$thisfile_riff_WAVE = &$thisfile_riff['WAVE'];				}				break;			default:				$ThisFileInfo['error'][] = 'Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead';				unset($ThisFileInfo['fileformat']);				return false;				break;		}		$streamindex = 0;		switch ($RIFFsubtype) {			case 'WAVE':				if (empty($thisfile_audio['bitrate_mode'])) {					$thisfile_audio['bitrate_mode'] = 'cbr';				}				if (empty($thisfile_audio_dataformat)) {					$thisfile_audio_dataformat = 'wav';				}				if (isset($thisfile_riff_WAVE['data'][0]['offset'])) {					$thisfile_avdataoffset = $thisfile_riff_WAVE['data'][0]['offset'] + 8;					$thisfile_avdataend    = $thisfile_avdataoffset + $thisfile_riff_WAVE['data'][0]['size'];				}				if (isset($thisfile_riff_WAVE['fmt '][0]['data'])) {					$thisfile_riff_audio[$streamindex] = getid3_riff::RIFFparseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']);					$thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag'];					if (@$thisfile_riff_audio[$streamindex]['bitrate'] == 0) {						$ThisFileInfo['error'][] = 'Corrupt RIFF file: bitrate_audio == zero';						return false;					}					$thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw'];					unset($thisfile_riff_audio[$streamindex]['raw']);					$thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex];					$thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]);					if (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') {						$ThisFileInfo['warning'][] = 'Audio codec = '.$thisfile_audio['codec'];					}					$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];					$ThisFileInfo['playtime_seconds'] = (float) ((($thisfile_avdataend - $thisfile_avdataoffset) * 8) / $thisfile_audio['bitrate']);					$thisfile_audio['lossless'] = false;					if (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) {						switch ($thisfile_riff_raw['fmt ']['wFormatTag']) {							case 0x0001:  // PCM								$thisfile_audio['lossless'] = true;								break;							case 0x2000:  // AC-3								$thisfile_audio_dataformat = 'ac3';								break;							default:								// do nothing								break;						}					}					$thisfile_audio['streams'][$streamindex]['wformattag']   = $thisfile_audio['wformattag'];					$thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode'];					$thisfile_audio['streams'][$streamindex]['lossless']     = $thisfile_audio['lossless'];					$thisfile_audio['streams'][$streamindex]['dataformat']   = $thisfile_audio_dataformat;				}				if (isset($thisfile_riff_WAVE['rgad'][0]['data'])) {					// shortcuts					$rgadData = &$thisfile_riff_WAVE['rgad'][0]['data'];					$thisfile_riff_raw['rgad']    = array('track'=>array(), 'album'=>array());					$thisfile_riff_raw_rgad       = &$thisfile_riff_raw['rgad'];					$thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track'];					$thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album'];					$thisfile_riff_raw_rgad['fPeakAmplitude']      =               getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4));					$thisfile_riff_raw_rgad['nRadioRgAdjust']      = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($rgadData, 4, 2));					$thisfile_riff_raw_rgad['nAudiophileRgAdjust'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($rgadData, 6, 2));					$nRadioRgAdjustBitstring      = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT);					$nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT);					$thisfile_riff_raw_rgad_track['name']       = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3));					$thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3));					$thisfile_riff_raw_rgad_track['signbit']    = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1));					$thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9));					$thisfile_riff_raw_rgad_album['name']       = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3));					$thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3));					$thisfile_riff_raw_rgad_album['signbit']    = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1));					$thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9));					$thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude'];					if (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) {						$thisfile_riff['rgad']['track']['name']            = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']);						$thisfile_riff['rgad']['track']['originator']      = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']);						$thisfile_riff['rgad']['track']['adjustment']      = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']);					}					if (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) {						$thisfile_riff['rgad']['album']['name']       = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']);						$thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']);						$thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']);					}				}				if (isset($thisfile_riff_WAVE['fact'][0]['data'])) {					$thisfile_riff_raw['fact']['NumberOfSamples'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4));					// This should be a good way of calculating exact playtime,					// but some sample files have had incorrect number of samples,					// so cannot use this method					// if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) {					//     $ThisFileInfo['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec'];					// }				}				if (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) {					$thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8);				}				if (isset($thisfile_riff_WAVE['bext'][0]['data'])) {					// shortcut					$thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0];					$thisfile_riff_WAVE_bext_0['title']          =                         trim(substr($thisfile_riff_WAVE_bext_0['data'],   0, 256));					$thisfile_riff_WAVE_bext_0['author']         =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 256,  32));					$thisfile_riff_WAVE_bext_0['reference']      =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 288,  32));					$thisfile_riff_WAVE_bext_0['origin_date']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 320,  10);					$thisfile_riff_WAVE_bext_0['origin_time']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 330,   8);					$thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338,   8));					$thisfile_riff_WAVE_bext_0['bwf_version']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346,   1));					$thisfile_riff_WAVE_bext_0['reserved']       = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 347, 254));					$thisfile_riff_WAVE_bext_0['coding_history'] =         explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601)));					$thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime(																				substr($thisfile_riff_WAVE_bext_0['origin_time'], 0, 2),																				substr($thisfile_riff_WAVE_bext_0['origin_time'], 3, 2),																				substr($thisfile_riff_WAVE_bext_0['origin_time'], 6, 2),																				substr($thisfile_riff_WAVE_bext_0['origin_date'], 5, 2),																				substr($thisfile_riff_WAVE_bext_0['origin_date'], 8, 2),																				substr($thisfile_riff_WAVE_bext_0['origin_date'], 0, 4));					$thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author'];					$thisfile_riff['comments']['title'][]  = $thisfile_riff_WAVE_bext_0['title'];				}				if (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) {					// shortcut					$thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0];					$thisfile_riff_WAVE_MEXT_0['raw']['sound_information']      = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2));					$thisfile_riff_WAVE_MEXT_0['flags']['homogenous']           = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001);					if ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) {						$thisfile_riff_WAVE_MEXT_0['flags']['padding']          = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true;						$thisfile_riff_WAVE_MEXT_0['flags']['22_or_44']         =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004);						$thisfile_riff_WAVE_MEXT_0['flags']['free_format']      =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008);						$thisfile_riff_WAVE_MEXT_0['nominal_frame_size']        = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2));					}					$thisfile_riff_WAVE_MEXT_0['anciliary_data_length']         = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2));					$thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def']     = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2));					$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001);					$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002);					$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004);				}				if (isset($thisfile_riff_WAVE['cart'][0]['data'])) {					// shortcut					$thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -