一、你需要在核心之外扩展和使用第三方类库,并且该类库不是通过Composer安装使用,那么可以直接放入应用根目录下面的extend目录下面,该目录是官方建议的第三方扩展类库目录。

二、类的命名规范遵循PSR-2及PSR-4规范,注意不要和系统的命名空间产生冲突,例如核心的think、app以及Composer类库自身定义的命名空间。

引入类文件

实例化类文件

调用方法

$mp3 = new \lib\MP3File($position);     //实例化类,传入文件名
$a = $mp3->getDurationEstimate();
$b = $mp3->getDuration();
$duration = $mp3::formatTime($b);    //获取到的时长
<?php
namespace lib;
class MP3File
{protected $filename;public function __construct($filename){$this->filename = $filename;}public static function formatTime($duration) //as hh:mm:ss{//return sprintf("%d:%02d", $duration/60, $duration%60);$hours = floor($duration / 3600);$minutes = floor( ($duration - ($hours * 3600)) / 60);$seconds = $duration - ($hours * 3600) - ($minutes * 60);// return sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds);return array('hours'=>$hours, 'minutes'=>$minutes, 'seconds'=>$seconds);}//Read first mp3 frame only...  use for CBR constant bit rate MP3spublic function getDurationEstimate(){return $this->getDuration($use_cbr_estimate=true);}//Read entire file, frame by frame... ie: Variable Bit Rate (VBR)public function getDuration($use_cbr_estimate=false){$fd = fopen($this->filename, "rb");$duration=0;$block = fread($fd, 100);$offset = $this->skipID3v2Tag($block);fseek($fd, $offset, SEEK_SET);while (!feof($fd)){$block = fread($fd, 10);if (strlen($block)<10) { break; }//looking for 1111 1111 111 (frame synchronization bits)else if ($block[0]=="\xff" && (ord($block[1])&0xe0) ){$info = self::parseFrameHeader(substr($block, 0, 4));if (empty($info['Framesize'])) { return $duration; } //some corrupt mp3 filesfseek($fd, $info['Framesize']-10, SEEK_CUR);$duration += ( $info['Samples'] / $info['Sampling Rate'] );}else if (substr($block, 0, 3)=='TAG'){fseek($fd, 128-10, SEEK_CUR);//skip over id3v1 tag size}else{fseek($fd, -9, SEEK_CUR);}if ($use_cbr_estimate && !empty($info)){ return $this->estimateDuration($info['Bitrate'],$offset); }}return round($duration);}private function estimateDuration($bitrate,$offset){$kbps = ($bitrate*1000)/8;$datasize = filesize($this->filename) - $offset;return round($datasize / $kbps);}private function skipID3v2Tag(&$block){if (substr($block, 0,3)=="ID3"){$id3v2_major_version = ord($block[3]);$id3v2_minor_version = ord($block[4]);$id3v2_flags = ord($block[5]);$flag_unsynchronisation  = $id3v2_flags & 0x80 ? 1 : 0;$flag_extended_header    = $id3v2_flags & 0x40 ? 1 : 0;$flag_experimental_ind   = $id3v2_flags & 0x20 ? 1 : 0;$flag_footer_present     = $id3v2_flags & 0x10 ? 1 : 0;$z0 = ord($block[6]);$z1 = ord($block[7]);$z2 = ord($block[8]);$z3 = ord($block[9]);if ( (($z0&0x80)==0) && (($z1&0x80)==0) && (($z2&0x80)==0) && (($z3&0x80)==0) ){$header_size = 10;$tag_size = (($z0&0x7f) * 2097152) + (($z1&0x7f) * 16384) + (($z2&0x7f) * 128) + ($z3&0x7f);$footer_size = $flag_footer_present ? 10 : 0;return $header_size + $tag_size + $footer_size;//bytes to skip}}return 0;}public static function parseFrameHeader($fourbytes){static $versions = array(0x0=>'2.5',0x1=>'x',0x2=>'2',0x3=>'1', // x=>'reserved');static $layers = array(0x0=>'x',0x1=>'3',0x2=>'2',0x3=>'1', // x=>'reserved');static $bitrates = array('V1L1'=>array(0,32,64,96,128,160,192,224,256,288,320,352,384,416,448),'V1L2'=>array(0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384),'V1L3'=>array(0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320),'V2L1'=>array(0,32,48,56, 64, 80, 96,112,128,144,160,176,192,224,256),'V2L2'=>array(0, 8,16,24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160),'V2L3'=>array(0, 8,16,24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160),);static $sample_rates = array('1'   => array(44100,48000,32000),'2'   => array(22050,24000,16000),'2.5' => array(11025,12000, 8000),);static $samples = array(1 => array( 1 => 384, 2 =>1152, 3 =>1152, ), //MPEGv1,     Layers 1,2,32 => array( 1 => 384, 2 =>1152, 3 => 576, ), //MPEGv2/2.5, Layers 1,2,3);//$b0=ord($fourbytes[0]);//will always be 0xff$b1=ord($fourbytes[1]);$b2=ord($fourbytes[2]);$b3=ord($fourbytes[3]);$version_bits = ($b1 & 0x18) >> 3;$version = $versions[$version_bits];$simple_version =  ($version=='2.5' ? 2 : $version);$layer_bits = ($b1 & 0x06) >> 1;$layer = $layers[$layer_bits];$protection_bit = ($b1 & 0x01);$bitrate_key = sprintf('V%dL%d', $simple_version , $layer);$bitrate_idx = ($b2 & 0xf0) >> 4;$bitrate = isset($bitrates[$bitrate_key][$bitrate_idx]) ? $bitrates[$bitrate_key][$bitrate_idx] : 0;$sample_rate_idx = ($b2 & 0x0c) >> 2;//0xc => b1100$sample_rate = isset($sample_rates[$version][$sample_rate_idx]) ? $sample_rates[$version][$sample_rate_idx] : 0;$padding_bit = ($b2 & 0x02) >> 1;$private_bit = ($b2 & 0x01);$channel_mode_bits = ($b3 & 0xc0) >> 6;$mode_extension_bits = ($b3 & 0x30) >> 4;$copyright_bit = ($b3 & 0x08) >> 3;$original_bit = ($b3 & 0x04) >> 2;$emphasis = ($b3 & 0x03);$info = array();$info['Version'] = $version;//MPEGVersion$info['Layer'] = $layer;//$info['Protection Bit'] = $protection_bit; //0=> protected by 2 byte CRC, 1=>not protected$info['Bitrate'] = $bitrate;$info['Sampling Rate'] = $sample_rate;//$info['Padding Bit'] = $padding_bit;//$info['Private Bit'] = $private_bit;//$info['Channel Mode'] = $channel_mode_bits;//$info['Mode Extension'] = $mode_extension_bits;//$info['Copyright'] = $copyright_bit;//$info['Original'] = $original_bit;//$info['Emphasis'] = $emphasis;$info['Framesize'] = self::framesize($layer, $bitrate, $sample_rate, $padding_bit);$info['Samples'] = $samples[$simple_version][$layer];return $info;}private static function framesize($layer, $bitrate,$sample_rate,$padding_bit){if ($layer==1)return intval(((12 * $bitrate*1000 /$sample_rate) + $padding_bit) * 4);else //layer 2, 3return intval(((144 * $bitrate*1000)/$sample_rate) + $padding_bit);}
}

