android 2.2上声音文件的持续时间错误

时间:2011-05-20 19:16:36

标签: android android-2.2-froyo

我正在开发一个应用程序,其中有一些音频文件的列表。当我点击某个项目时,它会播放相应的音频并显示持续时间。问题是在Android 2.1设备和模拟器中持续时间是正确的但在android 2.2模拟器中它显示错误的持续时间。有没有人有想法解决这个问题。有没有一个很好的方法来获得正确的声音文件持续时间。音频文件位于res / raw文件夹中。有一点是同样的声音iphone显示正确的持续时间。

2 个答案:

答案 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;
    }
}

希望这有帮助