📄 module.audio.aac.php
字号:
<?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.aac.php //// module for analyzing AAC Audio files //// dependencies: NONE //// ////////////////////////////////////////////////////////////////////class getid3_aac{ // new combined constructor function getid3_aac(&$fd, &$ThisFileInfo, $option) { if ($option === 'adif') { $this->getAACADIFheaderFilepointer($fd, $ThisFileInfo); } elseif ($option === 'adts') { $this->getAACADTSheaderFilepointer($fd, $ThisFileInfo); } } function getAACADIFheaderFilepointer(&$fd, &$ThisFileInfo) { $ThisFileInfo['fileformat'] = 'aac'; $ThisFileInfo['audio']['dataformat'] = 'aac'; $ThisFileInfo['audio']['lossless'] = false; fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET); $AACheader = fread($fd, 1024); $offset = 0; if (substr($AACheader, 0, 4) == 'ADIF') { // http://faac.sourceforge.net/wiki/index.php?page=ADIF // http://libmpeg.org/mpeg4/doc/w2203tfs.pdf // adif_header() { // adif_id 32 // copyright_id_present 1 // if( copyright_id_present ) // copyright_id 72 // original_copy 1 // home 1 // bitstream_type 1 // bitrate 23 // num_program_config_elements 4 // for (i = 0; i < num_program_config_elements + 1; i++ ) { // if( bitstream_type == '0' ) // adif_buffer_fullness 20 // program_config_element() // } // } $AACheaderBitstream = getid3_lib::BigEndian2Bin($AACheader); $bitoffset = 0; $ThisFileInfo['aac']['header_type'] = 'ADIF'; $bitoffset += 32; $ThisFileInfo['aac']['header']['mpeg_version'] = 4; $ThisFileInfo['aac']['header']['copyright'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); $bitoffset += 1; if ($ThisFileInfo['aac']['header']['copyright']) { $ThisFileInfo['aac']['header']['copyright_id'] = getid3_lib::Bin2String(substr($AACheaderBitstream, $bitoffset, 72)); $bitoffset += 72; } $ThisFileInfo['aac']['header']['original_copy'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); $bitoffset += 1; $ThisFileInfo['aac']['header']['home'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); $bitoffset += 1; $ThisFileInfo['aac']['header']['is_vbr'] = (bool) (substr($AACheaderBitstream, $bitoffset, 1) == '1'); $bitoffset += 1; if ($ThisFileInfo['aac']['header']['is_vbr']) { $ThisFileInfo['audio']['bitrate_mode'] = 'vbr'; $ThisFileInfo['aac']['header']['bitrate_max'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 23)); $bitoffset += 23; } else { $ThisFileInfo['audio']['bitrate_mode'] = 'cbr'; $ThisFileInfo['aac']['header']['bitrate'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 23)); $bitoffset += 23; $ThisFileInfo['audio']['bitrate'] = $ThisFileInfo['aac']['header']['bitrate']; } if ($ThisFileInfo['audio']['bitrate'] == 0) { $ThisFileInfo['error'][] = 'Corrupt AAC file: bitrate_audio == zero'; return false; } $ThisFileInfo['aac']['header']['num_program_configs'] = 1 + getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; for ($i = 0; $i < $ThisFileInfo['aac']['header']['num_program_configs']; $i++) { // http://www.audiocoding.com/wiki/index.php?page=program_config_element // buffer_fullness 20 // element_instance_tag 4 // object_type 2 // sampling_frequency_index 4 // num_front_channel_elements 4 // num_side_channel_elements 4 // num_back_channel_elements 4 // num_lfe_channel_elements 2 // num_assoc_data_elements 3 // num_valid_cc_elements 4 // mono_mixdown_present 1 // mono_mixdown_element_number 4 if mono_mixdown_present == 1 // stereo_mixdown_present 1 // stereo_mixdown_element_number 4 if stereo_mixdown_present == 1 // matrix_mixdown_idx_present 1 // matrix_mixdown_idx 2 if matrix_mixdown_idx_present == 1 // pseudo_surround_enable 1 if matrix_mixdown_idx_present == 1 // for (i = 0; i < num_front_channel_elements; i++) { // front_element_is_cpe[i] 1 // front_element_tag_select[i] 4 // } // for (i = 0; i < num_side_channel_elements; i++) { // side_element_is_cpe[i] 1 // side_element_tag_select[i] 4 // } // for (i = 0; i < num_back_channel_elements; i++) { // back_element_is_cpe[i] 1 // back_element_tag_select[i] 4 // } // for (i = 0; i < num_lfe_channel_elements; i++) { // lfe_element_tag_select[i] 4 // } // for (i = 0; i < num_assoc_data_elements; i++) { // assoc_data_element_tag_select[i] 4 // } // for (i = 0; i < num_valid_cc_elements; i++) { // cc_element_is_ind_sw[i] 1 // valid_cc_element_tag_select[i] 4 // } // byte_alignment() VAR // comment_field_bytes 8 // for (i = 0; i < comment_field_bytes; i++) { // comment_field_data[i] 8 // } if (!$ThisFileInfo['aac']['header']['is_vbr']) { $ThisFileInfo['aac']['program_configs'][$i]['buffer_fullness'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 20)); $bitoffset += 20; } $ThisFileInfo['aac']['program_configs'][$i]['element_instance_tag'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; $ThisFileInfo['aac']['program_configs'][$i]['object_type'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); $bitoffset += 2; $ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency_index'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; $ThisFileInfo['aac']['program_configs'][$i]['num_front_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; $ThisFileInfo['aac']['program_configs'][$i]['num_side_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; $ThisFileInfo['aac']['program_configs'][$i]['num_back_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; $ThisFileInfo['aac']['program_configs'][$i]['num_lfe_channel_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); $bitoffset += 2; $ThisFileInfo['aac']['program_configs'][$i]['num_assoc_data_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 3)); $bitoffset += 3; $ThisFileInfo['aac']['program_configs'][$i]['num_valid_cc_elements'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; $ThisFileInfo['aac']['program_configs'][$i]['mono_mixdown_present'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; if ($ThisFileInfo['aac']['program_configs'][$i]['mono_mixdown_present']) { $ThisFileInfo['aac']['program_configs'][$i]['mono_mixdown_element_number'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } $ThisFileInfo['aac']['program_configs'][$i]['stereo_mixdown_present'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; if ($ThisFileInfo['aac']['program_configs'][$i]['stereo_mixdown_present']) { $ThisFileInfo['aac']['program_configs'][$i]['stereo_mixdown_element_number'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } $ThisFileInfo['aac']['program_configs'][$i]['matrix_mixdown_idx_present'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; if ($ThisFileInfo['aac']['program_configs'][$i]['matrix_mixdown_idx_present']) { $ThisFileInfo['aac']['program_configs'][$i]['matrix_mixdown_idx'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 2)); $bitoffset += 2; $ThisFileInfo['aac']['program_configs'][$i]['pseudo_surround_enable'] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; } for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_front_channel_elements']; $j++) { $ThisFileInfo['aac']['program_configs'][$i]['front_element_is_cpe'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; $ThisFileInfo['aac']['program_configs'][$i]['front_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_side_channel_elements']; $j++) { $ThisFileInfo['aac']['program_configs'][$i]['side_element_is_cpe'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; $ThisFileInfo['aac']['program_configs'][$i]['side_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_back_channel_elements']; $j++) { $ThisFileInfo['aac']['program_configs'][$i]['back_element_is_cpe'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; $ThisFileInfo['aac']['program_configs'][$i]['back_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_lfe_channel_elements']; $j++) { $ThisFileInfo['aac']['program_configs'][$i]['lfe_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_assoc_data_elements']; $j++) { $ThisFileInfo['aac']['program_configs'][$i]['assoc_data_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } for ($j = 0; $j < $ThisFileInfo['aac']['program_configs'][$i]['num_valid_cc_elements']; $j++) { $ThisFileInfo['aac']['program_configs'][$i]['cc_element_is_ind_sw'][$j] = (bool) getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 1)); $bitoffset += 1; $ThisFileInfo['aac']['program_configs'][$i]['valid_cc_element_tag_select'][$j] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 4)); $bitoffset += 4; } $bitoffset = ceil($bitoffset / 8) * 8; $ThisFileInfo['aac']['program_configs'][$i]['comment_field_bytes'] = getid3_lib::Bin2Dec(substr($AACheaderBitstream, $bitoffset, 8)); $bitoffset += 8; $ThisFileInfo['aac']['program_configs'][$i]['comment_field'] = getid3_lib::Bin2String(substr($AACheaderBitstream, $bitoffset, 8 * $ThisFileInfo['aac']['program_configs'][$i]['comment_field_bytes'])); $bitoffset += 8 * $ThisFileInfo['aac']['program_configs'][$i]['comment_field_bytes']; $ThisFileInfo['aac']['header']['profile_text'] = $this->AACprofileLookup($ThisFileInfo['aac']['program_configs'][$i]['object_type'], $ThisFileInfo['aac']['header']['mpeg_version']); $ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency'] = $this->AACsampleRateLookup($ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency_index']); $ThisFileInfo['audio']['sample_rate'] = $ThisFileInfo['aac']['program_configs'][$i]['sampling_frequency']; $ThisFileInfo['audio']['channels'] = $this->AACchannelCountCalculate($ThisFileInfo['aac']['program_configs'][$i]); if ($ThisFileInfo['aac']['program_configs'][$i]['comment_field']) { $ThisFileInfo['aac']['comments'][] = $ThisFileInfo['aac']['program_configs'][$i]['comment_field']; } } $ThisFileInfo['playtime_seconds'] = (($ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']) * 8) / $ThisFileInfo['audio']['bitrate']; $ThisFileInfo['audio']['encoder_options'] = $ThisFileInfo['aac']['header_type'].' '.$ThisFileInfo['aac']['header']['profile_text']; return true; } else { unset($ThisFileInfo['fileformat']); unset($ThisFileInfo['aac']); $ThisFileInfo['error'][] = 'AAC-ADIF synch not found at offset '.$ThisFileInfo['avdataoffset'].' (expected "ADIF", found "'.substr($AACheader, 0, 4).'" instead)'; return false; } } function getAACADTSheaderFilepointer(&$fd, &$ThisFileInfo, $MaxFramesToScan=1000000, $ReturnExtendedInfo=false) { // based loosely on code from AACfile by Jurgen Faul <jfaul豨mx.de> // http://jfaul.de/atl or http://j-faul.virtualave.net/atl/atl.html // http://faac.sourceforge.net/wiki/index.php?page=ADTS // * ADTS Fixed Header: these don't change from frame to frame // syncword 12 always: '111111111111' // ID 1 0: MPEG-4, 1: MPEG-2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -