我正在开发一个应用程序,其中有一些音频文件的列表。当我点击某个项目时,它会播放相应的音频并显示持续时间。问题是在Android 2.1设备和模拟器中持续时间是正确的但在android 2.2模拟器中它显示错误的持续时间。有没有人有想法解决这个问题。有没有一个很好的方法来获得正确的声音文件持续时间。音频文件位于res / raw文件夹中。有一点是同样的声音iphone显示正确的持续时间。
答案 0 :(得分:2)
是
这可能是由于VBR文件造成的。可变比特率在标题中提到了一个速率,Android软件可能会使用该速率来计算MP3长度的持续时间。
我记得曾经见过一个可以计算'正确'有效比特率并在开始时为单独的MP3数据帧添加前缀的实用程序,只是为了让它报告'正确'(平均)比特率。
尝试VBRFix
在整首歌曲中,有些要求高质量的要点和要求低质量的要点(即沉默)。而不是使整个文件具有一个质量:VBR(可变比特率)为我们提供了文件中的可变质量。这使我们能够更有效地使用文件空间。问题是许多MP3播放程序根据他们找到的第一个比特率和文件大小来估计MP3的时间。此外,当跳过文件时,位置不一样 - 通过VBR mp3的一半可能不会在歌曲的一半。 Ogg Vorbis是一种更先进的免费音乐格式,默认使用VBR作为默认值
它也在Ubuntu的存储库中(可能是Debian): sudo apt-get install vbrfix
答案 1 :(得分:0)
我回答这个问题可能有点迟了但是,无论如何我使用Ringdroid修复了类似的问题。这是使用Rindroid从VBR文件获取音频持续时间(以毫秒为单位)所需要做的事情
public class AudioUtils
{
public static long getDuration(CheapSoundFile cheapSoundFile)
{
if( cheapSoundFile == null)
return -1;
int sampleRate = cheapSoundFile.getSampleRate();
int samplesPerFrame = cheapSoundFile.getSamplesPerFrame();
int frames = cheapSoundFile.getNumFrames();
cheapSoundFile = null;
return 1000 * ( frames * samplesPerFrame) / sampleRate;
}
public static long getDuration(String mediaPath)
{
if( mediaPath != null && mediaPath.length() > 0)
try
{
return getDuration(CheapSoundFile.create(mediaPath, null));
}catch (FileNotFoundException e){}
catch (IOException e){}
return -1;
}
}
希望这有帮助