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

📄 module.tag.id3v2.php

📁 一个用PHP编写的
💻 PHP
📖 第 1 页 / 共 5 页
字号:
			}			$reference_counter = 0;			while (strlen($deviationbitstream) > 0) {				$parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation']));				$parsedFrame[$reference_counter]['msdeviation']   = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation']));				$deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']);				$reference_counter++;			}			unset($parsedFrame['data']);		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7   SYTC Synchronised tempo codes				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) {     // 4.8   STC  Synchronised tempo codes			//   There may only be one 'SYTC' frame in each tag			// <Header for 'Synchronised tempo codes', ID: 'SYTC'>			// Time stamp format   $xx			// Tempo data          <binary data>			//   Where time stamp format is:			// $01  (32-bit value) MPEG frames from beginning of file			// $02  (32-bit value) milliseconds from beginning of file			$frame_offset = 0;			$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));			$timestamp_counter = 0;			while ($frame_offset < strlen($parsedFrame['data'])) {				$parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));				if ($parsedFrame[$timestamp_counter]['tempo'] == 255) {					$parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1));				}				$parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));				$frame_offset += 4;				$timestamp_counter++;			}			unset($parsedFrame['data']);		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8   USLT Unsynchronised lyric/text transcription				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) {     // 4.9   ULT  Unsynchronised lyric/text transcription			//   There may be more than one 'Unsynchronised lyrics/text transcription' frame			//   in each tag, but only one with the same language and content descriptor.			// <Header for 'Unsynchronised lyrics/text transcription', ID: 'USLT'>			// Text encoding        $xx			// Language             $xx xx xx			// Content descriptor   <text string according to encoding> $00 (00)			// Lyrics/text          <full text string according to encoding>			$frame_offset = 0;			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {				$ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';			}			$frame_language = substr($parsedFrame['data'], $frame_offset, 3);			$frame_offset += 3;			$frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00			}			$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);			if (ord($frame_description) === 0) {				$frame_description = '';			}			$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)));			$parsedFrame['encodingid']   = $frame_textencoding;			$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);			$parsedFrame['data']         = $parsedFrame['data'];			$parsedFrame['language']     = $frame_language;			$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);			$parsedFrame['description']  = $frame_description;			if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {				$ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']);			}			unset($parsedFrame['data']);		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9   SYLT Synchronised lyric/text				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) {     // 4.10  SLT  Synchronised lyric/text			//   There may be more than one 'SYLT' frame in each tag,			//   but only one with the same language and content descriptor.			// <Header for 'Synchronised lyrics/text', ID: 'SYLT'>			// Text encoding        $xx			// Language             $xx xx xx			// Time stamp format    $xx			//   $01  (32-bit value) MPEG frames from beginning of file			//   $02  (32-bit value) milliseconds from beginning of file			// Content type         $xx			// Content descriptor   <text string according to encoding> $00 (00)			//   Terminated text to be synced (typically a syllable)			//   Sync identifier (terminator to above string)   $00 (00)			//   Time stamp                                     $xx (xx ...)			$frame_offset = 0;			$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));			if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {				$ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';			}			$frame_language = substr($parsedFrame['data'], $frame_offset, 3);			$frame_offset += 3;			$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));			$parsedFrame['contenttypeid']   = ord(substr($parsedFrame['data'], $frame_offset++, 1));			$parsedFrame['contenttype']     = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']);			$parsedFrame['encodingid']      = $frame_textencoding;			$parsedFrame['encoding']        = $this->TextEncodingNameLookup($frame_textencoding);			$parsedFrame['language']        = $frame_language;			$parsedFrame['languagename']    = $this->LanguageLookup($frame_language, false);			$timestampindex = 0;			$frame_remainingdata = substr($parsedFrame['data'], $frame_offset);			while (strlen($frame_remainingdata)) {				$frame_offset = 0;				$frame_terminatorpos = strpos($frame_remainingdata, $this->TextEncodingTerminatorLookup($frame_textencoding));				if ($frame_terminatorpos === false) {					$frame_remainingdata = '';				} else {					if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {						$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00					}					$parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset);					$frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)));					if (($timestampindex == 0) && (ord($frame_remainingdata{0}) != 0)) {						// timestamp probably omitted for first data item					} else {						$parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4));						$frame_remainingdata = substr($frame_remainingdata, 4);					}					$timestampindex++;				}			}			unset($parsedFrame['data']);		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10  COMM Comments				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) {     // 4.11  COM  Comments			//   There may be more than one comment frame in each tag,			//   but only one with the same language and content descriptor.			// <Header for 'Comment', ID: 'COMM'>			// Text encoding          $xx			// Language               $xx xx xx			// Short content descrip. <text string according to encoding> $00 (00)			// The actual text        <full text string according to encoding>			if (strlen($parsedFrame['data']) < 5) {				$ThisFileInfo['warning'][] = 'Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset'];			} else {				$frame_offset = 0;				$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));				if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {					$ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';				}				$frame_language = substr($parsedFrame['data'], $frame_offset, 3);				$frame_offset += 3;				$frame_terminatorpos = strpos($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding), $frame_offset);				if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {					$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00				}				$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);				if (ord($frame_description) === 0) {					$frame_description = '';				}				$frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($this->TextEncodingTerminatorLookup($frame_textencoding)));				$parsedFrame['encodingid']   = $frame_textencoding;				$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);				$parsedFrame['language']     = $frame_language;				$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);				$parsedFrame['description']  = $frame_description;				$parsedFrame['data']         = $frame_text;				if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {					$ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $ThisFileInfo['id3v2']['encoding'], $parsedFrame['data']);				}			}		} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11  RVA2 Relative volume adjustment (2) (ID3v2.4+ only)			//   There may be more than one 'RVA2' frame in each tag,			//   but only one with the same identification string			// <Header for 'Relative volume adjustment (2)', ID: 'RVA2'>			// Identification          <text string> $00			//   The 'identification' string is used to identify the situation and/or			//   device where this adjustment should apply. The following is then			//   repeated for every channel:			// Type of channel         $xx			// Volume adjustment       $xx xx			// Bits representing peak  $xx			// Peak volume             $xx (xx ...)			$frame_terminatorpos = strpos($parsedFrame['data'], "\x00");			$frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos);			if (ord($frame_idstring) === 0) {				$frame_idstring = '';			}			$frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00"));			$parsedFrame['description'] = $frame_idstring;			while (strlen($frame_remainingdata)) {				$frame_offset = 0;				$frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1));				$parsedFrame[$frame_channeltypeid]['channeltypeid']  = $frame_channeltypeid;				$parsedFrame[$frame_channeltypeid]['channeltype']    = $this->RVA2ChannelTypeLookup($frame_channeltypeid);				$parsedFrame[$frame_channeltypeid]['volumeadjust']   = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed				$frame_offset += 2;				$parsedFrame[$frame_channeltypeid]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1));				$frame_bytespeakvolume = ceil($parsedFrame[$frame_channeltypeid]['bitspeakvolume'] / 8);				$parsedFrame[$frame_channeltypeid]['peakvolume']     = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume));				$frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume);			}			unset($parsedFrame['data']);		} elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12  RVAD Relative volume adjustment (ID3v2.3 only)				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) {     // 4.12  RVA  Relative volume adjustment (ID3v2.2 only)			//   There may only be one 'RVA' frame in each tag			// <Header for 'Relative volume adjustment', ID: 'RVA'>			// ID3v2.2 => Increment/decrement     %000000ba			// ID3v2.3 => Increment/decrement     %00fedcba			// Bits used for volume descr.        $xx			// Relative volume change, right      $xx xx (xx ...) // a			// Relative volume change, left       $xx xx (xx ...) // b			// Peak volume right                  $xx xx (xx ...)			// Peak volume left                   $xx xx (xx ...)			//   ID3v2.3 only, optional (not present in ID3v2.2):			// Relative volume change, right back $xx xx (xx ...) // c			// Relative volume change, left back  $xx xx (xx ...) // d			// Peak volume right back             $xx xx (xx ...)			// Peak volume left back              $xx xx (xx ...)			//   ID3v2.3 only, optional (not present in ID3v2.2):			// Relative volume change, center     $xx xx (xx ...) // e			// Peak volume center                 $xx xx (xx ...)			//   ID3v2.3 only, optional (not present in ID3v2.2):			// Relative volume change, bass       $xx xx (xx ...) // f			// Peak volume bass                   $xx xx (xx ...)			$frame_offset = 0;			$frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1));			$parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1);			$parsedFrame['incdec']['left']  = (bool) substr($frame_incrdecrflags, 7, 1);			$parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));			$frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8);			$parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));			if ($parsedFrame['incdec']['right'] === false) {				$parsedFrame['volumechange']['right'] *= -1;			}			$frame_offset += $frame_bytesvolume;

⌨️ 快捷键说明

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