tp5引入第三方类 实现获取音频(.mp3)文件时长。相关推荐

  1. php查看音频属性,PHP获取音频mp3文件时长或音频文件其它参数属性

    标签: 今天在开发项目中遇到一个问题,要获取到上传音频的时长,从而展示在前端页面 最后找到解决方案: 1.首先,我们需要先下载一份PHP类-getid3  https://codeload.githu ...

  2. java 读取音频/视频 文件时长

    java 读取音频/视频 文件时长 支持mp3,mp4,mov,m4a,wav 格式文件 源码 https://github.com/opensourceteams/java-maven-projec ...

  3. 2021-09-10 java 读取音频/视频 文件时长

    java 读取音频/视频 文件时长 pom.xml <dependency><groupId>org</groupId><artifactId>jaud ...

  4. JS获取音频的总时长,解决Audio元素duration为NaN || Infinity 问题

    当我们在加载一个线上mp3地址或者获取audio的duration的时候,会发现有拿到duration是Infinity的情况,这时如果我们动态的展示录音时间时候就会有问题.首先明确一下这是chrom ...

  5. Android 获取音频MP3文件的专辑缩略图

    通用方法大家都会想到使用系统媒体库去获取专辑缩略图. 今天介绍另外一种方法,通过MediaMetadataRetriever对象获取, 获取方法代码如下: /*** 获取音频缩略图Bitmap* @p ...

  6. Java获取MP3文件时长的几种方法

    在网上找了很多方法,其中最匮乏的就是获取网络资源音频的时长,在这里总结一下: 1:获取网络资源音频时长: 这种方法是获取文件字节大小然后在用公式自己算的 BufferedInputStream bis ...

  7. Thinkphp 零散知识点(caa/js路径,引入第三方类,ajax返回,session/cookie)

    一.关于JS和CSS路径问题 1.找路径是从入口文件index.php来找的,而不是从文件本身所在位置来找, 因为我们访问时是访问的入口文件 2.在存放JS和CSS的时候可以放到public文件夹下 ...

  8. php获取音频的时长,PHP编程获取音频文件时长的方法【基于getid3类】

    本文实例讲述了PHP编程获取音频文件时长的方法.分享给大家供大家参考,具体如下: 问题: 昨天在新增论坛功能的时候,移动端显示音频文件需要知道是多长的音频: 具体解决方案如下: 首先就是数据库中增加保 ...

  9. PHP获取音频文件MP3的时长

    最近在开发中有一个需求需要直接获取音频的时长 可以获取MP3的时长 1.此次主要是在thinkphp中搭配适用来获取MP3时长,如下所示: 此处类并非适用composer下载故此在extend中直接建 ...

最新文章

  1. qt设置mysql最大连接数_MySQL服务器最大连接数的合理设置
  2. java date的使用_java:Date类的概述和方法使用
  3. Testng 运行Cannot find class in classpath
  4. [Publish AAR To Maven] 注册 Maven 仓库 sonatype.org 账户
  5. fastadmin上传视频的操作
  6. html显示链接音乐,歌曲链接怎么填_HTML中如何链接本地音乐
  7. 苹果MacBook iMac免光驱安装win7方法
  8. 由于找不到mfc100.dll,无法继续执行代码
  9. PFPLD 人脸关键点检测
  10. oracle定时器,调用存储过程,定时从n张表中取值新增到本地一张表中
  11. 化学反应的常微分方程求解(Python)
  12. 上海黄金交易所交易操作基本知识
  13. ros学习记录1 Hello World 使用c++
  14. Tapestry(二):Tapestry基本知识
  15. iterator的用法 | reverse_iterator的封装实现
  16. diskgenius linux 分区,DiskGenius怎么分区,DiskGenius分区教程
  17. Matrix Admin html5网站管理后台源码 Bootstrap响应式模板主题
  18. labelme标签批量转换,labelme_json_to_dataset
  19. Rockchip开发系列 - 9.watchdog看门狗
  20. Html飞机大战(十): 消灭敌机

热门文章

  1. QT——C++ GUI开发01
  2. Python画简单月饼(使用turtle)
  3. 这家公司为了让员工玩游戏还专门写了一个小程序
  4. 百度工具问题如何申请百度 360 谷歌等新闻源
  5. 新浪微博AppKey大集合(share)
  6. 总结-微信小程序自定义顶部导航(超详细)附加效果图
  7. informatica 中SQ组件有那些功能?
  8. 《动手学ROS2》3.6手撸一个节点C++版
  9. 统计整理——frequency函数与直方图工具的使用
  10. Excel文档加密网络授权管理方案 - 加密Excel文档并通过服务器端授权管理