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) 个答案