iOS获取m3u8文件大小

iOS获取m3u8文件大小 2种方式 :一种是等待线程 一种是block回调

方法使用

第一种 等待线程

long long size =  [TZGetUrlFileLength getUrlFileLength:str];
//size 为0 时地址m3u8有问题,或者 中间ts段请求头 有问题。

第二种 block回调


 [TZGetUrlFileLength getUrlFileLength:str withResultBlock:^(long long length, NSError * _Nonnull error) {
       NSLog(@"size %lld  ,error %@",length,error);
 }];

方法展示

第一种 等待线程

/// 通过url (.m3u8)地址  获取文件大小返回byte
/// @param url 地址m3u8类型
+(long long)getUrlFileLength:(NSString *)url;
{
    
    if(url.length == 0 || ![url containsString:@"m3u8"]){
        NSLog(@"url 地址不是m3u8 类型");
        return 0;
    }
    
    NSError *error = nil;
    NSString *m3u8DataStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:&error];
    if ( error ) {
        NSLog( @"网络错误, 无法下载! 请检查ATS||URL是否正确:%@",url);
        return 0;
    }
    
    //获取母地址 准备拼接片段来获取大小
    __block NSString* urlStrTemp = [TZGetUrlFileLength  getYichuTheLastStr:url];
    //设置变量 记录数值
    __block long long size_zone = 0;
    __block NSError * errorPost = nil;
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    NSArray<NSString *> *tsDataArr = [m3u8DataStr componentsSeparatedByString:@"\n"];
//   考虑线程安全 加一个
    dispatch_semaphore_t signal = dispatch_semaphore_create(1);
    
    for (int i = 0 ; i<tsDataArr.count; i++) {
        
        NSString * strTs = [NSString stringWithFormat:@"%@",tsDataArr[i]];
        if ([strTs hasSuffix:@".ts"]) {
            //            dispatch_async(queue, ^(){
            //            拼接ts单片地址
            
            NSString * urlPost = [NSString stringWithFormat:@"%@%@",urlStrTemp,strTs];
            
            //                异步实现同步
            dispatch_group_enter(group);
            //                线程安全
            dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
            
            //            判断是否中间有失败的场景
            if (errorPost) {
                size_zone = 0;
                NSLog(@"任务中断  %@",errorPost);
                //                    异步实现同步
                dispatch_group_leave(group);
                //                    线程安全
                dispatch_semaphore_signal(signal);
                break;
            }
            
            //1.创建NSURLSession对象(可以获取单例对象)
            NSURLSession *session = [NSURLSession sharedSession];
            //2.根据NSURLSession对象创建一个Task
            NSURL *url = [NSURL URLWithString:urlPost];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            request.timeoutInterval = 5.0;
            [request setHTTPMethod:@"HEAD"];
            //                获取内容头信息
            NSURLSessionDataTask * dataTask =  [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
                if (error) {
                    errorPost = error;
                }
                //拿到响应头信息
                NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
                
                //获取内容大小
                NSNumber *length = [[res allHeaderFields] objectForKey:@"Content-Length"];
                //                 记录总量
                size_zone = [length longLongValue] +size_zone;
                //                    NSLog(@"length  %lld,   longZonetime222 %lld",[length longLongValue],size_zone);
                
                //                    异步实现同步
                dispatch_group_leave(group);
                //                    线程安全
                dispatch_semaphore_signal(signal);
                //                    //4.解析拿到的响应数据
                //                    NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
            }];
            
            //3.执行Task
            //注意:刚创建出来的task默认是挂起状态的,需要调用该方法来启动任务(执行任务)
            [dataTask resume];
            
            //                NSLog(@"length  ,   longZonetime111 %lld",size_zone);
            //            });
        }
    }
//    异步实现同步  等待完成任务返回数值;
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    NSLog(@"任务全部结束!longZonetime333  %lld",size_zone);
    return size_zone;
    
}

第二种 block回调

/**
 *  通过url获得网络的文件的大小 返回byte
 *
 *  @param url 网络url  地址m3u8类型
 *
 *   文件的大小 byte
 */
