有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android MediaPlayer seekTo(0)不寻求启动

我们的应用程序有很多音乐,比如音频,我们有一个seekbar,播放/暂停控制等等

我们遇到的问题是,在某些设备上,我们无法使用seekbar查找文件的开头,而不会在开头出现口吃或少量丢失(大约一秒钟,给定或获取)。跳过的数量在不同的文件和设备之间不相同,但每次使用相同的文件设备组合时,跳过的数量相同

我们可以从一开始就避免这些问题的唯一方法是调用MediaPlayer.stop(),然后重新开始发布和构建—这是我们想要避免的,因为寻找应该就可以了。查找文件的其他区域似乎是可行的,或者至少不太明显

这在我们的大多数设备上都会发生,经过测试的型号包括华硕Nexus 7、华为Nexus 6P、LG G4和索尼Xperia Z。值得注意的是,我们在三星平板电脑上没有这种体验

我们用JNI编码C++,最少有Android 4.4。因此,我们所有的MediaPlayer调用都通过JNI进入java代码。seekbar以百分比的形式传递一个介于0和1之间的值,我们已经确认它确实在向JNI发送一个0

所讨论的文件是立体声Ogg Vorbis,以44.1 KHz的可变比特率采样。它们存储在OBB(打包为未压缩的zip)中,通过具有偏移量和长度的FileInputStream进行访问。我们使用这个方法(或C++上的一个类似方法)成功地应用于其他应用程序的其他领域,例如纹理或XML文件。如果需要的话,我们确实有在使用文件之前复制文件的能力;然而,如果可以的话,我们宁愿避免这种情况

我们做错什么了吗?这是一个已知的问题吗?有解决办法吗

public void JNI_Audio_StartTrack(int iTrackIndex, String audioPath, long offset, long length)
{
    if (enableDebug)
    {
        String myString = String.format("ExtAudio_StartTrack(%d,%s,%d,%d)", iTrackIndex, audioPath, offset, length);
        Log.d("Tag", myString);
    }

    if (mediaPlayerInited)
    {
        mediaPlayer.release();
    }

    Context context = getApplicationContext();
    int trackResource = 0;
    FileInputStream fis = null;
    try
    {
        fis = new FileInputStream(audioPath);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(fis.getFD(), offset, length);

        mediaPlayer.prepare();
        mediaPlayer.start();
        mediaPlayerInited = true;
    }
    //Normal FileInputStream handling Catch...Finally blocks follow
}

public void JNI_Audio_SeekTo(float iPercentage)
{
    if (enableDebug)
    {
        String myString = String.format("ExtAudio_SeekTo(%f)", iPercentage);
        Log.d("Tag", myString);
    }

    if (mediaPlayerInited)
    {
        int duration = mediaPlayer.getDuration();
        float newSeekPos = (float)duration * iPercentage;
        mediaPlayer.seekTo((int)newSeekPos);
    }
}

共 (0) 个答案