繁体   English   中英

mediaPlayer.setSpu()无法正常工作

[英]mediaPlayer.setSpu() not working

目前,我正在研究一些基于VLCJ的代码来播放视频内容,效果还不错,但是我正在努力使setSpu()方法起作用。

只需提及,当要加载外部字幕时,除了视频文件外,其他文件都可以正常工作。 当我尝试播放媒体文件中包含的字幕时,出现问题。 (例如,包含在MKV文件中的字幕)。

我仔细阅读了GitHub帖子“ setSpu无法正常工作#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());
        }
    });

按下字幕按钮时,将获得以下输出:

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

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

如果可以将此问题归结为如何使用具有非ASCII字符的外部SPU文件,则可以尝试以下操作:

假设您的外部SPU文件有一些文件名,该文件名包含非ASCII字符,我们将此spuFileName称为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版本,如果轨道标识符对您不起作用,请尝试仅传递一个索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM