侧载字幕在 ExoPlayer 中不起作用
Sideload subtitle not working in ExoPlayer
我正在尝试将字幕文件与我的视频一起加载,但它不起作用。
代码:
private MediaSource buildMediaSourceWithSubtitle(Uri uri, @Nullable String overrideExtension, Uri subtitle) {
Format subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.APPLICATION_SUBRIP, 0, null);
MediaSource subtitleSource = new SingleSampleMediaSource.Factory(dataSourceFactory).createMediaSource(subtitle, subtitleFormat, C.TIME_UNSET);
MediaSource mediaSource = null;
@ContentType int type = Util.inferContentType(uri, overrideExtension);
switch (type) {
case C.TYPE_DASH:
mediaSource = new DashMediaSource.Factory(dataSourceFactory).setManifestParser(
new FilteringManifestParser < >(new DashManifestParser(), getOfflineStreamKeys(uri))).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
case C.TYPE_SS:
mediaSource = new SsMediaSource.Factory(dataSourceFactory).setManifestParser(
new FilteringManifestParser < >(new SsManifestParser(), getOfflineStreamKeys(uri))).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
case C.TYPE_HLS:
mediaSource = new HlsMediaSource.Factory(dataSourceFactory).setPlaylistParserFactory(
new DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri))).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
case C.TYPE_OTHER:
mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
default:
{
throw new IllegalStateException("Unsupported type: " + type);
}
}
}
MediaSource videoSource = new ExtractorMediaSource(
videoUri,
dataSourceFactory,
new DefaultExtractorsFactory(),
null,
null);
Format subtitleFormat = Format.createTextSampleFormat(
null,
MimeTypes.APPLICATION_SUBRIP,
C.SelectionFlags,
"en");
MediaSource textMediaSource = new SingleSampleMediaSource(
Uri.parse("http://www.storiesinflight.com/js_videosub/jellies.srt"),
dataSourceFactory,
subtitleFormat,
C.TIME_UNSET);
source = new MergingMediaSource(videoSource, textMediaSource); // to be used later
// nested to some class that has SubtitleView as member
class SomeListener implements ..., TextRenderer.Output, ... {
...
// this function doesn't seem to be invoked
public void onCues(List cues) {
// some logging here
if (subtitleView != null) {
subtitleView.onCues(cues);
}
}
...
}
player.setTextOutput(listener);
...
// later, play the video assuming its prepared and whatnot
player.setPlayWhenReady(true);
在 Exoplayer 中 2.16.1
我使用了这段代码并且工作正常:
val subtitle = MediaItem.SubtitleConfiguration.Builder(srtUri)
.setMimeType(MimeTypes.APPLICATION_SUBRIP)
.setLanguage("en")
.setSelectionFlags(C.SELECTION_FLAG_DEFAULT)
.build()
val mediaItem = MediaItem.Builder()
.setUri(videoUrl)
.setSubtitleConfigurations(ImmutableList.of(subtitle))
.build()
player?.setMediaItem(mediaItem)
我正在尝试将字幕文件与我的视频一起加载,但它不起作用。
代码:
private MediaSource buildMediaSourceWithSubtitle(Uri uri, @Nullable String overrideExtension, Uri subtitle) {
Format subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.APPLICATION_SUBRIP, 0, null);
MediaSource subtitleSource = new SingleSampleMediaSource.Factory(dataSourceFactory).createMediaSource(subtitle, subtitleFormat, C.TIME_UNSET);
MediaSource mediaSource = null;
@ContentType int type = Util.inferContentType(uri, overrideExtension);
switch (type) {
case C.TYPE_DASH:
mediaSource = new DashMediaSource.Factory(dataSourceFactory).setManifestParser(
new FilteringManifestParser < >(new DashManifestParser(), getOfflineStreamKeys(uri))).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
case C.TYPE_SS:
mediaSource = new SsMediaSource.Factory(dataSourceFactory).setManifestParser(
new FilteringManifestParser < >(new SsManifestParser(), getOfflineStreamKeys(uri))).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
case C.TYPE_HLS:
mediaSource = new HlsMediaSource.Factory(dataSourceFactory).setPlaylistParserFactory(
new DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri))).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
case C.TYPE_OTHER:
mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
return new MergingMediaSource(mediaSource, subtitleSource);
default:
{
throw new IllegalStateException("Unsupported type: " + type);
}
}
}
MediaSource videoSource = new ExtractorMediaSource( videoUri, dataSourceFactory, new DefaultExtractorsFactory(), null, null); Format subtitleFormat = Format.createTextSampleFormat( null, MimeTypes.APPLICATION_SUBRIP, C.SelectionFlags, "en"); MediaSource textMediaSource = new SingleSampleMediaSource( Uri.parse("http://www.storiesinflight.com/js_videosub/jellies.srt"), dataSourceFactory, subtitleFormat, C.TIME_UNSET); source = new MergingMediaSource(videoSource, textMediaSource); // to be used later // nested to some class that has SubtitleView as member class SomeListener implements ..., TextRenderer.Output, ... { ... // this function doesn't seem to be invoked public void onCues(List cues) { // some logging here if (subtitleView != null) { subtitleView.onCues(cues); } } ... } player.setTextOutput(listener); ... // later, play the video assuming its prepared and whatnot player.setPlayWhenReady(true);
在 Exoplayer 中 2.16.1
我使用了这段代码并且工作正常:
val subtitle = MediaItem.SubtitleConfiguration.Builder(srtUri)
.setMimeType(MimeTypes.APPLICATION_SUBRIP)
.setLanguage("en")
.setSelectionFlags(C.SELECTION_FLAG_DEFAULT)
.build()
val mediaItem = MediaItem.Builder()
.setUri(videoUrl)
.setSubtitleConfigurations(ImmutableList.of(subtitle))
.build()
player?.setMediaItem(mediaItem)