帝王谷资源网 Design By www.wdxyy.com
项目需求:现在有一个音频文件上传的功能,在上传后PHP需要获取这个音频文件的相关信息,例如:时长等,由于这个文件是放在买的空间上的,没有像ffmpeg这样的扩展来处理,那么PHP能不能获取到这些信息?
下面是之前在项目中用到的一个用PHP进行音频文件头部信息的读取与写入操作的实现,主要针对 WMA 和 MP3 两种格式,供参考。
<"\0\0" $str = substr($str, 0, -2); return mb_convert_encoding($str, 'GBK', 'UCS-2LE'); } // gb2312 => DBCS function gbk_dbcs($str) { $str = mb_convert_encoding($str, 'UCS-2LE', 'GBK'); $str .= "\0\0"; return $str; } // file exif class _AudioExif { var $fd; var $head; var $head_off; var $head_buf; // init the file handler function _file_init($fpath, $write = false) { $mode = ($write ""); $et_body .= pack('v', strlen($nbuf)) . $nbuf . pack('vv', 0, strlen($vbuf)) . $vbuf; $inum++; } $head_body .= pack('H32Va4v', '40a4d0d207e3d21197f000a0c95ea850', strlen($et_body)+26, '', $inum); $head_body .= $et_body; $this->head['num']++; } // after save $new_len = strlen($head_body) + 30; $old_len = $this->head['len']; if ($new_len < $old_len) { $head_body .= str_repeat("\0", $old_len - $new_len); $new_len = $old_len; } $tmp = $this->head; $head_buf = pack('H32VVVH4', $tmp['id'], $new_len, $tmp['len2'], $tmp['num'], $tmp['unused']); $head_buf .= $head_body; $this->_file_save($head_buf, $old_len, $new_len); // close the file & return $this->_file_deinit(); return true; } // get info function get_info($file) { $ret = array(); if (!$this->_file_init($file)) return false; if (!$this->_init_header()) { $this->_file_deinit(); return false; } // get the data from head_buf $head_num = $this->head['num']; // num of head_frame while (($tmp = $this->_get_head_frame()) && $head_num > 0) { $head_num--; if ($tmp['id'] == '3326b2758e66cf11a6d900aa0062ce6c') { // Standard Info $lenx = unpack('v*', $this->_read_head_buf(10)); for ($i = 1; $i <= count($this->items1); $i++) { $k = $this->items1[$i-1]; $ret[$k] = dbcs_gbk($this->_read_head_buf($lenx[$i])); } } else if ($tmp['id'] == '40a4d0d207e3d21197f000a0c95ea850') { // Extended Info $inum = $this->_read_head_short(); $tmp['len'] -= 26; while ($inum > 0 && $tmp['len'] > 0) { // attribute name $nlen = $this->_read_head_short(); $nbuf = $this->_read_head_buf($nlen); // the flag & value length $flag = $this->_read_head_short(); $vlen = $this->_read_head_short(); $vbuf = $this->_read_head_buf($vlen); // update the XX $tmp['len'] -= (6 + $nlen + $vlen); $inum--; $name = dbcs_gbk($nbuf); $k = substr($name, 3); if (in_array($k, $this->items2)) { // all is string value (refer to falg for other tags) $ret[$k] = dbcs_gbk($vbuf); } } } else { // skip only if ($tmp['len'] > 24) $this->head_off += ($tmp['len'] - 24); } } $this->_file_deinit(); return $ret; } // get the header"\0")) $ret[$tmp] = substr($ret[$tmp], 0, $pos); } // count the Genre, [Track] if ($this->head1['Reserved'] == 0) $ret['Track'] = $this->head1['Track']; else $ret['Description'] .= chr($ret['Reserved']) . chr($ret['Track']); // Genre_idx $g = $this->head1['Genre']; if (!isset($this->genres[$g])) $ret['Genre'] = 'Unknown'; else $ret['Genre'] = $this->genres[$g]; // return the value $ret['ID3v1'] = 'yes'; return $ret; } // get v2 info function _get_v2_info() { $ret = array(); $items = array( 'TCOP'=>'Copyright', 'TPE1'=>'Artist', 'TIT2'=>'Title', 'TRCK'=> 'Track', 'TCON'=>'Genre', 'COMM'=>'Description', 'TYER'=>'Year', 'TALB'=>'AlbumTitle'); while (true) { $buf = $this->_read_head_buf(10); if (strlen($buf) != 10) break; $tmp = unpack('a4fid/Nsize/nflag', $buf); if ($tmp['size'] == 0) break; $tmp['dat'] = $this->_read_head_buf($tmp['size']); // 0x6000 (11000000 00000000) if ($tmp['flag'] & 0x6000) continue; // mapping the data if ($k = $items[$tmp['fid']]) { // If first char is "\0", just skip if (substr($tmp['dat'], 0, 1) == "\0") $tmp['dat'] = substr($tmp['dat'], 1); $ret[$k] = $tmp['dat']; } } // reset the genre if ($g = $ret['Genre']) { if (substr($g,0,1) == '(' && substr($g,-1,1) == ')') $g = substr($g, 1, -1); if (is_numeric($g)) { $g = intval($g); $ret['Genre'] = (isset($this->genres[$g]) "padding"] = ($tmp[2] & 0x02) "private"] = ($tmp[2] & 0x01) "\0" [replace] $data = "\0" . $pa[$k]; unset($pa[$k]); } $head_body .= pack('a4Nn', $tmp['fid'], strlen($data), $tmp['flag']) . $data; } // reverse the items & set the new tags $items = array_flip($items); foreach ($pa as $k => $v) { if ($fid = $items[$k]) { $head_body .= pack('a4Nn', $fid, strlen($v) + 1, 0) . "\0" . $v; } } // new length $new_len = strlen($head_body) + 10; $old_len = $this->head['size'] + 10; if ($new_len < $old_len) { $head_body .= str_repeat("\0", $old_len - $new_len); $new_len = $old_len; } // count the size1,2,3,4, no include the header // 较为变态的算法... :p (28bytes integer) $size = array(); $nlen = $new_len - 10; for ($i = 4; $i > 0; $i--) { $size[$i] = ($nlen & 0x7f); $nlen = 7; } $tmp = $this->head; //echo "old_len : $old_len new_len: $new_len\n"; $head_buf = pack('a3CCCCCCC', $tmp['id'], $tmp['ver'], $tmp['rev'], $tmp['flag'], $size[1], $size[2], $size[3], $size[4]); $head_buf .= $head_body; $this->_file_save($head_buf, $old_len, $new_len); }
以上所述就是本文的全部内容了,希望大家能够喜欢。
标签:
PHP,获取音频信息
帝王谷资源网 Design By www.wdxyy.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
帝王谷资源网 Design By www.wdxyy.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月03日
2024年11月03日
- 明达年度发烧碟MasterSuperiorAudiophile2021[DSF]
- 英文DJ 《致命的温柔》24K德国HD金碟DTS 2CD[WAV+分轨][1.7G]
- 张学友1997《不老的传说》宝丽金首版 [WAV+CUE][971M]
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]