Skip to content

KSYSubtitle

xinbaicheng edited this page Jul 10, 2017 · 2 revisions

字幕

播放器支持播放内嵌与外挂文本字幕(ASS、SRT)
播放器主要负责字幕的解析及与视频的同步,字幕的渲染需要由业务方负责

版本要求

播放SDK:v2.0.1及以上
仅点播库支持文本字幕的播放,直播库不支持,点播库与直播库的区别可参考 Wiki

相关接口

  1. 添加外挂字幕
/**
 * 设置外挂字幕的路径,播放器会打开并解码外挂字幕
 * 若已经打开过某外挂字幕,则会先关闭前一个外挂字幕,再打开当前字幕
 * @param path 外挂字幕路径
 */
@Override
public void addTimedTextSource(String path)
  1. 内嵌字幕

视频内嵌有ASS、SRT文本字幕时,播放器会默认解析第一个字幕流

  1. 字幕回调监听器

一条字幕有起始展示时间点与展示时长,当某字幕需要被展示或者展示结束时都有此回调

// 字幕回调监听器的定义
IMediaPlayer {
    /**
     * 字幕监听器
     * @param IMediaPlayer 播放器
     * @param text 字幕需要展示时为字幕内容,字幕展示结束时为 空("")
     */
    interface OnTimedTextListener {
        void onTimedText(IMediaPlayer mp, String text);
    }

    // 设置文本字幕回调监听器
    void setOnTimedTextListener(OnTimedTextListener listener);
}
  1. 获取流信息

当调用接口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;
    }
}
  1. 其他相关接口
/**
 * 开启某(视频、音频、字幕)流
 * @param trackIndex 流索引
 */
public void selectTrack(int trackIndex)

/**
 * 关闭某(视频、音频、字幕)流
 * @param trackIndex 流索引
 */
public void deselectTrack(int trackIndex)

示例代码

  1. 添加/切换外挂字幕
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);
  1. 关闭外挂字幕 若视频有内嵌字幕,在关闭外挂字幕后,默认不会展示内嵌字幕
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;
    }
}
  1. 外挂字幕切换至内嵌字幕
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);
Clone this wiki locally