您的位置:首页 > 其它

音频文件播放时间的获取

2014-08-24 16:26 441 查看

1.     基础知识

采样率是指采样样本与总样本数之比,采样数率是单位时间采样数。如果是仪器中,采样速率为40MSa/s,说明每秒采样数量为40M个,但是不能使用40MHz表示。把模拟音频转成数字音频的过程,就称作采样,简单地说就是通过波形采样的方法记录1秒钟长度的声音,需要多少个数据。44KHz采样率的声音就是要花费44000个数据来描述1秒钟的声音波形。原则上采样率越高,声音的质量越好;

比特率是指每次采样所包含的音频的数据流量.单位是bps,比特率越高的音频文件体积越大,音质也越接近原始音质;

音频有几个比较重要的参数,如KHZ,BIT,声道,KBPS等.而格式不同,算法也就不同,所以就算了在以上参数相同的时候,格式不同音质也会有很大差别.其中的,VBR这是一种动态的采样,详细全面的解释,请看下面的说明:

【采样频率/采样率】

数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样 频率或采率,单位为HZ(赫兹)。采样频率越高所能描述的声波频率就越高。

采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为 22.05KHz、44.1KHz、48KHz三个等级,22.05KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。对于高于48KHz的采样频率人耳已无法辨别出
来了,所以在电脑上没有多少使用价值。

5kHz的采样率仅能达到人们讲话的声音质量。

11kHz的采样率是播放小段声音的最低标准,是CD音质的四分之一。

22kHz采样率的声音可以达到CD音质的一半,目前大多数网站都选用这样的采样率。

44kHz的采样率是标准的CD音质,可以达到很好的听觉效果。

【位速/Bitrate/码率】

位速是指在一个数据流中每秒钟能通过的信息量。您可能看到过音频文件用 “128KbpsMP3” 或 “64Kbps WMA” 进行描述的情形。Kbps 表示 “每秒千字节数”,因此数值越大表示数据越多:128Kbps MP3 音频文件包含的数据量是 64Kbps WMA 文件的两倍,并占用两倍的空间。(不过在这种情况下,这两种文件听起来没什么两样。原因是什么呢?有些文件格式比其他文件能够更有效地利用数据, 64Kbps WMA 文件的音质与
128Kbps MP3 的音质相同。)需要了解的重要一点是,位速越高,信息量越大,对这些信息进行解码的处理量就越大,文件需要占用的空间也就越多。

为项目选择适当的位速取决于播放目标:如果您想把制作的 VCD 放在 DVD 播放器上播放,那么视频必须是 1150Kbps,音频必须是 224 Kbps。典型的 206 MHzPocket PC 支持的 MPEG 视频可达到 400 Kbps—超过这个限度播放时就会出现异常。

【VBR/ABR/CBR】

VBR(Variable Bitrate)动态比特率。也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率。这是Xing发展的算法,他们将一首歌的复杂部分用高Bitrate编码,简单部分用低Bitrate编码。主意虽然不错,可惜Xing编码器的VBR算法很差,音质与CBR相去甚远。幸运的是, Lame完美地优化了VBR算法,使之成为MP3的最佳编码模式。这是以质量为前提兼顾文件大小的方式,推荐编码模式。

ABR(Average Bitrate)平均比特率,是VBR的一种插值参数。Lame针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR也 被称为“SafeVBR”,它是在指定的平均Bitrate内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量。举例来说,当指定用192kbps
ABR对一段wav文件进行编码时,Lame会将该文件的85%用192kbps固定编码,然后对剩余15%进行动态优化:复杂部分用高于192kbps 来编码、简单部分用低于192kbps来编码。与192kbpsCBR相比,192kbps ABR在文件大小上相差不多,音质却提高不少。ABR编码在速度上是VBR编码的2到3倍,在128-256kbps范围内质量要好于CBR。可以做为VBR和CBR的一种折衷选择。

CBR(Constant Bitrate),常数比特率,指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,但音质却不会有明显的提高。 对MP3来说Bitrate是最重要的因素,它用来表示每秒钟的音频数据占用了多少个bit(bit per second,简称bps)。这个值越高,音质就越好。

 

 

2.     播放时间的提取

音频文件播放时间的获取的主要步骤:

(1)       借助千千静听,查看文件属性

(2)          如果音频文件是CBR格式的,那么就可以直接获取,在windows下查看文件的、大小属性,如这里的“爱我你怕了吗.mp3”,大小为:6.65MB。

(3)          计算播放时间:播放时间 = 文件大小(字节)*8/(码率*1000)(bps)

所以这里的播放时间 =6.65*1024*1024*8/(192*1000) = 290.54s

       千千静听获取的时间为:4:47.947,转换后,基本上差不多。

