iOS 笔记-SRT视频字幕的解析与同步

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比较,字幕显示混乱=。=

这样字幕显示出来了,如果字幕和视频的对话有偏差,就把定时器的时间调整的再小一点应该就好了~

时间: 2024-12-28 16:05:55

iOS 笔记-SRT视频字幕的解析与同步的相关文章

怎样快速下载YouTube视频字幕

八哥Youtube字幕下载使用教程: 八哥YouTube字幕下载网页能做什么? 凡是YouTube上带字幕标签的视频字幕都可以下载成txt文档或者Srt(带时间轴)文档保存下来. (备注说明:点击YouTube右下角字幕图标就可以开启视频字幕,一般为YouTube自带的机器识别字幕,也有用户上传的字幕:) 下载方法: 第一步:打开八哥字幕网页:http://legend.xiantiaokeji.com/shaw/subtitle 第二步:复制你所要下载视频的youtube地址链接: 粘贴到八哥

Microsoft Virtual Academy 提取视频字幕

Microsoft Virtual Academy(微软虚拟学院)简称MVA,上面的课程对于程序员来说very nice.而且提供了视频下载,对于网速不好的小伙伴来说这就是福音啊.无奈的是没有提供字幕的下载,这对于像我这种英文渣来说简直就是煎熬.百度了一系列方法之后,最后总结一下,供小伙伴们参考. 如图所示,进入课程页面后,F12打开 开发者工具,点击Network选项,在Name那一列可以找到video_cc.xml,字幕就藏在这里,注意可能会有两个video_cc.xml,请点开查看一下字幕

Android IOS WebRTC 音视频开发总结(六八)-- Google: What&#39;s next for WebRTC

本文主要从用户,公司和技术角度分析美女视频直播这个行业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help Justion和Sarah是google webrtc项目的主要负责人,下面的图片是根据他们分享的内容进行整理的,涉及webrtc进展.优化等方方面面.整理这些资料的过程中我们发现他们对待webrtc还是挺用心的,为webrtc的完善做了很多的工作,谢谢他们! 原始视频时长53分13秒,全英文的,所以我们考虑做

锐动IOS带UI视频编辑SDK

1 编写目的 预期读者: 有视频编辑开发经验或者无经验的,打算或者正在使用"锐动iOS带UI视频编辑SDK"的相关工程师. iOS软件工程师. 产品经理. QA 2 名词解释 分辨率:用于计算机视频处理的图像,以水平和垂直方向上所能显示的像素数来表示分辨率.常见视频分辨率的有1080P即1920x1080,720P即1080x720,640x480等. 宽高比:视频分辨率的宽高比,常见的有16:9,4:3,1:1.锐动视频编辑SDK对各宽高比的视频都支持编辑,导出的默认分辨率是1280

iOS获取本地视频和网络URL视频的缩略图方法

iOS获取本地视频和网络URL视频的缩略图方法 字数222 阅读612 评论0 喜欢13 首先大家先添加AVFoundation和CoreMedia.framework两个框架 第一种本地视频获取缩略图 NSString *path = @"www.51ios.net/本地路径" MPMoviePlayerController *51iosMPMovie = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileU

Linux下的视频字幕编辑

一.Linux下的字幕编辑软件 常用的有subtitleeditor, gnome-subtitles, gaupol 1.gnome-subtitles:不支持多字幕文件批量处理2.gaupol:全英文界面3.subtitleeditor:功能和gnome-subtitles.gaupol差不多,但支持批量处理,界面中文 二.常见视频和字幕不同步原因 网上下载的字幕和视频由于有时来源不一样,造成字幕和音频不同步.常见不同步的原因一般有两个:1.视频桢率(FPS)和字幕桢率(FPS)不一致:例如

IOS开发之——四种方法解析Jason数据(转)

本文将介绍TouchJson. SBJson .JSONKit 和 iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库 TouchJson包下载: http://download.csdn.net/detail/enuola/4523169 SBJson 包下载: http://download.csdn.net/detail/enuola/4523177 JSONKit包下载:http://download.csdn.net/detail

Android IOS WebRTC 音视频开发总结(二三)

本文主要介绍如何测试基于浏览器和手机的视频通话程序,转载请说明出处,文章来自博客园RTC.Blacker. 因为https://apprtc.appspot.com访问不了,不少想测试视频通话的人有点失望,所以将自己的开发程序提供给大家测试,详细说明如下: 一. 演示注意事项 1.1. 附件说明 1.1.1. 如需通过手机APP进行测试,请先去附件里面下载相应的apk.        1.1.2. iOS因涉及越狱暂未提供安装程序,如有特别需要请单独跟我联系. 1.2. 测试地址 1.1.1.

Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录

    Sharepoint学习笔记—习题系列--70-576习题解析  为便于查阅,这里整理并列出了70-576习题解析系列的所有问题,有些内容可能会在以后更新. 需要事先申明的是:     1. 不要把本系列当成Sharepoint 70-576的应试题库. 2.  Sharepoint学习 不是以考证为目的,真正的掌握是要通过大量实践来达到. 3.  通过做练习,可 以帮助我们加深对Sharepoint相关知识点的认知与掌握,不失为一个复习与整理Sharepoint知识的好方法. 4.