Skip to content

subtitle

shixuemei edited this page Jul 29, 2017 · 3 revisions

字幕

播放器支持文本格式(ASS, ART)的内嵌和外挂字幕,其中播放器负责字幕的解析与音视频的同步,字幕的渲染需要由用户负责

v2.5.2及以上的点播库版本可支持该功能

1. 相关接口

1.1 开启关闭字幕

- (void) setTrackSelected:(NSInteger)trackIndex selected:(BOOL)selected;
  • trackIndex - 媒体轨道的stream index,字幕的媒体轨道信息可以通过getMetadata方法获取
  • selected - 开启/关闭指定媒体轨道

1.2 添加外挂字幕

- (void)setExtSubtitleFilePath:(NSString *)subtitleFilePath;
  • subtitleFilePath - 本地字幕文件路径

1.3 字幕回调消息

字幕有起始展示时间点和展示时长,当字幕需要被展示或者展示结束时都发送MPMoviePlayerPlaybackTimedTextNotification消息,其字幕内容存在于userInfo字典的MPMoviePlayerPlaybackTimedTextUserInfoKey关键字中;字幕展示结束时其内容为空("")。

2. 说明

  • 如果当前播放的是外挂字幕,关闭外挂字幕后,默认不会展示内嵌字幕
  • meta信息中内嵌字幕与外挂字幕的type类型不同,内嵌字幕类型为"subtitle",外挂字幕为"external_timed_text"
  • 可通过- (NSDictionary *)getMetadata:(MPMovieMetaType)metaType方法获得当前使用的字幕轨道信息
  • 如果当前播放的是外挂字幕,调用- (NSDictionary *)getMetadata方法得到的meta信息中会含有当前播放外挂字幕信息,关闭外挂字幕时调用该方法无此信息
  • 字幕轨道切换
    • 内嵌字幕切换到内嵌字幕:可直接调用[player setTrackSelected:selectedSubIdx selected:YES]播放选择的内嵌字幕
    • 内嵌字幕切换到外挂字幕:可直接调用[player setExtSubtitleFilePath:subtitleFilePath]播放选择的外挂字幕
    • 外挂字幕切换到内嵌字幕:必须要先调用[player setTrackSelected:currentSubIdx selected:NO]关闭当前播放的外挂字幕,再调用[player setTrackSelected:selectedSubIdx selected:YES]播放选择的内嵌字幕

3. 调用示例

3.1 切换内嵌字幕

int stream_index = -1;
int subtitle_index = 0;
int wanted_index = 2; //切换到第二个字幕

NSDictionary *meta = [_player getMetadata];
NSMutableArray *streams = [meta objectForKey:kKSYPLYStreams];
for(NSDictionary *stream in streams)
{
	//查找当前播放文件的所有字幕流
    if([[stream objectForKey:kKSYPLYStreamType] isEqualToString:@"subtitle"])
    {
        if(subtitle_index == wanted_index)
        {
        	//获取第二个字幕的stream_index
            stream_index = (int)[[stream objectForKey:kKSYPLYStreamIndex] integerValue];
            break;
         }
         subtitle_index++;
     }
}

//切换到第二个字幕
if(stream_index >= 0)
    [_player setTrackSelected:stream_index selected:YES];
}

3.2 添加外挂字幕

NSString *subtitlePath = [NSString stringWithFormat:@"%@%s", NSHomeDirectory(), "/Documents/subtitle.srt"];
[_player setExtSubtitleFilePath:subtitleFilePath];

3.3 关闭字幕

内嵌/外挂字幕均使用此方法关闭

//获取当前播放的字幕轨道的meta
NSDictionary *subtitleMeta = [_player getMetadata:MPMovieMetaType_Subtitle];
//传入当前字幕流的stream_index来关闭字幕
[_player setTrackSelected:[[subtitleMeta objectForKey:kKSYPLYStreamIndex] integerValue] selected:NO];
Clone this wiki locally