如何计算MP3总时长的问题(二)
接着上一次的往下写
2、Mp3的帧详解
每一帧其实包括 帧头,附加信息,主数据,其实我们只要找到帧头,帧头中所包含的数据就能让我们掌控这一帧的信息,帧头固定4个字节(32bit),格式如下
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
下面是就是每个位置代表的含义:
标识 |
长度 |
含义 |
示例 |
A |
11 |
用于同步帧,找到此帧头(所有位均置 1) |
11111111111 |
B |
2 |
音频版本 ID |
11 |
C |
2 |
Layer 的索引 |
01 |
D |
1 |
保护位 |
1 |
E |
4 |
比特率索引(查表) |
1001 |
F |
2 |
采样率索引 (查表) |
10 |
G |
1 |
填充位,如果为1,计算帧长时,要多加1 |
1 |
H |
1 |
私有位 (仅用于标示性的) |
1 |
I |
2 |
声道的模式 |
01 |
J |
2 |
联合立体声(joint stereo) 采用联合立体声编码方式的两个声道具有关联性。 例如MS_stereo将两个声道相加、相差后处理,相减后去掉了左右声道相同的成份,后续的压缩可得到更高的压缩率。 |
10 |
K |
1 |
版权保护,0=no 1=yes |
1 |
L |
1 |
原始版本,0=no 1=yes |
0 |
M |
1 |
预加重 00 - none |
01 |
1)比特率
其中E和F位置的值,是通过mpeg ID和layer索引查标准的值,我写成了一个数组,直接查表得到比特率
int bitrate[5][15] = {
/* MPEG-1 */
{ 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */
256000, 288000, 320000, 352000, 384000, 416000, 448000 },
{ 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */
128000, 160000, 192000, 224000, 256000, 320000, 384000 },
{ 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */
112000, 128000, 160000, 192000, 224000, 256000, 320000 },
/* MPEG-2 ,MPEG-2.5 */
{ 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */
128000, 144000, 160000, 176000, 192000, 224000, 256000 },
{ 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layer */
64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */
};
2)采样频率:
int samplingrate[4][3] = { //value s are in Hz
{11025 , 12000 , 8000}, //MPEG Version 2.5
{0,0,0}, //reserved
{22050, 24000, 16000}, //MPEG Version 2 (ISO/IEC 13818-3)
{44100, 48000, 32000} //MPEG Version 1 (ISO/IEC 11172-3)
};
3)每帧持续时间
在这里在介绍一个比较重要的概念那就是,每帧持续时间,MP3有一个特殊性,那就是每帧持续时间是固定的:
每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000
我们从第一帧的帧头可以得音频版本 ID和layer版本,从而可以确定每帧采样个数
mpeg 1 mpeg 2 mpeg 2.5
layer I 384 384 384
layer II 1152 1152 1152
layer III 1152 576 576
现在我们应该很清楚的知道,为什么我们只需要知道MP3是mpeg1的layerIII层的原因了;(但是按照我现在的理解只要是layer III的就是MP3,呵呵,可以讨论)
(写这个有点慢,因为不会用,不知道咋添加表格,不习惯)
4)计算总时长
下面我们来看计算时间的公式:
播放时间 = 总帧bytes ÷ 比特率 × 8000
比特率:查表可得到;
总帧bytes:简单的看就是,总文件的大小-ID3信息,总文件大小就是读取整个文件的大小,ID3就是之前说过的ID3V2和ID3V1,ID3V1在末尾处128个字节,ID3V2在文件开始为止,大小可以从标签头得到,之前讲过,这样我们就能准确的得到总帧bytes,我们就能计算出来mp3的总时长了.
但是这只是对固定比特率(CBR)的MP3总时长的计算方式,对于变比特率(VBR)的MP3,由于每帧的比特率可能不同,用以上的公式就无法准确算出来mp3总时长,有些文档说可以计算平均比特率,但是这个估算值偏差有时候很大,下一次我来详细讲如果求变化比特率Mp3的总时长,牢牢记住上面的表格,一切的信息都能从那里来。
(才开始写博客,实在不太习惯,写的比较慢,文章继续连载)
转载于:https://www.cnblogs.com/candycaicai/archive/2010/11/12/1875936.html
如何计算MP3总时长的问题(二)相关推荐
- 如何计算MP3总时长的问题(三)--对于变比特率MP3求总时长
3.变比特率MP3总时长求解 之前我们所讨论的都是对于一个固定比特率(CBR)的MP3进行求总时长,由于固定比特率的特殊性,很容易第一帧的帧头就能知道整个MP3的信息,但是对于变比特率(VBR)的MP ...
- Android获取mp3音频文件播放总时长
Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...
- JS获取音频的总时长,解决Audio元素duration为NaN || Infinity 问题
当我们在加载一个线上mp3地址或者获取audio的duration的时候,会发现有拿到duration是Infinity的情况,这时如果我们动态的展示录音时间时候就会有问题.首先明确一下这是chrom ...
- JavaScript 实现页面内时间实时倒计时 计时器内附完整文件欢迎调用(可用于抢购倒计时,记录恋爱纪念日总时长等)输出对应的天数小时分钟秒数
JavaScript 实现页面内时间倒计时 计时器 可用于抢购倒计时,记录恋爱纪念日总时长等输出对应的天数小时分钟秒数 注意:在下一个文章中将公布一个纪念日成品代码,欢迎各位来学习(复制) 第一步:构 ...
- sql计算上班总时长——以每天的第一次上下班打卡时间为准
本文交代了一种求上班总时长的特殊的业务场景,并造了一个玩具数据 ,分别用MySQL和Hive SQL给出了其计算逻辑. 一.业务背景及口径说明 指标 上班总时长 = SUM(下班时间-上班时间) ,但 ...
- Python+pandas统计每个学生学习慕课总时长
推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),清华大学出版社,2020年6月第1次印刷 京东购买链接:https://item.jd.c ...
- ffprobe 获取视频每秒总帧数或视频总帧数及视频总时长
获取每秒总帧数: ffprobe -v 0 -of csv="p=0" -select_streams V:0 -show_entries stream=r_frame_rate ...
- windows 7 下,如何统计某文件夹下 视频总时长
由于项目需要,我需要给系统加权限,这真是一个让人头疼的问题,如果要每个业务方法都加上权限判断逻辑,那真的不敢想象是多么大的工作量,日后有变动的话,我会不会发疯? 所以我必须利用之前学到的AOP编程,在 ...
- Praat脚本-007 | 计算目录里音频或者TextGrid总时长
目录 引出 简便操作 脚本 脚本说明 运行脚本 如何获取脚本 关注 版权说明 引出 统计录音时长,是大家经常用到的一个功能,统计的方法有很多,这里小编只介绍两种,一种是在win10系统中的资源管理器中 ...
最新文章
- ceph 部署单机集群
- 解决ubuntu系统中输入sudo passwd root,之后,提示输入新密码时,输不进去
- Oracle查询一个用户的所有表的结构信息的SQL语句
- 如何在SAP C4C里使用ABSL消费第三方Restful API
- 2021-10-28嵌入式人工智能
- 整个csdn网站处于不死不活的状态
- JSP自定义标签由浅到深讲解
- (47)网页布局常用工具
- 揭开KPI异常检测顶级AI模型面纱
- 价值800元的原官方YM源码 二开苹果cms视频网站源码模板 无后门 完整版可以封装APP 免费分享给大家
- apk注册机加密_apk软件添加注册机方法 安卓apk添加授权教程
- java加减乘除判断代码_JAVA实现精确的加减乘除代码
- 照片估计明星身高matlab,娱乐圈部分明星真实身高 (净高版)
- 微信小程序入门:和风天气小程序
- 化妆品店5大智能玩法,引领美容美妆新零售趋势
- java中怎么给redis缓存设置失效时间
- 奇安信2022年营收66.3亿:同比增14% 扣非后净亏3亿
- 如何为勒索软件攻击做准备?
- 程序员的高逼格头像——自制八爪鱼少年
- 数据预处理之One-Hot(独热编码)编码
热门文章
- 三天没有更新我的BLOG
- 鸿蒙台湾乌龙茶,郭碧婷生女再闹乌龙?向太守口如瓶,向佐有意回避,其实另有隐情...
- canvas是什么牌子的包_Jack Spade DIPPED INDUSTRIAL CANVAS UTILITY BRIEF 男款帆布手提包
- EasyPR-Java开源中文车牌识别系统工程部署
- httpclient解析https网页
- 软件测试Web数据分析工具HttpWatch安装
- 注册表修改之USB口启用
- 数据结构源码笔记(C语言):可变长度字符串的快速排序
- discuz!x2.5登录管理面板
- 开机出现grub rescue无法进入系统 恢复ubuntu系统下grub引导 windows xp和ubuntu9.10双系统引导程序的修复