Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mediaPlayer.setSpu()不工作_Java_Vlcj_Spu - Fatal编程技术网

Java mediaPlayer.setSpu()不工作

Java mediaPlayer.setSpu()不工作,java,vlcj,spu,Java,Vlcj,Spu,目前,我正在编写一些基于VLCJ的代码来播放视频内容,这些代码工作得很好,但我正在努力使setSpu()方法正常工作 只需提到,当加载一个外部字幕时,除了视频文件外,它还可以加载一个文件。当我尝试播放媒体文件中包含的字幕时,问题出现了。(例如,包含在MKV文件中的潜艇) 我仔细阅读了GitHub发布的“setSpu不工作”,我认为问题可能在于我没有正确调用setSpu()方法 为了简单起见,我试图让它在示例“uk.co.caprica.vlcj.test.basic.TestPlayer”上工作

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

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

我仔细阅读了GitHub发布的“setSpu不工作”,我认为问题可能在于我没有正确调用setSpu()方法

为了简单起见,我试图让它在示例“uk.co.caprica.vlcj.test.basic.TestPlayer”上工作

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

现在,为了让字幕工作起来,我重用了“PlayerControlsPanel.java”上的“subTitlesButton”按钮。首先,由于要设置的spu是TrackDescription的ID,因此我添加了以下代码,并执行以获得spu描述列表:

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

            System.out.println(mediaPlayer.getSpuDescriptions());
        }
    });
按下子标题按钮时,将获得以下输出:

spusdescription=[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-[西班牙语]”,但什么也没发生。视频将继续播放并正常播放,但未显示子标题

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

非常感谢您的帮助:) 提前谢谢

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


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

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

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

尝试:

或:

然后,在为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版本,如果曲目标识符不适用于您,请尝试只传递一个索引。

(1)当涉及媒体文件本身或加载的外部字幕(例如and.ssa或.srt文件)时,它工作正常,我使用“mediaPlayer.setSubTitleFile(新文件()D:\\which_path_not_nonASCIIchars\\sub_not_nonASCIIchars.srt”);“屏幕上会显示字幕,因为它可以按照您在回答中提到的方式处理,也可以跳过文件名上的nonASCII字符。(2)但当我要设置的字幕包含在媒体文件中时,会出现问题(例如,一个包含多个字幕、音频曲目等的.mkv文件)。所有字幕曲目似乎都被检测到,正如上面示例中getSpuDescriptions()给出的输出跟踪所示,但字幕没有出现在屏幕上。(3)我检测到媒体文件(.mkv.g.)中的字幕是根本原因,格式为UTF8会引起问题的暴露。有没有办法处理这个问题,所以尽管它们是UTF8,但可以在屏幕上正确播放和显示?或者,如果媒体文件中的subs.srt是UTF8,就不可能使它们工作?这是对vlcj libs的限制?因为我在VLC中打开了同一个媒体文件,并且我可以load字幕,但不是vlcj。你有没有任何媒体示例可以与我分享以进行测试?提前感谢。(4)只是记下,当我将字幕作为文件加载时,它工作正常(我假设它是ASCII),当我不想设置的字幕在媒体文件中时(如果我用程序打开媒体文件),问题就会出现“MediaInfo”,它清楚地显示SUB在那里是UTF8,所以问题就出现了。”“VLC-H”显示--subsdec-AUTODECT-UTF8”,但默认情况下应该启用它。您可以尝试通过MediaPlayerFactor传递该开关
String asciiFileName = new File(spuFileName)
    .toURI()
    .toASCIIString();
String asciiFileName = new File(spuFileName)
    .toURI()
    .toASCIIString()
    .replaceFirst("file:/", "file:///");