hyzp_ybqx-Commit001:代码刚转换好,编译通过

This commit is contained in:
WinUser01
2021-12-09 20:24:36 +08:00
commit 8c74b14e5c
800 changed files with 66912 additions and 0 deletions
@@ -0,0 +1,15 @@
//
// DataReport.h
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/7/10.
// Copyright © 2018年 Tencent. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface DataReport : NSObject
+ (void)report:(NSString *)action param:(NSDictionary *)param;
@end
@@ -0,0 +1,127 @@
//
// DataReport.m
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/7/10.
// Copyright © 2018年 Tencent. All rights reserved.
//
#import "DataReport.h"
//错误码
#define kError_InvalidParam -10001
#define kError_ConvertJsonFailed -10002
#define kError_HttpError -10003
//数据上报
#define DEFAULT_ELK_HOST @"https://ilivelog.qcloud.com"
#define kHttpTimeout 30
@implementation DataReport
+ (void)report:(NSString *)action param:(NSDictionary *)param
{
NSMutableDictionary *dict = @{}.mutableCopy;
if (param) {
[dict addEntriesFromDictionary:param];
}
[dict setObject:@"superplayer" forKey:@"bussiness"];
[dict setObject:@"ios" forKey:@"platform"];
[dict setObject:@"log" forKey:@"type"];
[dict setObject:action?:@"" forKey:@"action"];
[dict setObject:[[NSBundle mainBundle] bundleIdentifier] forKey:@"appidentifier"];
[dict setObject:[DataReport getPackageName] forKey:@"appname"];
[self report:dict handler:^(int resultCode, NSString *message) {
}];
}
+ (NSString *)getPackageName {
static NSString *packname = nil;
if (packname)
return packname;
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
packname = [infoDict objectForKey:@"CFBundleDisplayName"];
if (packname == nil || [packname isEqual:@""]) {
packname = [infoDict objectForKey:@"CFBundleIdentifier"];
}
return packname;
}
+ (void)report:(NSMutableDictionary *)param handler:(void (^)(int resultCode, NSString *message))handler;
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSData* data = [self dictionary2JsonData:param];
if (data == nil)
{
dispatch_async(dispatch_get_main_queue(), ^{
if (handler) handler(kError_ConvertJsonFailed, nil);
});
return;
}
NSMutableString *strUrl = [[NSMutableString alloc] initWithString:DEFAULT_ELK_HOST];
NSURL *URL = [NSURL URLWithString:strUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
if (data)
{
[request setValue:[NSString stringWithFormat:@"%ld",(long)[data length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
[request setHTTPBody:data];
}
[request setTimeoutInterval:kHttpTimeout];
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error != nil)
{
NSLog(@"internalSendRequest failed,NSURLSessionDataTask return error code:%ld, des:%@", (long)[error code], [error description]);
dispatch_async(dispatch_get_main_queue(), ^{
if (handler) handler(kError_HttpError, nil);
});
}
else
{
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if ([responseString isEqualToString:@"ok"]) {
if (handler) handler(0, responseString);
}else{
if (handler) handler(-1, responseString);
}
});
}
}];
[task resume];
});
}
+ (NSData *)dictionary2JsonData:(NSDictionary *)dict
{
// 转成Json数据
if ([NSJSONSerialization isValidJSONObject:dict])
{
NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
if(error)
{
NSLog(@"[%@] Post Json Error", [self class]);
}
return data;
}
else
{
NSLog(@"[%@] Post Json is not valid", [self class]);
}
return nil;
}
@end
@@ -0,0 +1,19 @@
//
// J2Obj.h
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/6/25.
// Copyright © 2018年 Tencent. All rights reserved.
//
#ifndef J2Obj_h
#define J2Obj_h
NSArray *J2Array(id value);
NSString *J2Str(id value);
NSNumber *J2Num(id value);
#endif /* J2Obj_h */
@@ -0,0 +1,61 @@
//
// J2Obj.m
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/6/25.
// Copyright © 2018年 Tencent. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "J2Obj.h"
NSArray *J2Array(id value) {
id obj = value;
id ret;
if ([obj isKindOfClass:[NSArray class]])
{
ret = obj;
}
else
{
ret = @[];
}
return ret;
}
NSString * J2Str(id value) {
id obj = value;
id ret;
if ([obj isKindOfClass:[NSString class]])
{
ret = obj;
}
else if ([obj isKindOfClass:[NSNumber class]])
{
ret = [obj stringValue];
}
else
{
ret = @"";
}
return ret;
}
NSNumber *J2Num(id value) {
id obj = value;
id ret;
if ([obj isKindOfClass:[NSString class]])
{
ret = [NSNumber numberWithDouble:[obj doubleValue]];
}
else if ([obj isKindOfClass:[NSNumber class]])
{
ret = obj;
}
else
{
ret = @0;
}
return ret;
}
@@ -0,0 +1,26 @@
//
// NetWatcher.h
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/7/31.
// Copyright © 2018年 Tencent. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "SuperPlayerModel.h"
@interface NetWatcher : NSObject
@property (copy) void (^notifyTipsBlock)(NSString *);
@property (nonatomic) SuperPlayerModel *playerModel;
- (void)startWatch;
- (void)stopWatch;
- (void)loadingEvent;
- (void)loadingEndEvent;
@property NSString *adviseDefinition;
@end
@@ -0,0 +1,169 @@
//
// NetWatcher.m
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/7/31.
// Copyright © 2018年 Tencent. All rights reserved.
//
#import "NetWatcher.h"
#import "AFNetworking/AFNetworking.h"
#import "SuperPlayerModelInternal.h"
@interface NetWatcher()
@property NSArray *definitions;
@end
@implementation NetWatcher {
NSDate *_startTime;
int _loadingCount;
dispatch_source_t _timer1;
BOOL _onFire;
}
- (void)setPlayerModel:(SuperPlayerModel *)playerModel
{
_playerModel = playerModel;
self.definitions = [self.playerModel.playDefinitions sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
return [NetWatcher weightOfDefinition:obj1] < [NetWatcher weightOfDefinition:obj2];
}];
if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN) {
self.adviseDefinition = self.definitions.lastObject;
} else {
self.adviseDefinition = self.definitions.firstObject;
}
}
- (void)startWatch
{
[self stopWatch];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
if (self.definitions.count <= 1) {
return;
}
_startTime = [NSDate date];
_loadingCount = 0;
NSLog(@"NetWatcher: startWatch");
}
- (void)stopWatch
{
_startTime = nil;
if (_timer1) {
if (!_onFire) {
dispatch_resume(_timer1);
}
dispatch_source_cancel(_timer1);
_timer1 = nil;
}
_onFire = NO;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)loadingEvent
{
if (!_startTime)
return;
NSLog(@"NetWatcher: loadingEvent");
if (_timer1 == nil) {
_timer1 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(_timer1, DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
__weak NetWatcher *weakSelf = self;
dispatch_source_set_event_handler(_timer1, ^{
NetWatcher *strongSelf = weakSelf;
NSLog(@"NetWatcher: time out");
if (strongSelf) {
strongSelf->_loadingCount++;
[strongSelf testNotify];
}
});
}
if (!_onFire) {
dispatch_resume(_timer1);
}
_onFire = YES;
}
- (void)loadingEndEvent
{
if (_onFire) {
dispatch_suspend(_timer1);
_onFire = NO;
_loadingCount++;
}
NSLog(@"NetWatcher: loadingEndEvent");
}
- (BOOL)testNotify
{
if (-[_startTime timeIntervalSinceNow] > 30) {
[self stopWatch]; // 超过30秒不检测了
return NO;
}
// 暂定30秒缓冲次数超过2次,为网络不好
if (_loadingCount >= 2) {
NSUInteger i = [self.definitions indexOfObject:self.adviseDefinition];
if (i < self.definitions.count-1) {
self.adviseDefinition = self.definitions[i+1];
}
if (self.notifyTipsBlock) {
self.notifyTipsBlock(@"检测到你的网络较差,建议切换清晰度");
}
_loadingCount = 0;
[self stopWatch];
return YES;
}
return NO;
}
- (void)networkChanged:(NSNotification *)noti
{
if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN) {
self.adviseDefinition = self.definitions.lastObject;
if (self.adviseDefinition && ![self.playerModel.playingDefinition isEqualToString:self.adviseDefinition]) {
self.notifyTipsBlock([@"当前网络为4G,建议切换到" stringByAppendingString:self.adviseDefinition]);
}
}
}
+(int)weightOfDefinition:(NSString *)def
{
if ([def isEqualToString:@"流畅"]) {
return 10;
}
if ([def isEqualToString:@"标清"]) {
return 15;
}
if ([def isEqualToString:@"高清"]) {
return 20;
}
if ([def isEqualToString:@"全高清"]) {
return 40;
}
if ([def isEqualToString:@"超清"]) {
return 50;
}
if ([def isEqualToString:@"原画"]) {
return 60;
}
if ([def isEqualToString:@"2K"]) {
return 70;
}
if ([def isEqualToString:@"4K"]) {
return 80;
}
return 10000;
}
@end
@@ -0,0 +1,19 @@
//
// StrUtils.h
// Pods
//
// Created by annidyfeng on 2018/9/28.
//
#import <Foundation/Foundation.h>
@interface StrUtils : NSObject
+ (NSString *)timeFormat:(NSInteger)totalTime;
@end
extern NSString *kStrLoadFaildRetry;
extern NSString *kStrBadNetRetry;
extern NSString *kStrTimeShiftFailed;
extern NSString *kStrHDSwitchFailed;
extern NSString *kStrWeakNet;
@@ -0,0 +1,33 @@
//
// StrUtils.m
// Pods
//
// Created by annidyfeng on 2018/9/28.
//
#import "StrUtils.h"
NSString *kStrLoadFaildRetry = @"加载失败,点击重试";
NSString *kStrBadNetRetry = @"网络不给力,点击重试";
NSString *kStrTimeShiftFailed = @"时移失败,返回直播";
NSString *kStrHDSwitchFailed = @"清晰度切换失败";
NSString *kStrWeakNet = @"检测到你的网络较差,建议切换清晰度";
@implementation StrUtils
+ (NSString *)timeFormat:(NSInteger)totalTime {
if (totalTime < 0) {
return @"";
}
NSInteger durHour = totalTime / 3600;
NSInteger durMin = (totalTime / 60) % 60;
NSInteger durSec = totalTime % 60;
if (durHour > 0) {
return [NSString stringWithFormat:@"%zd:%02zd:%02zd", durHour, durMin, durSec];
} else {
return [NSString stringWithFormat:@"%02zd:%02zd", durMin, durSec];
}
}
@end
@@ -0,0 +1,21 @@
//
// TXBitrateItemHelper.h
// SuperPlayer
//
// Created by annidyfeng on 2018/9/28.
//
#import <Foundation/Foundation.h>
#import "SuperPlayerModel.h"
#import "SuperPlayer.h"
@class TXBitrateItem;
@interface TXBitrateItemHelper : NSObject
@property NSInteger bitrate;
@property NSString *title;
@property int index;
+ (NSArray<SuperPlayerUrl *> *)sortWithBitrate:(NSArray<TXBitrateItem *> *)bitrates;
@end
@@ -0,0 +1,36 @@
//
// TXBitrateItemHelper.m
// SuperPlayer
//
// Created by annidyfeng on 2018/9/28.
//
#import "TXBitrateItemHelper.h"
#import "TXBitrateItem.h"
@implementation TXBitrateItemHelper
+ (NSArray<SuperPlayerUrl *> *)sortWithBitrate:(NSArray<TXBitrateItem *> *)bitrates {
NSMutableArray *origin = [NSMutableArray new];
NSArray *titles = @[@"流畅",@"高清",@"超清",@"原画",@"2K",@"4K"];
NSMutableArray *retArray = [[NSMutableArray alloc] initWithCapacity:bitrates.count];
for (int i = 0; i < bitrates.count; i++) {
TXBitrateItemHelper *h = [TXBitrateItemHelper new];
h.bitrate = bitrates[i].bitrate;
h.index = i;
[origin addObject:h];
[retArray addObject:[NSNull null]];
}
NSArray *sorted = [origin sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"bitrate" ascending:YES]]];
[sorted enumerateObjectsUsingBlock:^(TXBitrateItemHelper *h, NSUInteger idx, BOOL *stop) {
SuperPlayerUrl *sub = [SuperPlayerUrl new];
sub.title = titles[idx];
retArray[h.index] = sub;
}];
return retArray;
}
@end
@@ -0,0 +1,17 @@
//
// TXCUrl.h
// SuperPlayer
//
// Created by annidyfeng on 2018/9/17.
// Copyright © 2018年 annidy. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface TXCUrl : NSObject
- (instancetype)initWithString:(NSString *)url;
- (NSInteger)bizid;
@end
@@ -0,0 +1,46 @@
//
// TXCUrl.m
// SuperPlayer
//
// Created by annidyfeng on 2018/9/17.
// Copyright © 2018年 annidy. All rights reserved.
//
#import "TXCUrl.h"
@implementation TXCUrl {
NSURL *_url;
}
- (instancetype)initWithString:(NSString *)url
{
self = [super init];
_url = [NSURL URLWithString:url];
return self;
}
- (NSInteger)bizid
{
NSString *bizId = nil;
for (NSString *param in [_url.query componentsSeparatedByString:@"&"]) {
NSArray *elts = [param componentsSeparatedByString:@"="];
if([elts count] < 2) continue;
if ([[elts firstObject] isEqualToString:@"bizid"]) {
bizId = [elts lastObject];
break;
}
}
if (bizId == nil) {
bizId = [[_url host] componentsSeparatedByString:@"."].firstObject;
}
NSInteger bizIdNum = [bizId integerValue];
if (bizIdNum <= 0) {
bizIdNum = -1;
}
return bizIdNum;
}
@end
@@ -0,0 +1,15 @@
//
// UIView+Fade.h
// SuperPlayer
//
// Created by annidyfeng on 2018/9/28.
//
#import <UIKit/UIKit.h>
@interface UIView (Fade)
- (UIView *)fadeShow;
- (void)fadeOut:(NSTimeInterval)delay;
- (void)cancelFadeOut;
@end
@@ -0,0 +1,53 @@
//
// UIView+Fade.m
// SuperPlayer
//
// Created by annidyfeng on 2018/9/28.
//
#import "UIView+Fade.h"
#import <objc/runtime.h>
@implementation UIView (Fade)
- (NSNumber *)fadeSeeds{
return objc_getAssociatedObject(self, @selector(fadeSeeds));
}
- (void)setFadeSeeds:(NSNumber *)seeds{
objc_setAssociatedObject(self, @selector(fadeSeeds), seeds, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)cancelFadeOut
{
[self setFadeSeeds:@(arc4random_uniform(1000))];
}
- (UIView *)fadeShow
{
[self cancelFadeOut];
[UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
self.hidden = NO;
} completion:^(BOOL finished) {
}];
return self;
}
- (void)fadeOut:(NSTimeInterval)delay
{
int seeds = [self.fadeSeeds intValue];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (seeds == [self.fadeSeeds intValue]) {
[UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.hidden = YES;
} completion:^(BOOL finished) {
}];
[self cancelFadeOut];
}
});
}
@end