簡體   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