-
Notifications
You must be signed in to change notification settings - Fork 146
subtitle
shixuemei edited this page Aug 3, 2017
·
3 revisions
播放器支持文本格式(ASS, ART)的内嵌和外挂字幕,其中播放器负责字幕的解析与音视频的同步,字幕的渲染需要由用户负责
v2.5.2及以上的点播库版本可支持该功能
- (void) setTrackSelected:(NSInteger)trackIndex selected:(BOOL)selected
- trackIndex - 媒体轨道的stream index,字幕的媒体轨道信息可以通过
getMetadata
方法获取 - selected - 开启/关闭指定媒体轨道
- (void)setExtSubtitleFilePath:(NSString *)subtitleFilePath
- subtitleFilePath - 本地字幕文件路径
字幕有起始展示时间点和展示时长,当字幕需要被展示或者展示结束时都发送MPMoviePlayerPlaybackTimedTextNotification消息,其字幕内容存在于userInfo字典的MPMoviePlayerPlaybackTimedTextUserInfoKey关键字中;字幕展示结束时其内容为空("")。
- 如果当前播放的是外挂字幕,关闭外挂字幕后,默认不会展示内嵌字幕
- meta信息中内嵌字幕与外挂字幕的type类型不同,内嵌字幕类型为"subtitle",外挂字幕为"external_timed_text"
- 可通过getMetadata:方法获得当前使用的字幕轨道信息
- 如果当前播放的是外挂字幕,调用getMetadata方法得到的meta信息中会含有当前播放外挂字幕信息,关闭外挂字幕时调用该方法无此信息
- 字幕轨道切换
- 内嵌字幕切换到内嵌字幕:可直接调用
[player setTrackSelected:selectedSubIdx selected:YES]
播放选择的内嵌字幕 - 内嵌字幕切换到外挂字幕:可直接调用
[player setExtSubtitleFilePath:subtitleFilePath]
播放选择的外挂字幕 - 外挂字幕切换到内嵌字幕:必须要先调用
[player setTrackSelected:currentSubIdx selected:NO]
关闭当前播放的外挂字幕,再调用[player setTrackSelected:selectedSubIdx selected:YES]
播放选择的内嵌字幕
- 内嵌字幕切换到内嵌字幕:可直接调用
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];
}
NSString *subtitlePath = [NSString stringWithFormat:@"%@%s", NSHomeDirectory(), "/Documents/subtitle.srt"];
[_player setExtSubtitleFilePath:subtitleFilePath];
内嵌/外挂字幕均使用此方法关闭
//获取当前播放的字幕轨道的meta
NSDictionary *subtitleMeta = [_player getMetadata:MPMovieMetaType_Subtitle];
//传入当前字幕流的stream_index来关闭字幕
[_player setTrackSelected:[[subtitleMeta objectForKey:kKSYPLYStreamIndex] integerValue] selected:NO];