-
Notifications
You must be signed in to change notification settings - Fork 247
KSYSubtitle
xinbaicheng edited this page Jul 10, 2017
·
2 revisions
播放器支持播放内嵌与外挂
的文本字幕(ASS、SRT)
播放器主要负责字幕的解析及与视频的同步,字幕的渲染需要由业务方负责
播放SDK:v2.0.1及以上
仅点播库支持文本字幕的播放,直播库不支持,点播库与直播库的区别可参考 Wiki
- 添加外挂字幕
/**
* 设置外挂字幕的路径,播放器会打开并解码外挂字幕
* 若已经打开过某外挂字幕,则会先关闭前一个外挂字幕,再打开当前字幕
* @param path 外挂字幕路径
*/
@Override
public void addTimedTextSource(String path)
- 内嵌字幕
视频内嵌有ASS、SRT文本字幕时,播放器会默认解析第一个字幕流
- 字幕回调监听器
一条字幕有起始展示时间点与展示时长,当某字幕需要被展示或者展示结束时都有此回调
// 字幕回调监听器的定义
IMediaPlayer {
/**
* 字幕监听器
* @param IMediaPlayer 播放器
* @param text 字幕需要展示时为字幕内容,字幕展示结束时为 空("")
*/
interface OnTimedTextListener {
void onTimedText(IMediaPlayer mp, String text);
}
// 设置文本字幕回调监听器
void setOnTimedTextListener(OnTimedTextListener listener);
}
- 获取流信息
当调用接口addTimedTextSource
之后,播放器会新增关于该外挂字幕的流信息,具体可参见如下代码
KSYTextureView mKsyTextureView;
// 获取当前流信息
KSYTrackInfo[] trackInfos = mKsyTextureView.getTrackInfo();
for (KSYTrackInfo info : trackInfos) {
switch(info.getTrackType()) {
case ITrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT:
Log.d("KSYMediaPlayer", "内嵌字幕");
break;
case ITrackInfo.MEDIA_TRACK_TYPE_EXTERNAL_TIMEDTEXT:
Log.d("KSYMediaPlayer", "外挂字幕");
break;
}
}
- 其他相关接口
/**
* 开启某(视频、音频、字幕)流
* @param trackIndex 流索引
*/
public void selectTrack(int trackIndex)
/**
* 关闭某(视频、音频、字幕)流
* @param trackIndex 流索引
*/
public void deselectTrack(int trackIndex)
- 添加/切换外挂字幕
KSYTextureView mKsyTextureView;
TextView mTimedText;//在屏幕显示字幕
String externalSubtitlePath = "/mnt/sdcard/just_for_example.ass";
String externalSubtitlePath2 = "/mnt/sdcard/just_for_example2.srt";
// 设置字幕监听器
mKsyTextureView.setOnTimedTextListener(new IMediaPlayer.OnTimedTextListener {
@Override
public void onTimedText(IMediaPlayer mp, String text) {
if (mTimedText != null)
mTimedText.setText(text);
}
});
// 添加外挂字幕
mKsyTextureView.addTimedTextSource(externalSubtitlePath);
// ...
// 切换外挂字幕
mKsyTextureView.addTimedTextSource(externalSubtitlePath2);
- 关闭外挂字幕 若视频有内嵌字幕,在关闭外挂字幕后,默认不会展示内嵌字幕
KSYTextureView mKsyTextureView;
// 获取当前流信息
KSYTrackInfo[] trackInfos = mKsyTextureView.getTrackInfo();
for (KSYTrackInfo info : trackInfos) {
switch(info.getTrackType()) {
case ITrackInfo.MEDIA_TRACK_TYPE_EXTERNAL_TIMEDTEXT:
mKsyTextureView.deselectTrack(info.getTrackIndex());
break;
}
}
- 外挂字幕切换至内嵌字幕
KSYTextureView mKsyTextureView;
int mInternalSubtitleIndex = -1;
int mExternalSubtitleIndex = -1;
// 获取当前流信息
KSYTrackInfo[] trackInfos = mKsyTextureView.getTrackInfo();
for (KSYTrackInfo info : trackInfos) {
switch(info.getTrackType()) {
case ITrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT:
mInternalSubtitleIndex = info.getTrackIndex();
break;
case ITrackInfo.MEDIA_TRACK_TYPE_EXTERNAL_TIMEDTEXT:
mExternalSubtitleIndex = info.getTrackIndex();
break;
}
}
// 务必请先关闭外挂字幕,再打开内嵌字幕
mKsyTextureView.deselectTrack(mExternalSubtitleIndex);
mKsyTextureView.selectTrack(mInternalSubtitleIndex);