+(void)getUrlFileLength:(NSString *)url withResultBlock:(void(^)(long long length, NSError *error))block;
{
    
    if(url.length == 0 || ![url containsString:@"m3u8"]){
        NSLog(@"url 地址不是m3u8 类型");
        if (block) {
            block(0,nil);
        }
        return;
    }
    
    NSError *error = nil;
    NSString *m3u8DataStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error:&error];
    if ( error ) {
        NSLog( @"网络错误, 无法下载! 请检查ATS||URL是否正确:%@",url);
        if (block) {
            block(0,nil);
        }
        return;
    }
    
    //获取母地址 准备拼接片段来获取大小
    __block NSString* urlStrTemp = [TZGetUrlFileLength  getYichuTheLastStr:url];
    //设置变量 记录数值
    __block long long size_zone = 0;
    __block NSError * errorPost = nil;
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    NSArray<NSString *> *tsDataArr = [m3u8DataStr componentsSeparatedByString:@"\n"];
//   考虑线程安全 加一个
    dispatch_semaphore_t signal = dispatch_semaphore_create(1);
    
    for (int i = 0 ; i<tsDataArr.count; i++) {
        
        NSString * strTs = [NSString stringWithFormat:@"%@",tsDataArr[i]];
        if ([strTs hasSuffix:@".ts"]) {
            
            //            拼接ts单片地址
            NSString * urlPost = [NSString stringWithFormat:@"%@%@",urlStrTemp,strTs];
           
            //                异步实现同步
            dispatch_group_enter(group);
            //                线程安全
            dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
            
            
            //                判断是否中间有失败的场景
            if (errorPost) {
                size_zone = 0;
                NSLog(@"任务中断  %@",errorPost);
                //                    异步实现同步
                dispatch_group_leave(group);
                //                    线程安全
                dispatch_semaphore_signal(signal);
                break;
            }
            
            
            
            //1.创建NSURLSession对象(可以获取单例对象)
            NSURLSession *session = [NSURLSession sharedSession];
            //2.根据NSURLSession对象创建一个Task
            NSURL *url = [NSURL URLWithString:urlPost];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            request.timeoutInterval = 5.0;
            [request setHTTPMethod:@"HEAD"];
            //                获取内容头信息
            NSURLSessionDataTask * dataTask =  [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
                if (error) {
                    errorPost = error;
                }
                //拿到响应头信息
                NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
                
                //获取内容大小
                NSNumber *length = [[res allHeaderFields] objectForKey:@"Content-Length"];
                //                 记录总量
                size_zone = [length longLongValue] +size_zone;
                // NSLog(@"length  %lld,   longZonetime222 %lld",[length longLongValue],size_zone);
                
                //                    异步实现同步
                dispatch_group_leave(group);
                //                    线程安全
                dispatch_semaphore_signal(signal);
                //                    //4.解析拿到的响应数据
                //                    NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
            }];
            
            //3.执行Task
            //注意:刚创建出来的task默认是挂起状态的,需要调用该方法来启动任务(执行任务)
            [dataTask resume];
            
           //NSLog(@"length  ,   longZonetime111 %lld",size_zone);
            
        }
    }
    //    NSLog(@"任务全部结束!longZonetime333  %lld",size_zone);
    //    异步实现同步  等待完成任务返回数值;
    dispatch_group_notify(group, queue, ^{
        NSLog(@"任务全部结束!longZonetime");
        if (block) {
            block(size_zone,errorPost);
        }
    });
    
    
    
}

补充方法

//获取母地址 准备拼接片段来获取大小
+(NSString *)getYichuTheLastStr:(NSString *)url{
    long i_temp = 0;
    for (long i =url.length; i > 0; i--) {
        NSString * str = [url substringWithRange:NSMakeRange(i-1, 1)];
        if ([str isEqualToString:@"/"]) {
            i_temp = i;
            break;
        }
    }
    //获取母地址 准备拼接片段来获取大小
    NSString* urlStrTemp = [url substringToIndex:i_temp];
    return urlStrTemp;
}

不知道有没有更好的方法 目前使用比较方法 整理下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容