起因
最近在家办公中,碰到需要处理一些视频文件的操作,公司一直使用的某云存储,处理图片的接口倒是挺多,但是视频类的一些处理就需要开通另外的服务了,捣鼓了一圈子还是决定自己处理给公司省点钱吧。
PHP 在本地处理视频等媒体文件的时候一般都是借助了 『ffmpeg』,但是代码有点太老,扩展安装又出了幺蛾子,搞了一下午好累。
后面发现还有 getID3 也可以用来处理相关媒体文件信息,这是一个 PHP 脚本,只需要简单引入项目即可,不需要安装额外的扩展或者工具。但是问题又来了,国外的下载速度死慢,1.4M 的东西下载了 1 个多小时哭死我。
下载
getID3 官方地址:https://www.getid3.org
Github 下载地址: https://github.com/JamesHeinrich/getID3/archive/master.zip
SourceForge 下载地址:https://sourceforge.net/projects/getid3/
腾讯云下载地址: https://reggie-1258048181.cos.ap-guangzhou.myqcloud.com/web/getID3-master.zip
备用下载地址:https://www.tokme.cn/images/web/getID3-master.zip
使用
因为这不是一个标准的符合 PSR-4 规范的包(没有命名空间,类名也不咋地没细看),如果在项目要使用的话直接添加整个getid3文件夹,然后引入 getid3/getid3.php 即可。如果是在thinkPHP5.1 中可以这样引入。
解压文件,把getid3文件夹放到项目下,我是放到了 extend下(包里有很多无用的文件都可以删除)
最后在需要使用的地方引入即可
/**引入类库*/
require "../extend/getid3/getid3.php";
下面四demo
// 方法1
$getID3 = new \getID3();
$analyzeFileInfo = $getID3->analyze($filepath['filePath']);
halt($analyzeFileInfo );
$fileduration = $analyzeFileInfo['playtime_seconds']; //这个获得的便是音频文件的时长
$time = (int)ceil($fileduration);
里面会有很多的属性,看自己的需要来取吧。比如其中的 playtime_seconds 就是媒体的时长。
halt($analyzeFileInfo );打印的内容
"data": {
"GETID3_VERSION": "1.9.19-202002221838",
"filesize": 2574957,
"filepath": "D:/phpstudy_pro/WWW/mjgf-app/public/uploads/app/audioFile/20210611",
"filename": "5eb484aff854abd8412e0737112bc067.mp3",
"filenamepath": "D:/phpstudy_pro/WWW/mjgf-app/public/uploads/app/audioFile/20210611/5eb484aff854abd8412e0737112bc067.mp3",
"avdataoffset": 45,
"avdataend": 2574957,
"fileformat": "mp3",
"audio": {
"dataformat": "mp3",
"channels": 1,
"sample_rate": 48000,
"bitrate": 64000,
"channelmode": "mono",
"bitrate_mode": "cbr",
"lossless": false,
"encoder_options": "CBR64",
"compression_ratio": 0.08333333333333333,
"streams": [
{
"dataformat": "mp3",
"channels": 1,
"sample_rate": 48000,
"bitrate": 64000,
"channelmode": "mono",
"bitrate_mode": "cbr",
"lossless": false,
"encoder_options": "CBR64",
"compression_ratio": 0.08333333333333333
}
]
},
"tags": {
"id3v2": {
"encoder_settings": [
"Lavf57.41.100"
]
}
},
"encoding": "UTF-8",
"id3v2": {
"header": true,
"flags": {
"unsynch": false,
"exthead": false,
"experim": false,
"isfooter": false
},
"majorversion": 4,
"minorversion": 0,
"headerlength": 45,
"tag_offset_start": 0,
"tag_offset_end": 45,
"encoding": "UTF-8",
"comments": {
"encoder_settings": [
"Lavf57.41.100"
]
},
"TSSE": [
{
"frame_name": "TSSE",
"frame_flags_raw": 0,
"data": "Lavf57.41.100",
"datalength": 15,
"dataoffset": 10,
"framenamelong": "Software/Hardware and settings used for encoding",
"framenameshort": "encoder_settings",
"flags": {
"TagAlterPreservation": false,
"FileAlterPreservation": false,
"ReadOnly": false,
"GroupingIdentity": false,
"compression": false,
"Encryption": false,
"Unsynchronisation": false,
"DataLengthIndicator": false
},
"encodingid": 3,
"encoding": "UTF-8"
}
],
"padding": {
"start": 35,
"length": 10,
"valid": true
}
},
"mime_type": "audio/mpeg",
"mpeg": {
"audio": {
"raw": {
"synch": 4094,
"version": 3,
"layer": 1,
"protection": 1,
"bitrate": 5,
"sample_rate": 1,
"padding": 0,
"private": 0,
"channelmode": 3,
"modeextension": 0,
"copyright": 0,
"original": 1,
"emphasis": 0
},
"version": "1",
"layer": 3,
"channelmode": "mono",
"channels": 1,
"sample_rate": 48000,
"protection": false,
"private": false,
"modeextension": "",
"copyright": false,
"original": true,
"emphasis": "none",
"padding": false,
"bitrate": 64000,
"framelength": 192,
"bitrate_mode": "cbr"
}
},
"playtime_seconds": 321.864,
"tags_html": {
"id3v2": {
"encoder_settings": [
"Lavf57.41.100"
]
}
},
"bitrate": 64000,
"playtime_string": "5:22"
}
补充:
getID3()这个PHP脚本能够从MP3或其它媒体文件中提取有用的信息如:ID3标签,bitrate,播放时间等。
(格式包括:Ogg,WMA,WMV,ASF,WAV,AVI,AAC,VQF,FLAC,MusePack,Real,QuickTime,Monkey’s Audio,MIDI等)。
官方网址:https://www.getid3.org/。
功能:
使用这个方法,可以获得音频、视频、图片等媒体文件中的信息,
我测了一下常见类型的媒体文件,测试结果如下:
使用的getID3的版本是:1.9.16-201810171314。
支持的类型:
音频:【mp3】、【amr】;
视频:【mp4】、【flv】、【wmv】、【avi】;
图片:【gif】、【png】、【jpg】。
不支持的类型:
视频格式【ts】。
示例:
使用背景:做聊天功能时,发送语音时,需要知道语音的时长,这个时候就可以使用getID3这个类。
开发环境:ThinkPHP5.1框架。
下载getID3类:在官网下载后解压,里边有许多文件,很多都是demo,只需要将getid3目录放到项目里,
我把目录放到extend下。
调用示例代码:
require "../extend/getid3/getid3.php";
$getID3 = new \getID3();
$analyzeFileInfo = $getID3->analyze($filename);
if($analyzeFileInfo && is_array($analyzeFileInfo)){
if(isset($analyzeFileInfo['error']) && $analyzeFileInfo['error']){
$err_msg = '获取语音消息的时长失败';
if(is_array($analyzeFileInfo['error'])){
foreach ($analyzeFileInfo['error'] as $key=>$value) {
$err_msg .= ',错误'. ($key+1) . ':'.$value;
}
}else{
$err_msg .= ',错误:'.$analyzeFileInfo['error'];
}
log($err_msg);
return false;
}else{
if(isset($analyzeFileInfo['playtime_seconds'])){
return ceil($analyzeFileInfo['playtime_seconds']);
}
return false;
}
}else{
log('解析语音文件失败:'.$analyzeFileInfo);
return false;
}
}