vlcj setPosition()/setTime() 什么都不做 - 我做错了什么?



非常感谢您帮助我完成这件看似微小的事情,但我无法理解。MP4视频/音频播放效果不错,但我无法设置视频中的位置。

这是我的精简代码:

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import javax.swing.JPanel;
import com.sun.jna.NativeLibrary;
import java.util.logging.Level;
import java.util.logging.Logger;
import uk.co.caprica.vlcj.binding.RuntimeUtil;
import uk.co.caprica.vlcj.player.base.ControlsApi;
import uk.co.caprica.vlcj.player.base.MediaApi;

import uk.co.caprica.vlcj.player.base.MediaPlayer;
import uk.co.caprica.vlcj.player.component.CallbackMediaPlayerComponent;
import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.component.callback.FilledCallbackImagePainter;
import uk.co.caprica.vlcj.player.component.callback.FixedCallbackImagePainter;
import uk.co.caprica.vlcj.player.component.callback.ScaledCallbackImagePainter;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.player.renderer.RendererItem;
import uk.co.caprica.vlcjplayer.event.TickEvent;
import uk.co.caprica.vlcjplayer.view.action.mediaplayer.MediaPlayerActions;

public class TestClass extends JPanel {
private EmbeddedMediaPlayerComponent ourMediaPlayer;
TestClass(){
//NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\Program Files\VideoLAN\VLC");
ourMediaPlayer = new EmbeddedMediaPlayerComponent();

/* Set the canvas */
Canvas c = new Canvas();
c.setBackground(Color.black);
c.setVisible(true);
/* Set the layout */
this.setLayout(new BorderLayout());
/* Add the canvas */
this.add(c, BorderLayout.CENTER);
this.setVisible(true);
this.add(ourMediaPlayer);

}
public void play() {
/* Play the video */

System.out.println("Starting...");  

ourMediaPlayer.mediaPlayer().controls().setPosition((float) 0.5); // NOPE
ourMediaPlayer.mediaPlayer().media().play("/home/manfred/ExtraDisk/Work/BTL/Movement2022/walking.mp4"); // works
ourMediaPlayer.mediaPlayer().controls().stop(); // works

ourMediaPlayer.mediaPlayer().controls().setPosition((float) 0.5); //NOPE

try { 
Thread.sleep(2000);
} catch (InterruptedException ex) {
Logger.getLogger(TestClass.class.getName()).log(Level.SEVERE, null, ex);
}
ourMediaPlayer.mediaPlayer().controls().setPosition((float) 0.5);  //NOPE
ourMediaPlayer.mediaPlayer().controls().setTime(2000); // NOPE
ourMediaPlayer.mediaPlayer().controls().start(); //works


//System.time.sleep(2);
System.out.println("Started!");  
try { 
Thread.sleep(2000);
} catch (InterruptedException ex) {
Logger.getLogger(TestClass.class.getName()).log(Level.SEVERE, null, ex);
}
ourMediaPlayer.mediaPlayer().controls().stop(); // works
}
}

通过.mediaPlayer((.media

不起作用的是.mediaPlayer((.controls((.setTime(xx(和.mediaPlayers((.cocontrols((.setPosition(xx(,基本上什么都没发生。

我在这儿干什么?这是线程问题吗?有人有任何可操作的最小示例吗?

再次感谢,非常感谢您的帮助!

在播放开始之前,无法使用API设置时间/位置。

LibVLC对许多操作异步操作。仅仅调用play((并不意味着播放已经开始,因此在调用play后立即设置时间/位置(总是(不起作用。

至少有两种方法可以使用:

  1. 等待媒体播放器"准备就绪";事件,并设置时间/位置(这将在每次媒体播放器准备就绪时触发一个事件,因此每次播放时都会触发,尽管如果您只想在第一次播放时注销,则可以编写一个一次性侦听器(
public static void main(String[] args) throws Exception {
MediaPlayer mediaPlayer = new MediaPlayerFactory().mediaPlayers().newMediaPlayer();
mediaPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void mediaPlayerReady(MediaPlayer mediaPlayer) {
mediaPlayer.controls().setTime(10000);
}
});
mediaPlayer.media().play("/home/movies/whatever.mp4");
Thread.currentThread().join();
}

使用第一种方法,您将看到在跳过之前渲染的一个或两个视频帧的风险很小。

  1. 使用媒体选项设置启动时间(以秒为单位,包括10.5等秒的分数(:
public static void main(String[] args) throws Exception {
MediaPlayer mediaPlayer = new MediaPlayerFactory().mediaPlayers().newMediaPlayer();
mediaPlayer.media().play("/home/movies/whatever.mp4", ":start-time=10");
Thread.currentThread().join();
}

多亏了capricca的巧妙见解,这个片段实际上是有效的(不知道为什么,但它确实有效——这就是目前最重要的(:

ourMediaPlayer.mediaPlayer().media().play("/home/manfred/ExtraDisk/Work/BTL/Movement2022/walking.mp4"); // works
ourMediaPlayer.mediaPlayer().controls().stop(); // works
ourMediaPlayer.mediaPlayer().controls().start(); // works
ourMediaPlayer.mediaPlayer().controls().setTime(5000); // WORKS

还是有点神秘,但我会接受的!

最新更新