接着上一次的往下写

2、Mp3的帧详解

  每一帧其实包括 帧头,附加信息,主数据,其实我们只要找到帧头,帧头中所包含的数据就能让我们掌控这一帧的信息,帧头固定4个字节(32bit),格式如下

  AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM

 下面是就是每个位置代表的含义: 

标识

长度

含义

示例

A

11

用于同步帧,找到此帧头(所有位均置 1)

11111111111

B

2

音频版本 ID
00 - 版本是 MPEG 2.5 (MPED-2 的非官方扩展版本)
01 – 保留
10 – 版本是 MPEG 2 (ISO/IEC 13818-3)
11 – 版本是 MPEG 1 (ISO/IEC 11172-3) 通过ID查表得其他信息

11

C

2

Layer 的索引
00 – 保留
01 - Layer III
10 - Layer II
11 - Layer I

01

D

1

保护位
1 – 无 CRC 0 – 用 16位的 CRC保护下面的帧头

1

E

4

比特率索引(查表)

1001

F

2

采样率索引 (查表)

10

G

1

填充位,如果为1,计算帧长时,要多加1

1

H

1

私有位 (仅用于标示性的)

1

I

2

声道的模式
00 – 立体声
01 – 混合立体声
10 – 双声道 (两个单声道)
11 – 一个声道 (单声道)

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 - 50/15 ms
10 - reserved
11 - CCIT J.17

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总时长的问题(二)相关推荐

  1. 如何计算MP3总时长的问题(三)--对于变比特率MP3求总时长

    3.变比特率MP3总时长求解 之前我们所讨论的都是对于一个固定比特率(CBR)的MP3进行求总时长,由于固定比特率的特殊性,很容易第一帧的帧头就能知道整个MP3的信息,但是对于变比特率(VBR)的MP ...

  2. Android获取mp3音频文件播放总时长

    Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...

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

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

  4. JavaScript 实现页面内时间实时倒计时 计时器内附完整文件欢迎调用(可用于抢购倒计时,记录恋爱纪念日总时长等)输出对应的天数小时分钟秒数

    JavaScript 实现页面内时间倒计时 计时器 可用于抢购倒计时,记录恋爱纪念日总时长等输出对应的天数小时分钟秒数 注意:在下一个文章中将公布一个纪念日成品代码,欢迎各位来学习(复制) 第一步:构 ...

  5. sql计算上班总时长——以每天的第一次上下班打卡时间为准

    本文交代了一种求上班总时长的特殊的业务场景,并造了一个玩具数据 ,分别用MySQL和Hive SQL给出了其计算逻辑. 一.业务背景及口径说明 指标 上班总时长 = SUM(下班时间-上班时间) ,但 ...

  6. Python+pandas统计每个学生学习慕课总时长

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),清华大学出版社,2020年6月第1次印刷 京东购买链接:https://item.jd.c ...

  7. ffprobe 获取视频每秒总帧数或视频总帧数及视频总时长

    获取每秒总帧数: ffprobe -v 0 -of csv="p=0" -select_streams V:0 -show_entries stream=r_frame_rate ...

  8. windows 7 下,如何统计某文件夹下 视频总时长

    由于项目需要,我需要给系统加权限,这真是一个让人头疼的问题,如果要每个业务方法都加上权限判断逻辑,那真的不敢想象是多么大的工作量,日后有变动的话,我会不会发疯? 所以我必须利用之前学到的AOP编程,在 ...

  9. Praat脚本-007 | 计算目录里音频或者TextGrid总时长

    目录 引出 简便操作 脚本 脚本说明 运行脚本 如何获取脚本 关注 版权说明 引出 统计录音时长,是大家经常用到的一个功能,统计的方法有很多,这里小编只介绍两种,一种是在win10系统中的资源管理器中 ...

最新文章

  1. ceph 部署单机集群
  2. 解决ubuntu系统中输入sudo passwd root,之后,提示输入新密码时,输不进去
  3. Oracle查询一个用户的所有表的结构信息的SQL语句
  4. 如何在SAP C4C里使用ABSL消费第三方Restful API
  5. 2021-10-28嵌入式人工智能
  6. 整个csdn网站处于不死不活的状态
  7. JSP自定义标签由浅到深讲解
  8. (47)网页布局常用工具
  9. 揭开KPI异常检测顶级AI模型面纱
  10. 价值800元的原官方YM源码 二开苹果cms视频网站源码模板 无后门 完整版可以封装APP 免费分享给大家
  11. apk注册机加密_apk软件添加注册机方法 安卓apk添加授权教程
  12. java加减乘除判断代码_JAVA实现精确的加减乘除代码
  13. 照片估计明星身高matlab,娱乐圈部分明星真实身高 (净高版)
  14. 微信小程序入门:和风天气小程序
  15. 化妆品店5大智能玩法,引领美容美妆新零售趋势
  16. java中怎么给redis缓存设置失效时间
  17. 奇安信2022年营收66.3亿:同比增14% 扣非后净亏3亿
  18. 如何为勒索软件攻击做准备?
  19. 程序员的高逼格头像——自制八爪鱼少年
  20. 数据预处理之One-Hot(独热编码)编码

热门文章

  1. 三天没有更新我的BLOG
  2. 鸿蒙台湾乌龙茶,郭碧婷生女再闹乌龙?向太守口如瓶,向佐有意回避,其实另有隐情...
  3. canvas是什么牌子的包_Jack Spade DIPPED INDUSTRIAL CANVAS UTILITY BRIEF 男款帆布手提包
  4. EasyPR-Java开源中文车牌识别系统工程部署
  5. httpclient解析https网页
  6. 软件测试Web数据分析工具HttpWatch安装
  7. 注册表修改之USB口启用
  8. 数据结构源码笔记(C语言):可变长度字符串的快速排序
  9. discuz!x2.5登录管理面板
  10. 开机出现grub rescue无法进入系统 恢复ubuntu系统下grub引导 windows xp和ubuntu9.10双系统引导程序的修复