如何在 android ExoPlayer 中显示字幕
How to show subtitle in android ExoPlayer
我正在使用 Exoplayer 进行流式传输 URL。
我想在 exoplayer 中添加 srt 文件。
但我认为播放器不支持srt文件
所以我把我的文件内容放在 1 个变量中。
如何在 android exoplayer 中显示字幕?
我得到了解决方案。
我使用 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();
}
}
之后在播放器中 activity 将字幕传递给尊敬的构建器,在此我将发送到 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 class 传递给 TrackRenderer,
// 构建调试渲染器。
TrackRenderer debugRenderer = debugTextView != null
? new DebugTrackRenderer(debugTextView, player, videoRenderer,context,subttl) : null;
并且在 DebugTrackRenderer class 的 运行 方法中使用下面的代码,
public void run() {
String data1 = subttl.getText(getCurrentPositionUs());
player.onText(String.valueOf(data1));
}
有点晚了,但它可能会帮助其他人使用已删除 DebugTrackRenderer 的 Exoplayer 1.5.1。
使用,
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);
它会成功的。
我正在使用 Exoplayer 进行流式传输 URL。 我想在 exoplayer 中添加 srt 文件。 但我认为播放器不支持srt文件 所以我把我的文件内容放在 1 个变量中。
如何在 android exoplayer 中显示字幕?
我得到了解决方案。
我使用 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();
}
}
之后在播放器中 activity 将字幕传递给尊敬的构建器,在此我将发送到 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 class 传递给 TrackRenderer, // 构建调试渲染器。
TrackRenderer debugRenderer = debugTextView != null
? new DebugTrackRenderer(debugTextView, player, videoRenderer,context,subttl) : null;
并且在 DebugTrackRenderer class 的 运行 方法中使用下面的代码,
public void run() {
String data1 = subttl.getText(getCurrentPositionUs());
player.onText(String.valueOf(data1));
}
有点晚了,但它可能会帮助其他人使用已删除 DebugTrackRenderer 的 Exoplayer 1.5.1。
使用,
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);
它会成功的。