srt字幕的格式
1 00:00:31,788 --> 00:00:34,020 {\a3}下面我給大家分享第四個問題 2 00:00:34,412 --> 00:00:35,740 {\a3}如何開辦企業 3 00:00:36,140 --> 00:00:37,684 {\a3}如何開辦企業呢 4 00:00:37,964 --> 00:00:39,060 {\a3}在這個問題當中 5 00:00:39,268 --> 00:00:41,692 {\a3}我將給大家講兩個方面的內容 6 00:00:41,892 --> 00:00:43,868 {\a3}第一個方面就是開辦企業的流程 7 00:00:44,260 --> 00:00:45,500 {\a3}第二個方面的內容
這是我的視頻字幕。
首先解析出來視頻字幕的時間和字幕內容。
NSString *appendStr = @"http://192.168.1.60:5080/Mooc/caption/dc05f541-269c-4f1b-ad99-782f5adcefdf_1447910856426.srt"; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:appendStr]]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (!error) { // GBK編碼
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); // 解碼
NSString *string = [[NSString alloc] initWithData:data encoding:enc]; //按行分割存放到數組中
NSArray *singlearray = [string componentsSeparatedByString:@"\n"]; _subtitlesarray = [NSMutableArray array]; _begintimearray = [NSMutableArray array]; _endtimearray = [NSMutableArray array]; //遍歷存放所有行的數組
for (NSString *ss in singlearray) { NSRange range = [ss rangeOfString:@"{\\a3}"]; NSRange range2 = [ss rangeOfString:@" --> "]; if (range.location != NSNotFound) { [_subtitlesarray addObject:[ss substringFromIndex:range.location + range.length]]; } if (range2.location != NSNotFound) { NSString *beginstr = [ss substringToIndex:range2.location]; NSString *endstr = [ss substringFromIndex:range2.location+range2.length]; NSArray * arr = [beginstr componentsSeparatedByString:@":"]; NSArray * arr1 = [arr[2] componentsSeparatedByString:@","]; //將開始時間數組中的時間換化成秒為單位的
float teim=[arr[0] floatValue] * 60*60 + [arr[1] floatValue]*60 + [arr1[0] floatValue] + [arr1[1] floatValue]/1000; //將float類型轉化成NSNumber類型才能存入數組
NSNumber *beginnum = [NSNumber numberWithFloat:teim]; [_begintimearray addObject:beginnum]; NSArray * array = [endstr componentsSeparatedByString:@":"]; NSArray * arr2 = [array[2] componentsSeparatedByString:@","]; //將結束時間數組中的時間換化成秒為單位的
float fl=[array[0] floatValue] * 60*60 + [array[1] floatValue]*60 + [arr2[0] floatValue] + [arr2[1] floatValue]/1000; NSNumber *endnum = [NSNumber numberWithFloat:fl]; [_endtimearray addObject:endnum]; } } NSLog(@" 開始時間數組-=-=-==-=%@",_begintimearray); NSLog(@" 結束時間數組-=-=-==-=%@",_endtimearray); NSLog(@" 字幕數組-=-=-==-=%@",_subtitlesarray); }else{ NSLog(@"error is %@",error.localizedDescription); } }]; [dataTask resume];
上面代碼已經把開始時間,結束時間,字幕分別放到三個數組中了。
把時間換成秒為單位的,為了能與獲取的當前時間相匹配然后再比較。
視頻播放時開個定時器,監控當前時間,與開始時間,結束時間比較,在之間的就把相應的字幕放進去顯示就對了
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];
- (void)timeAction { //判斷播放狀態
if (_player.rate != 1) { return; } NSInteger currentSecond = CMTimeGetSeconds(_player.currentItem.currentTime);
for (int i = 0; i<_begintimearray.count ; i++) { NSInteger beginarr = [_begintimearray[i] integerValue]; NSInteger endarr = [_endtimearray[i]integerValue]; if (currentSecond > beginarr && currentSecond< endarr) { //同步字幕
_subtitlesLabel.text = _subtitlesarray[i]; NSLog(@" 字幕 %@",_subtitlesarray[i]); } } //播放完成 暫停
if (currentSecond == (int)CMTimeGetSeconds(self.player.currentItem.duration)) { [self.player pause]; [self updateUI]; } }
這里提醒注意下,把時間都轉為NSInteger類型進行比較,一開始使用的NSNumber比較,字幕顯示混亂=。=
這樣字幕顯示出來了,如果字幕和視頻的對話有偏差,就把定時器的時間調整的再小一點應該就好了~