如何正确示例化vlcj mediaplayer的像素缓冲区

dsf9zpds  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(317)

我目前有问题,让vlcj 4旋转了一个视频。我可以让应用程序运行,但似乎遇到了一个问题 videoPixelBuffer 没有示例化。下面的代码来自主页上的pixelbuffer教程。我一直试图理解它是如何的函数,但看不到示例化 videoPixelBuffer 有人打过电话。我试图手动调用它也没有工作。我认为问题在于 videoPixelBuffer ,但无法找到解决此问题的方法。
有什么想法吗?
下面你会看到我正在使用的代码和我得到的错误消息。下面是演示的github repo的链接(https://github.com/caprica/vlcj-javafx/blob/pixelbuffer-test/src/test/java/uk/co/caprica/vlcj/javafx/test/writableimagedemo.java)
版本:
vlcj 4.1.0版本
阀控3.0.8
开放JDK 13
开放JFX 13
代码:

  1. package player;
  2. import java.nio.ByteBuffer;
  3. import javafx.application.Application;
  4. import javafx.application.Platform;
  5. import javafx.scene.Scene;
  6. import javafx.scene.image.ImageView;
  7. import javafx.scene.image.PixelBuffer;
  8. import javafx.scene.image.PixelFormat;
  9. import javafx.scene.image.WritableImage;
  10. import javafx.scene.layout.StackPane;
  11. import javafx.stage.Stage;
  12. import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
  13. import uk.co.caprica.vlcj.player.base.MediaPlayer;
  14. import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
  15. import uk.co.caprica.vlcj.player.embedded.videosurface.CallbackVideoSurface;
  16. import uk.co.caprica.vlcj.player.embedded.videosurface.VideoSurfaceAdapters;
  17. import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormat;
  18. import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormatCallback;
  19. import uk.co.caprica.vlcj.player.embedded.videosurface.callback.RenderCallback;
  20. import uk.co.caprica.vlcj.player.embedded.videosurface.callback.format.RV32BufferFormat;
  21. public class Test extends Application {
  22. private MediaPlayerFactory mediaPlayerFactory;
  23. private EmbeddedMediaPlayer embeddedMediaPlayer;
  24. private WritableImage videoImage;
  25. private PixelBuffer<ByteBuffer> videoPixelBuffer;
  26. private ImageView videoImageView;
  27. @Override
  28. public void init() {
  29. mediaPlayerFactory = new MediaPlayerFactory();
  30. embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer();
  31. embeddedMediaPlayer.videoSurface().set(new FXCallbackVideoSurface());
  32. }
  33. @Override
  34. public final void start(Stage primaryStage) throws Exception {
  35. StackPane root = new StackPane();
  36. root.setStyle("-fx-background-color: black;");
  37. videoImageView = new ImageView();
  38. videoImageView.setPreserveRatio(true);
  39. videoImageView.fitWidthProperty().bind(root.widthProperty());
  40. videoImageView.fitHeightProperty().bind(root.heightProperty());
  41. root.getChildren().add(videoImageView);
  42. Scene scene = new Scene(root, 1200, 675);
  43. primaryStage.setScene(scene);
  44. primaryStage.show();
  45. String mrl = getParameters().getRaw().get(0);
  46. embeddedMediaPlayer.media().play(mrl);
  47. }
  48. @Override
  49. public final void stop() throws Exception {
  50. embeddedMediaPlayer.controls().stop();
  51. embeddedMediaPlayer.release();
  52. mediaPlayerFactory.release();
  53. }
  54. private class FXCallbackVideoSurface extends CallbackVideoSurface {
  55. FXCallbackVideoSurface() {
  56. super(new FXBufferFormatCallback(), new FXRenderCallback(), true, VideoSurfaceAdapters.getVideoSurfaceAdapter());
  57. }
  58. }
  59. private class FXBufferFormatCallback implements BufferFormatCallback {
  60. private int sourceWidth;
  61. private int sourceHeight;
  62. @Override
  63. public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
  64. this.sourceWidth = sourceWidth;
  65. this.sourceHeight = sourceHeight;
  66. return new RV32BufferFormat(sourceWidth, sourceHeight);
  67. }
  68. public void allocatedBuffers(ByteBuffer[] buffers) {
  69. assert buffers[0].capacity() == sourceWidth * sourceHeight * 4;
  70. PixelFormat<ByteBuffer> pixelFormat = PixelFormat.getByteBgraPreInstance();
  71. videoPixelBuffer = new PixelBuffer<>(sourceWidth, sourceHeight, buffers[0], pixelFormat);
  72. videoImage = new WritableImage(videoPixelBuffer);
  73. videoImageView.setImage(videoImage);
  74. }
  75. }
  76. private class FXRenderCallback implements RenderCallback {
  77. @Override
  78. public void display(MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers, BufferFormat bufferFormat) {
  79. Platform.runLater(() -> {
  80. videoPixelBuffer.updateBuffer(pb -> null);
  81. });
  82. }
  83. }
  84. public static void main(String[] args) {
  85. launch(args);
  86. }
  87. }
  88. class WritableImageDemoLauncher {public static void main(String[] args) {Test.main(args);}}

错误消息:

  1. Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
  2. at player.Test$FXRenderCallback.lambda$0(Test.java:110)
  3. at javafx.graphix/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
  4. at java.base/java.security.AccessController.doPrivileged(AcessController.java:391)
  5. at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
  6. at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:92)
  7. at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
  8. at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(WinApplication.java:174)
  9. at java.base/java.lang.Thread.run(Thread.java:830)

测试。java:110 is 以下行: videoPixelBuffer.updateBuffer(pb -> null);

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题