2

目前我正在编写一些基于 VLCJ 的代码来播放视频内容,这工作得很好,但我正在努力使 setSpu() 方法工作。

顺便提一下,在加载外部字幕时,在视频文件之外的文件中,它工作正常。当我尝试播放媒体文件中包含的字幕时出现问题。(例如包含在 MKV 文件中的潜艇)。

我仔细阅读了 GitHub 帖子“setSpu not working #278 ”,我认为问题可能在于我没有正确调用 setSpu() 方法。

为了简单起见,我试图使其适用于示例“uk.co.caprica.vlcj.test.basic.TestPlayer”。

在 TestPlayer.java 类上,我加载了所有原生 vlc 所需的库并配置了 mediaPath 和 mediaPlayer,所以如果我执行该类,媒体播放器就会正确构建,并且视频开始播放。

现在,为了尝试制作字幕,我在“PlayerControlsPanel.java”上重用了“subTitlesButton”按钮。首先,由于要设置的spu是TrackDescription的ID,所以我添加了如下代码,执行得到spuDescriptions列表:

subTitlesButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            System.out.println(mediaPlayer.getSpuDescriptions());
        }
    });

当按下 Sub-titles 按钮时,得到以下输出:

spuDescriptions=[TrackDescription[id=-1,description=Deshabilitar], TrackDescription[id=3,description=Pista 1 - [Español]], TrackDescription[id=4,description=Pista 2 - [Inglés]], TrackDescription[id=5,description=Pista 3 - [Español]]]

因此,为了简单起见,我只是尝试添加以下代码并执行它:

subTitlesButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            System.out.println(mediaPlayer.getSpuDescriptions());
            mediaPlayer.setSpu(3); // TrackDescription[id=3,description=Track 1 - [Spanish]]
        }
    });

预期的结果将是 ID=3 的副标题“Track 1 - [Spanish]”出现在屏幕上,但没有任何反应。视频继续播放并正常播放,但未显示副标题。

所有其他按钮,当您按下它们时工作正常,您会得到预期的结果(暂停、停止、播放、快进、倒带等)......所以我不明白为什么 media.setSpu() 不是在那里工作。

非常感谢一些帮助:) 在此先感谢。

编辑确切的问题是媒体文件(video.mkv)中包含的所有字幕都是UTF8文本编码的。我尝试使用 mkvmerge 重新挂载 video.mkv 文件,但是这个程序总是将 SRT 文件转换为 UTF8 文本格式。 解决方法将 SRT 文件转换为 ASS 字幕格式。如果 video.mkv 包含 .ASS 字幕格式,则字幕始终由 VLC 正确加载,也由 vlcj 库正确加载。

非常感谢您提供的所有帮助。

4

1 回答 1

0

如果这个问题可以归结为如何使用带有非 ASCII 字符的外部 SPU 文件,你可以试试这个:

假设您的外部 SPU 文件有一些文件名,该文件名包含非 ASCII 字符,我们称之为spuFileName...

尝试:

String asciiFileName = new File(spuFileName)
    .toURI()
    .toASCIIString();

或者:

String asciiFileName = new File(spuFileName)
    .toURI()
    .toASCIIString()
    .replaceFirst("file:/", "file:///");

然后asciiFileName在为 vlcj 指定 SPU 文件时使用。

如果我没记错的话,LibVLC 在其 API 上需要 ASCII 字符串。如果您尝试播放文件名包含非 ASCII 字符的视频,也会出现此问题(vlcj 检测到并自动处理)。

但我不确定这是否真的是你的问题,因为你发布的部分日志看起来 VLC 确实正确检测到了 SPU 轨道。

另一方面,如果此建议确实有效,则可以更改 vlcj 以自动处理这种情况(外部 SPU 文件)。

在实际选择 SPU 进行显示时,无论 SPU 是在单独的文件中还是包含在视频本身中,唯一重要的是 SPU 轨道的 id。vlcj 将此 id 直接传递给 LibVLC API 方法。轨道描述字符串没有被直接编码这一事实并不重要。

在早期版本的 VLC 中,这个 id 实际上是 SPU 轨道的索引- 所以 0、1、2、3 等等。

对于当前版本的 VLC(这在 2013 年 2 月左右发生了变化,我认为这意味着 VLC 2.1+),这已修复为使用实际的 SPU 轨道标识符。

因此,根据您的 VLC 版本,如果轨道标识符对您不起作用,请尝试仅传递索引。

于 2015-01-08T12:57:17.373 回答