2.1.   MP3文件的获取

如上所示,这里提取的是CBR格式的,时间提取差不多,如果是VBR,则如下:

       “E:\歌曲\MP3\Home.mp3”文件的大小为:6.79MB

       播放时间 = 6.79 * 1024 * 1024 * 8/(191*1000) = 298.21s

       VBR格式计算的时间也基本上差不多。

 

2.2.   AAC文件的获取

(1)       后缀为.aac格式

       “E:\歌曲\aac\老男孩_筷子兄弟.aac”文件的大小为:2.29MB

       播放时间 = 2.29 * 1024 * 1024 * 8/(64*1000) = 300.15s

       这个时间比用ffmpeg提取的时间还要准确!!!!

后经在ffmpeg测试发现,ffmpeg计算播放时间的方法也是如上所示,只不过是ffmpeg提取aac歌曲的码率不正确。这才导致其计算的播放时间不正确。

解决办法:

还是利用faad库,在faad2-2.7
a61b
\frontend文件夹下,将main函数中的相关内容封装到neaacdec.h文件夹下,然后就可以直接使用其相关的结构体和数据库提取相关的内容。具体参考《faad2-2.7-hk》内容。

使用,直接使用封装好的函数就可以获取相关的播放时间,如下所示:

static intgetAacPlayTime(char *aacfilename)

返回值就是播放时间,单位为秒。

 

(2)       后缀为.m4a格式

       “E:\歌曲\aac\01 怪獸 (The Monster).m4a”文件的大小为:7.67MB

       播放时间 = 7.67 * 1024 * 1024 * 8/(256*1000) = 251.33s

       也基本上可以接受!!!

2.3.   wav文件的获取

       “E:\歌曲\wav\传奇.wav”文件的大小为:50.1MB

       播放时间 = 50.1 * 1024 * 1024 * 8/(1.41*1000*1000) = 298.06s

       时间刚刚好!!!

2.4.   APE文件的获取

 

       “E:\歌曲\ape\周杰伦 - 紅塵客棧.ape”文件的大小为:26.6MB

       播放时间 = 26.6 * 1024 * 1024 * 8/(811*1000) = 275.14s

       时间刚刚好!!!

 

2.5.   ALAC文件的获取

千千静听无法播放,酷狗音乐也无法播放,这里借助foorbar2000进行查看,

       “E:\歌曲\alac\01.爱是无色的.m4a”文件的大小为:22.3MB

       播放时间 = 22.3* 1024 * 1024 * 8/(793*1000) = 235.89s

       时间刚刚好!!!

 

实际上,这里除了利用ffmpeg方法外,还有一种方法,那就是在利用程序解码时获取到的totalSampleId

播放时间 = totalSampleId * 4095 / 采样频率

 

2.6.   FLAC文件的获取

千千静听无法播放,这里利用酷狗音乐查看,

       “E:\歌曲\flac\2-Evidence.flac”文件的大小为:139MB

       播放时间 = 139* 1024 * 1024 * 8/(3085*1000) = 377.96s

       时间刚刚好!!!

 

2.7.   WMA文件的获取

千千静听无法播放,酷狗音乐也无法播放,这里借助foorbar2000进行查看,

       “E:\歌曲\wma\mr.wma”文件的大小为:4.3MB

       播放时间 = 4.3* 1024 * 1024 * 8/(328*1000) = 109.97s

       这个无法提取!!!

 

2.8.   OGG文件的获取

       “E:\歌曲\ogg\爱一个人好难.ogg”文件的大小为:2.65MB

       播放时间 = 2.65 * 1024 * 1024 * 8/(75*1000) = 296.39s

       时间差一点!!!

 

2.9.   AIFF文件的获取

       “E:\歌曲\aiff\传奇16.aiff”文件的大小为:50.1MB

       播放时间 = 50.1 * 1024 * 1024 * 8/(1.41*1000*1000) = 298.06s

       时间刚刚好!!!

       “E:\歌曲\aiff\传奇8.aiff”文件的大小为:25.0MB

       播放时间 = 25.0 * 1024 * 1024 * 8/(705*1000) = 297.46s

       时间差不多!!!

 

 

综上所述,播放时间 = 文件大小(字节)*8/(码率*1000)(bps)

利用此公式计算歌曲播放的时间,如上所示的音乐格式中,只有wma格式偏差较大,其他类型的歌曲获取到的时间长度都相对比较准备,但是需要说明的是,前提条件码率的获取必须正确,如上面所讲利用ffmpeg获取aac的码率都不是很准备,所以相对的其计算得到的播放时间也就不是很准备。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ffmpeg 音频 歌曲时间