mediaPlayer.setSpu()不起作用

时间:2015-01-06 19:41:07

标签: java vlcj spu

目前我正在研究一些基于VLCJ的代码来播放视频内容,这种方法工作得非常好,但是我很难努力使setSpu()方法有效。

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

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

为了简单起见,我试图让它适用于“uk.co.caprica.vlcj.test.basic.TestPlayer”这个例子。

在TestPlayer.java类中,我加载了所有本机vlc所需的lib并配置了mediaPath和mediaPlayer,因此如果我执行该类,则媒体播放器构建正确,视频开始播放。

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

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

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

按下子标题按钮时,以下输出为:

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 libs正确加载。

提前感谢所提供的所有帮助。

1 个答案:

答案 0 :(得分:0)

如果可以将这个问题简化为如何使用非ASCII字符的外部SPU文件,可以试试这个:

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

尝试:

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

或者:

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

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

如果我没记错的话,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版本,如果曲目标识符不起作用,请尝试仅传递索引。