如何在android中获取音乐文件(MP3)的采样率和频率?

问题描述:

我正在开发android中的音频播放器。所以我想添加播放歌曲的细节,例如艺术家姓名,持续时间,比特率和采样频率。 我可以通过使用MediaStore.Audio.Media library获取音乐文件的艺术家姓名和持续时间。但我无法获得同一文件的比特率和采样频率。那么我怎么能得到相同的?如何在android中获取音乐文件(MP3)的采样率和频率?

据我所知,它可以通过使用本地库来完成。但不知道如何?所以任何人都可以帮助我呢?

+0

我觉得来计算频率,你必须做一个快速傅立叶变换(FFT)。 – RoflcoptrException 2011-03-04 09:56:05

+0

FFT会给出实际声音的频率分布,而不是采样率,否? – 2011-03-05 05:53:21

您可以通过将文件大小在秒的音频的长度,例如,从随机AAC接近它在我的图书馆编码M4A:

File Size: 10.3MB (87013064 bits) 
Length: 5:16 (316 Seconds) 
Which gives: 87013064 bits/316 seconds = 273426.147 bits/sec or ~273kbps 
Actual Bitrate: 259kbps 

由于大多数的音频文件都有一组已知的有效比特率级别,您可以使用它来将比特率调整到适当的级别进行显示。

+0

谢谢杰克,我可以通过使用上面的公式得到比特率。频率怎么样? – Sandy 2011-03-04 04:20:15

+0

这是一个更加棘手的问题,因为抽样率很难从其他信息中推导出来。 CD之后几乎所有的消费者音频都使用44.1KHz采样,因此可以安全地假设,或者根本不显示它,因为它对许多用户来说影响不大。 – 2011-03-04 04:22:31

+0

是的,你是对的。但我可以通过在android中使用本地库获得。但我不知道如何使用它。 – Sandy 2011-03-04 04:25:22

MediaMetadataRetriever优惠METADATA_KEY_DURATION你可以用文件大小来划分比特率。

+1

-1,这也没有得到采样率 – Brad 2011-11-23 14:11:29

我知道它已经解决,但我得到了更好的方法来得到准确的答案

MediaExtractor mex = new MediaExtractor(); 
try { 
    mex.setDataSource(path);// the adresss location of the sound on sdcard. 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

MediaFormat mf = mex.getTrackFormat(0); 

int bitRate = mf.getInteger(MediaFormat.KEY_BIT_RATE); 
int sampleRate = mf.getInteger(MediaFormat.KEY_SAMPLE_RATE);