iOS獲取m3u8文件大小

iOS獲取m3u8文件大小 2種方式 :一種是等待線程 一種是block回調(diào)

方法使用

第一種 等待線程

long long size =  [TZGetUrlFileLength getUrlFileLength:str];
//size 為0 時(shí)地址m3u8有問(wèn)題,或者 中間ts段請(qǐng)求頭 有問(wèn)題。

第二種 block回調(diào)


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

方法展示

第一種 等待線程

/// 通過(guò)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( @"網(wǎng)絡(luò)錯(cuò)誤, 無(wú)法下載! 請(qǐng)檢查ATS||URL是否正確:%@",url);
        return 0;
    }
    
    //獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
    __block NSString* urlStrTemp = [TZGetUrlFileLength  getYichuTheLastStr:url];
    //設(shè)置變量 記錄數(shù)值
    __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"];
//   考慮線程安全 加一個(gè)
    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];
            
            //                異步實(shí)現(xiàn)同步
            dispatch_group_enter(group);
            //                線程安全
            dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
            
            //            判斷是否中間有失敗的場(chǎng)景
            if (errorPost) {
                size_zone = 0;
                NSLog(@"任務(wù)中斷  %@",errorPost);
                //                    異步實(shí)現(xiàn)同步
                dispatch_group_leave(group);
                //                    線程安全
                dispatch_semaphore_signal(signal);
                break;
            }
            
            //1.創(chuàng)建NSURLSession對(duì)象(可以獲取單例對(duì)象)
            NSURLSession *session = [NSURLSession sharedSession];
            //2.根據(jù)NSURLSession對(duì)象創(chuàng)建一個(gè)Task
            NSURL *url = [NSURL URLWithString:urlPost];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            request.timeoutInterval = 5.0;
            [request setHTTPMethod:@"HEAD"];
            //                獲取內(nèi)容頭信息
            NSURLSessionDataTask * dataTask =  [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
                if (error) {
                    errorPost = error;
                }
                //拿到響應(yīng)頭信息
                NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
                
                //獲取內(nèi)容大小
                NSNumber *length = [[res allHeaderFields] objectForKey:@"Content-Length"];
                //                 記錄總量
                size_zone = [length longLongValue] +size_zone;
                //                    NSLog(@"length  %lld,   longZonetime222 %lld",[length longLongValue],size_zone);
                
                //                    異步實(shí)現(xiàn)同步
                dispatch_group_leave(group);
                //                    線程安全
                dispatch_semaphore_signal(signal);
                //                    //4.解析拿到的響應(yīng)數(shù)據(jù)
                //                    NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
            }];
            
            //3.執(zhí)行Task
            //注意:剛創(chuàng)建出來(lái)的task默認(rèn)是掛起狀態(tài)的,需要調(diào)用該方法來(lái)啟動(dòng)任務(wù)(執(zhí)行任務(wù))
            [dataTask resume];
            
            //                NSLog(@"length  ,   longZonetime111 %lld",size_zone);
            //            });
        }
    }
//    異步實(shí)現(xiàn)同步  等待完成任務(wù)返回?cái)?shù)值;
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    NSLog(@"任務(wù)全部結(jié)束!longZonetime333  %lld",size_zone);
    return size_zone;
    
}

第二種 block回調(diào)

/**
 *  通過(guò)url獲得網(wǎng)絡(luò)的文件的大小 返回byte
 *
 *  @param url 網(wǎng)絡(luò)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( @"網(wǎng)絡(luò)錯(cuò)誤, 無(wú)法下載! 請(qǐng)檢查ATS||URL是否正確:%@",url);
        if (block) {
            block(0,nil);
        }
        return;
    }
    
    //獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
    __block NSString* urlStrTemp = [TZGetUrlFileLength  getYichuTheLastStr:url];
    //設(shè)置變量 記錄數(shù)值
    __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"];
//   考慮線程安全 加一個(gè)
    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];
           
            //                異步實(shí)現(xiàn)同步
            dispatch_group_enter(group);
            //                線程安全
            dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
            
            
            //                判斷是否中間有失敗的場(chǎng)景
            if (errorPost) {
                size_zone = 0;
                NSLog(@"任務(wù)中斷  %@",errorPost);
                //                    異步實(shí)現(xiàn)同步
                dispatch_group_leave(group);
                //                    線程安全
                dispatch_semaphore_signal(signal);
                break;
            }
            
            
            
            //1.創(chuàng)建NSURLSession對(duì)象(可以獲取單例對(duì)象)
            NSURLSession *session = [NSURLSession sharedSession];
            //2.根據(jù)NSURLSession對(duì)象創(chuàng)建一個(gè)Task
            NSURL *url = [NSURL URLWithString:urlPost];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            request.timeoutInterval = 5.0;
            [request setHTTPMethod:@"HEAD"];
            //                獲取內(nèi)容頭信息
            NSURLSessionDataTask * dataTask =  [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) {
                if (error) {
                    errorPost = error;
                }
                //拿到響應(yīng)頭信息
                NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
                
                //獲取內(nèi)容大小
                NSNumber *length = [[res allHeaderFields] objectForKey:@"Content-Length"];
                //                 記錄總量
                size_zone = [length longLongValue] +size_zone;
                // NSLog(@"length  %lld,   longZonetime222 %lld",[length longLongValue],size_zone);
                
                //                    異步實(shí)現(xiàn)同步
                dispatch_group_leave(group);
                //                    線程安全
                dispatch_semaphore_signal(signal);
                //                    //4.解析拿到的響應(yīng)數(shù)據(jù)
                //                    NSLog(@"%@\n%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding],res.allHeaderFields);
            }];
            
            //3.執(zhí)行Task
            //注意:剛創(chuàng)建出來(lái)的task默認(rèn)是掛起狀態(tài)的,需要調(diào)用該方法來(lái)啟動(dòng)任務(wù)(執(zhí)行任務(wù))
            [dataTask resume];
            
           //NSLog(@"length  ,   longZonetime111 %lld",size_zone);
            
        }
    }
    //    NSLog(@"任務(wù)全部結(jié)束!longZonetime333  %lld",size_zone);
    //    異步實(shí)現(xiàn)同步  等待完成任務(wù)返回?cái)?shù)值;
    dispatch_group_notify(group, queue, ^{
        NSLog(@"任務(wù)全部結(jié)束!longZonetime");
        if (block) {
            block(size_zone,errorPost);
        }
    });
    
    
    
}

補(bǔ)充方法

//獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
+(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;
        }
    }
    //獲取母地址 準(zhǔn)備拼接片段來(lái)獲取大小
    NSString* urlStrTemp = [url substringToIndex:i_temp];
    return urlStrTemp;
}

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容