Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество

Видео

Опубликованно: 09.05.2017, 21:05
Последняя редакция, Andry: 01.10.2017 21:41

Актуальные темы форума:

Я создал MovieAppState, поэтому вам не нужно

Новости о воспроизведении видео на jme?

YUNPM — a Java Media Player (java-gaming.org)

GstLWJGL (java-gaming.org)

GL Media Player (jogamp.org)

Xuggler

Этот API устарел.

JMonkeyEngine поддерживает видео Jheora Ogg (com.jme3.video).

Полный пример кода здесь: TestVideoPlayer.java

Вы создаете либо входной поток файла для загрузки видео с жесткого диска:

FileInputStream  fis = new FileInputStream("E:\\my_bunny.ogg");

Или вы транслируете видео в прямом эфире из веб-сайта:

InputStream fis = new URL("http://server/my_video.ogg").openStream();

Установка в очередь кадров со значением выше 5 (videoQueue = new VQueue(5);) сделает веб-потоковое воспроизведение более плавным засчет памяти. Вот пример потоковой передачи видео в контексте:

    private void createVideo(){
        try {
            InputStream fis = new URL("http://mirrorblender.top-ix.org/peach/"+
            "bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg").openStream();
            videoQueue = new VQueue(5);               // потоковое качество и память
            decoder = new AVThread(fis, videoQueue);
            videoThread = new Thread(decoder, "Jheora Video Decoder");
            videoThread.setDaemon(true);
            videoThread.start();
            masterClock = decoder.getMasterClock();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

Для воспроизведения звука используйте метод simpleUpdate():

    @Override
    public void simpleUpdate(float tpf){
        if (source == null){
            if (decoder.getAudioStream() != null){
                source = new AudioNode(decoder.getAudioStream(), null);
                source.setPositional(false);
                source.setReverbEnabled(false);
                audioRenderer.playSource(source);
            }else{
                // раскомментируйте это заявление что бы иметь возможность воспроизводить видео 
                // без звука.
                return;
            }
        }

        if (waitTime > 0){
            waitTime -= tpf;
            if (waitTime > 0)
                return;
            else{
                waitTime = 0;
                drawFrame(frameToDraw);
                frameToDraw = null;
            }
        }else{
            VFrame frame;
            try {
                frame = videoQueue.take();
            } catch (InterruptedException ex){
                stop();
                return;
            }
            if (frame.getTime() < lastFrameTime){
                videoQueue.returnFrame(frame);
                return;
            }

            if (frame.getTime() == -2){
                // конец потока
                System.out.println("End of stream");
                stop();
                return;
            }

            long AV_SYNC_THRESHOLD = 1 * Clock.MILLIS_TO_NANOS;

            long delay = frame.getTime() - lastFrameTime;
            long diff = frame.getTime() - masterClock.getTime();
            long syncThresh = delay > AV_SYNC_THRESHOLD ? delay : AV_SYNC_THRESHOLD;

            // если разница больше 1 секунды, синхронизируйте.
            if (Math.abs(diff) < Clock.SECONDS_TO_NANOS){
                if(diff <= -syncThresh) {
                  delay = 0;
                } else if(diff >= syncThresh) {
                  delay = 2 * delay;
                }
            }

            System.out.println("M: "+decoder.getSystemClock().getTimeSeconds()+
                               ", V: "+decoder.getVideoClock().getTimeSeconds()+
                               ", A: "+decoder.getAudioClock().getTimeSeconds());

            if (delay > 0){
                waitNanos(delay);
                drawFrame(frame);
            }else{
                videoQueue.returnFrame(frame);
                lastFrameTime = frame.getTime();
            }
        }
    }

Вспомогательные методы:

    private void drawFrame(VFrame frame){
        Image image = frame.getImage();
        frame.setImage(image);
        picture.setTexture(assetManager, frame, false);

        // заметка: это вынуждает рендера немедленно загрузить кадр,
        // так как он будет возвращен в пул очереди видеоданных
        // который может быть использован повторно.
        renderer.setTexture(0, frame);
        videoQueue.returnFrame(frame);
        lastFrameTime = frame.getTime();
    }
    private void waitNanos(long time){
        long millis = (long) (time / Clock.MILLIS_TO_NANOS);
        int nanos   = (int) (time - (millis * Clock.MILLIS_TO_NANOS));

        try {
            Thread.sleep(millis, nanos);
        }catch (InterruptedException ex){
            stop();
            return;
        }
    }

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.