2014-12-18 5 views
0

Я использовал код из старого Tutorial2B.java Каприка, чтобы играть весь файл:VLCJ playmedia() останавливает игру примерно через 1 секунду воспроизведения

public class Tutorial2B { 

private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 

public static void main(final String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Tutorial2B(args); 
     } 
    }); 
} 

private Tutorial2B(String[] args) { 
    JFrame frame = new JFrame("vlcj Tutorial"); 

    mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 

    frame.setContentPane(mediaPlayerComponent); 

    frame.setLocation(100, 100); 
    frame.setSize(1050, 600); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    mediaPlayerComponent.getMediaPlayer().playMedia("/home/me/sample.MP3"); 
    } 
} 

Однако, я не могу получить следующий код, чтобы играть мой аудиофайл более чем на долю секунды:

public class Tutorial2B { 

private final AudioMediaPlayerComponent mediaPlayerComponent; 

public static void main(String[] args) { 
SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     new Tutorial2B(); 
     } 
    }); 
} 

private Tutorial2B() { 
    mediaPlayerComponent = new AudioMediaPlayerComponent(); 
    MediaPlayer mediaPlayer = mediaPlayerComponent.getMediaPlayer(); 
    mediaPlayer.playMedia("/home/me/sample.mp3") 
} 

Любые подсказки относительно того, почему это не работает?

текущий код 21 декабря:

public class Tutorial2B { 

static AudioMediaPlayerComponent mediaPlayerComponent = null; 

public static void main(String[] args) { 

    mediaPlayerComponent = new AudioMediaPlayerComponent(); 
    mediaPlayerComponent.getMediaPlayer().playMedia("/home/sss.mp3"); 

    } 
} 

ответ

0

Удалены SwingUtilities вызовов. Игра теперь прекрасна.

0

Причина, по которой приложение-учебник работает, и ваше приложение с измененным звуковым проигрывателем не связано с сбором мусора.

В обоих примерах, когда вы делаете SwingUtilities.invokeLater(), и метод run() завершается, все ваше приложение выходит из сферы действия и становится пригодным для сбора мусора. Вы не сохраняете ссылку на класс приложения.

В случае примера приложения это нормально, потому что для создания пользовательского интерфейса Swing (JFrame) достаточно, чтобы приложение не было собрано мусором.

В случае вашего модифицированного приложения отсутствует пользовательский интерфейс Swing и, следовательно, ничего, что предотвратило бы сбор мусора. Фактически, в этом случае ваше приложение просто выйдет.

Я действительно удивлен, что вы говорите, что удаление использования SwingUtilities устраняет вашу проблему, так как я все еще ничего не вижу, что будет держать ваше приложение от сбора мусора. Когда я увижу приложение, подобное этому, я видел в Linux, он выйдет почти сразу, а в Windows он выйдет из непредсказуемого времени позже после того, как будет запущена сборка мусора.

Более надежное решение состоит в том, чтобы использовать что-то вроде join() в текущем потоке, чтобы предотвратить выход приложения или каким-либо иным образом сохранить ссылку на класс приложения, закрепленный, а затем, например, дождаться события медиаплеера " завершена "или" ошибка "перед прекращением действия приложения.

В «настоящих» приложениях такого рода вещи, как правило, не вызывает беспокойства, поскольку есть другие вещи, которые не позволяют вашему приложению собираться мусор (например, пользовательский интерфейс или какая-либо другая инфраструктура приложения).

+0

Спасибо за ваш ответ, Каприка. Я буду использовать join() в будущем. Я только что запустил музыкальный файл (без join()), и хотя музыка перестала воспроизводиться - программа все еще работает через 10 минут. Я использую Java 8 в Linux. – user465001

+0

может ли причина, по которой он все еще работает, состоять в том, что теперь у меня есть «AudioMediaPlayerComponent» как статический член? – user465001

+0

Я отредактировал свое оригинальное сообщение, чтобы показать, как он выглядел после того, как я удалил вызов SwingUtils. – user465001