java - 调整 VLCJ PixelWriter 的大小

标签 java javafx vlcj

VLCJ 的标准问题是如何为 JavaFX 获取可调整大小的视频......没有此功能的原因是什么。我已经为此工作了几天,任何帮助将不胜感激......

            @Override
            public void display(DirectMediaPlayer mp, Memory[] memory, final BufferFormat bufferFormat) {
                final int renderFrameNumber = frameNumber.incrementAndGet();
                currentByteBuffer.set(memory[0].getByteBuffer(0,memory[0].size()));
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        ByteBuffer byteBuffer = currentByteBuffer.get();
                        int actualFrameNumber = frameNumber.get();
                        if (renderFrameNumber == actualFrameNumber) {
                            canvas.getPixelWriter().setPixels(0, 0,
                                    bufferFormat.getWidth(),
                                    bufferFormat.getHeight(),
                                    byteBgraInstance, byteBuffer,
                                    bufferFormat.getPitches()[0]);
                        } else {
                            System.out.println("[FINE] "
                                    + " - Skipped late frame "
                                    + renderFrameNumber
                                    + " (actual = "
                                    + actualFrameNumber + ")");
                        }
                    }
                });
            }

我几乎可以获取原始尺寸的视频,但无法缩放或调整大小以适应其他任何内容。有没有人有使用 PixelWriter 并将其第二次复制到缩放图像或任何东西的经验?

最佳答案

不幸的是,使用 vlcj 的 JavaFX 方法需要所谓的“直接渲染”媒体播放器(正如您在问题中使用的那样)。

此直接渲染媒体播放器使用 LibVLC 的视频渲染回调来为您的应用程序提供视频的每一帧,以它认为合适的任何方式进行渲染。

原生 API 的工作方式是,您必须首先提供回调来设置所需的视频缓冲区格式 - 这包括图片格式,还包括您想要的视频缓冲区的宽度和高度。

在视频开始播放之前会调用此 native 回调一次,并且不会再次调用(除非您停止视频播放并重新开始)。

显然,这意味着一旦播放开始, native 视频缓冲区尺寸就固定,并且无法动态调整大小。

这回答了您问题的第一部分,即为什么该功能不存在 - 底层 native 库根本不支持它。

vlcj 为您提供的是对“原始” native 视频缓冲区的访问,然后由您决定如何渲染它 - 无论您使用 BufferedImage、OGL 纹理还是 PixelWriter。如果您需要支持的话,也取决于您如何扩展它。当然,软件扩展会增加 CPU 负载。

关于你问题的第二部分,我真的无法提供更多建议。

与您的具体问题无关...但是在查看您发布的代码后,我不确定您那里的同步语义 - 在您的“run()”方法中,我看不到任何东西可以阻止 native 视频缓冲区被覆盖。 Java8 所需的最新版本的 vlcj-javafx 演示项目使用新的 native 缓冲区锁定/解锁方法,应使用该方法来提供正确的同步。

关于java - 调整 VLCJ PixelWriter 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27716551/

相关文章:

java - 无法运行 mvn clean

java - 如何在 Hippo CMS 模板中检查是否为空并显示富文本字段 (HTML)

java - 将文本附加到文本区域,但将插入符号位置设置为行尾

JavaFX 组合框 CSS 样式

java - VLCJ 中的流式桌面

java - 连续播放同一视频的 2 个不同部分

java - VLCJ 保存媒体播放器捕获

java - 在 application.yml 中设置根日志级别

java - Android程序崩溃空指针异常

java - 平滑地改变JavaFX效果