Недавно я задал вопрос об управлении громкостью аудиоклипа Java, и мне предложили попробовать JMF. Поскольку я использую старую JVM (1.4) и заинтересован только в воспроизведении файлов WAV, JMF был идеальным решением и значительно упростил код для загрузки, воспроизведения и управления громкостью аудиоклипов в моем приложении.
Но у меня возникли проблемы с остановкой клипов по запросу. Казалось бы, просто вызвать player.stop()
, но stop()
блокируется до тех пор, пока игрок не закончит играть. Вот простой пример кода:
Player p = Manager.createRealizedPlayer( f.toURI().toURL() );
p.start();
System.out.println( "Player playing" );
Thread.sleep( 1000 );
System.out.println( " Clip is at time: " + p.getMediaTime().getSeconds() );
p.stop();
System.out.println( " Clip is at time: " + p.getMediaTime().getSeconds() );
Это производит вывод как:
Player playing
Clip is at time: 0.8591836730000001
Clip is at time: 3.227619047
Где я ожидал, что второй раз будет читаться так же или ненадолго позже, чем первый. (Или, возможно, был сброшен на 0 или что-то в этом роде.) Я также пробовал p.setStopTime( p.getMediaTime() )
. Это останавливает клип вовремя, но воспроизводит доли секунды искажения перед остановкой, что нежелательно.
Поиск в Google заставляет меня думать, что у других нет этой проблемы, и было довольно сложно найти варианты. Может ли это быть проблема с буферизацией или я что-то упустил? Любое понимание, которое вы можете предоставить, очень ценится.
Подробности: я использую (и не могу изменить) JVM 1.4.2 с JMF 2.1.1. Все мои файлы WAV имеют длину всего 1-10 секунд.