Не удается воспроизвести поток mp3 с помощью JMF

У меня есть такой короткий пример кода аудиоплеера, который работает нормально:

public class AudioTest {

    public static void main(String[] args) {
        Format input1 = new AudioFormat(AudioFormat.MPEGLAYER3);
        Format input2 = new AudioFormat(AudioFormat.MPEG);
        Format output = new AudioFormat(AudioFormat.LINEAR);
        PlugInManager.addPlugIn(
                "com.sun.media.codec.audio.mp3.JavaDecoder",
                new Format[]{input1, input2},
                new Format[]{output},
                PlugInManager.CODEC);
        try {
            Player player = Manager.createPlayer(new File("tone.mp3").toURL());
            player.start();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Теперь я хотел передать mp3 из сервлета с помощью:

Manager.createPlayer(new URL("http://localhost:88/media/tone.mp3"));

Сервлет получает запрос, я открываю тестовый файл и отправляю запросчику. Проблема в том, что mp3 не проигрывается (нет звука) и вообще нет сообщения об ошибке.

Если я загружаю файл через браузер, файл воспроизводится правильно.

Сервлет выглядит следующим образом:

public class MediaSource extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.err.println(req);

        File mp3 = new File("tone.mp3");
        InputStream in = new FileInputStream(mp3);

        resp.setContentType("audio/mpeg");
        resp.addHeader("Content-Disposition",
                "attachment; filename=" + mp3.getName());

        resp.setContentLength((int) mp3.length());

        ServletOutputStream out = resp.getOutputStream();
        byte buf[] = new byte[1024];
        int n = in.read(buf, 0, 1024);
        while (n > 0) {
            out.write(buf, 0, n);
            out.flush();
            n = in.read(buf, 0, 1024);
        }

        in.close();
        out.close();
    }
}

Обновление для @jogabonito

Это события

javax.media.TransitionEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,previous=Unrealized,current=Realizing,target=Started]
javax.media.CachingControlEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,cachingControl=com.sun.media.protocol.DataSource$CachingControl@f9f9d8,progress=102400]
javax.media.DurationUpdateEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,duration=javax.media.Time@1decdec
javax.media.RealizeCompleteEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,previous=Realizing,current=Realized,target=Started]
javax.media.TransitionEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,previous=Realized,current=Prefetching,target=Started]
javax.media.CachingControlEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,cachingControl=com.sun.media.protocol.DataSource$CachingControl@f9f9d8,progress=204800]
javax.media.CachingControlEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,cachingControl=com.sun.media.protocol.DataSource$CachingControl@f9f9d8,progress=205889]
javax.media.PrefetchCompleteEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,previous=Prefetching,current=Prefetched,target=Started]
javax.media.StartEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,previous=Prefetched,current=Started,target=Started,mediaTime=javax.media.Time@691f36,timeBaseTime=javax.media.Time@18020cc]
javax.media.EndOfMediaEvent[source=com.sun.media.content.unknown.Handler@c2ea3f,previous=Started,current=Prefetched,target=Prefetched,mediaTime=javax.media.Time@e94e92]

person PeterMmm    schedule 27.01.2011    source источник


Ответы (1)


Не могли бы вы реализовать интерфейс ControllerListener, а затем проверить наличие ControllerEvents. Затем мы можем узнать, на каком этапе создания игрока произошел сбой.

person bobby    schedule 27.01.2011
comment
По логу вроде все нормально. Еще один вопрос, когда вы воспроизводите файл из локального хранилища, как в Player player = Manager.createPlayer(new File(tone.mp3).toURL()); Является ли создаваемый объект проигрывателя com.sun.media.content.unknown.Handler? Я бы подумал, что это будет com.sun.media.content.audio.mp3.Handler - person bobby; 27.01.2011
comment
Извините за задержку ответа. Код JMF выглядит солидно, а сервлеты не совсем моя тема :-) Может быть, кто-нибудь еще сможет помочь. - person bobby; 28.01.2011