如何在Android ExoPlayer中显示字幕

时间:2015-06-23 05:07:46

标签: android exoplayer

我正在使用Exoplayer进行流媒体网址。 我想在exoplayer中添加srt文件。 但我认为播放器不支持srt文件 所以我将文件内容放在1个变量中。

如何在android exoplayer中显示字幕?

3 个答案:

答案 0 :(得分:5)

有点晚了,但它可能会帮助其他人使用Exoplayer 1.5.1,其中DebugTrackRenderer已被删除。

使用,

DataSource textDataSource = new DefaultUriDataSource(context, bandwidthMeter, userAgent);
    SingleSampleSource textSampleSource = new SingleSampleSource(subTitleUrl, textDataSource,
          MediaFormat.createTextFormat(MediaFormat.NO_VALUE,MimeTypes.APPLICATION_SUBRIP, MediaFormat.NO_VALUE, TrackRenderer.MATCH_LONGEST_US, null));
    TrackRenderer textRenderer = new TextTrackRenderer(textSampleSource, player,
          player.getMainHandler().getLooper());

上面的代码将subTitleUrl传递给SingleSampleSource。

然后只启用默认启用的TextTrackRenderer,

player.setSelectedTrack(YourPlayer.TYPE_TEXT,YourPlayer.TRACK_DEFAULT);

它会做到这一点。

答案 1 :(得分:2)

我得到了解决方案。 我使用TimedTextFileFormat将srt文件转换为TTML文件 下面是我将srt转换为TTML的代码,

private Subtitle subttl;

private void parseSubtitile(String subtitle) {

// subtitle is the srt file content
            // TODO Auto-generated method stub
            // StringBuilder buf = new StringBuilder();

InputStream json = null;
json = null;
        json = new ByteArrayInputStream(subtitle.getBytes());
    // FormatTTML formate = new FormatTTML();
    InputStream is = null;
    try {
        // TimedTextObject ttmlObj=formate.parseFile("Testing", json);
        TimedTextFileFormat ttff = new FormatSRT();
        TimedTextObject tto = ttff.parseFile("Test", json);
        // IOClass.writeFileTxt("test1", tto.toTTML());

        String data = tto.toTTML();
        is = new ByteArrayInputStream(data.getBytes());
        Log.d("web", data.toString());
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (FatalParsingException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    TtmlParser parser = new TtmlParser();
    try {
        subttl = parser.parse(is, null, 0);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

之后在玩家活动中将副标题传递给受尊重的构建者,在此我发送给HlsRendererBuilder。

private RendererBuilder getRendererBuilder() {
        String userAgent = Util.getUserAgent(this, "ExoPlayerDemo");
        switch (contentType) {

    case DemoUtil.TYPE_HLS:
        return new HlsRendererBuilder(this, userAgent,
                contentUri.toString(), debugTextView, audioCapabilities,
                    subttl);
}

从HlsRendererBuilder类传递给TrackRenderer, //构建调试渲染器。

TrackRenderer debugRenderer = debugTextView != null
    ? new DebugTrackRenderer(debugTextView, player, videoRenderer,context,subttl) : null;

在runTrackRenderer类的run方法中使用下面的代码,

public void run() {
    String data1 = subttl.getText(getCurrentPositionUs());

    player.onText(String.valueOf(data1));


} 

答案 2 :(得分:0)

ExoPlayer中的字幕正在进行中

正如the 1.4.0 release所述:

  

(WorkInProgress) - 支持样式+定位字幕的第一步。