| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925 |
- //
- // BGTPlayControllerForPK.m
- // BuguLive
- //
- // Created by xfg on 16/12/5.
- // Copyright © 2016年 xfg. All rights reserved.
- //
- #import "BGTPlayControllerForPK.h"
- #import <TXLiteAVSDK_Professional/TXLivePlayListener.h>
- #import <TXLiteAVSDK_Professional/TXLiveBase.h>
- #import <mach/mach.h>
- #define TEST_MUTE 0
- #define RTMP_URL ASLocalizedString(@"请输入或扫二维码获取播放地址")
- #define kRePlayTime 1 // 断开后重新尝试的次数
- typedef NS_ENUM(NSInteger, ENUM_TYPE_CACHE_STRATEGY)
- {
- CACHE_STRATEGY_FAST = 1, //极速
- CACHE_STRATEGY_SMOOTH = 2, //流畅
- CACHE_STRATEGY_AUTO = 3, //自动
- };
- #define CACHE_TIME_FAST 1
- #define CACHE_TIME_SMOOTH 5
- #define CACHE_TIME_AUTO_MIN 5
- #define CACHE_TIME_AUTO_MAX 10
- @interface BGTPlayControllerForPK ()<UITextFieldDelegate, TXLivePlayListener>
- @end
- @implementation BGTPlayControllerForPK
- {
- BOOL _bHWDec;
- UIButton *_btnPlayMode;
- UIButton *_btnHWDec;
- long long _trackingTouchTS;
- BOOL _startSeek;
- BOOL _videoPause;
- CGRect _videoWidgetFrame; // 改变videoWidget的frame时候记得对其重新进行赋值
- UIImageView *_loadingImageView;
- BOOL _appIsInterrupt;
- float _sliderValue;
- TX_Enum_PlayType _playType;
- long long _startPlayTS;
- NSString *_playDurationStr; // 播放时长
-
- // 普通播放配置
- TXLivePlayConfig *_txLivePlayConfig;
- }
- - (void)dealloc
- {
- if (_play_switch == YES)
- {
- [self stopRtmp];
- }
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- if (_liveType == FW_LIVE_TYPE_AUDIENCE)
- {
- _play_switch = NO;
- self.isLivePlay = YES;
- }
-
- [self initUI];
- }
- - (void)initUI
- {
- self.view.backgroundColor = [UIColor blackColor];
-
- _playDurationStr = @"00:00";
-
- _videoWidgetFrame = [UIScreen mainScreen].bounds;
-
- // remove all subview
- for (UIView *view in [self.view subviews])
- {
- [view removeFromSuperview];
- }
-
- CGSize size = [[UIScreen mainScreen] bounds].size;
-
- int icon_size = size.width / 10;
-
- _cover = [[UIView alloc]init];
- _cover.frame = CGRectMake(10.0f, 55 + 2*icon_size, size.width - 20, size.height - 75 - 3 * icon_size);
- _cover.backgroundColor = [UIColor grayColor];
- _cover.alpha = 0.5;
- _cover.hidden = YES;
- [self.view addSubview:_cover];
-
- int logheadH = 65;
- _statusView = [[UITextView alloc] initWithFrame:CGRectMake(10.0f, 55 + 2*icon_size, size.width - 20, logheadH)];
- _statusView.backgroundColor = [UIColor clearColor];
- _statusView.alpha = 1;
- _statusView.textColor = [UIColor blackColor];
- _statusView.editable = NO;
- _statusView.hidden = YES;
- [self.view addSubview:_statusView];
-
- _logViewEvt = [[UITextView alloc] initWithFrame:CGRectMake(10.0f, 55 + 2*icon_size + logheadH, size.width - 20, size.height - 75 - 3 * icon_size - logheadH)];
- _logViewEvt.backgroundColor = [UIColor clearColor];
- _logViewEvt.alpha = 1;
- _logViewEvt.textColor = [UIColor blackColor];
- _logViewEvt.editable = NO;
- _logViewEvt.hidden = YES;
- [self.view addSubview:_logViewEvt];
-
- int icon_length = 8;
- if (!self.isLivePlay)
- {
- icon_length = 6;
- }
- else
- {
- icon_length = 7;
- }
- int icon_gap = (size.width - icon_size*(icon_length-1))/icon_length;
-
- int btn_index = 0;
- _play_switch = NO;
-
- _log_switch = YES;
- [self createBottomBtnIndex:btn_index++ Icon:@"log" Action:@selector(clickLog:) Gap:icon_gap Size:icon_size];
-
- _bHWDec = NO;
- _btnHWDec = [self createBottomBtnIndex:btn_index++ Icon:@"quick2" Action:@selector(onClickHardware:) Gap:icon_gap Size:icon_size];
-
- _screenPortrait = NO;
- [self createBottomBtnIndex:btn_index++ Icon:@"portrait" Action:@selector(clickScreenOrientation:) Gap:icon_gap Size:icon_size];
-
- _renderFillScreen = YES;
- [self createBottomBtnIndex:btn_index++ Icon:@"adjust" Action:@selector(clickRenderMode:) Gap:icon_gap Size:icon_size];
-
- _txLivePlayer = [[TXLivePlayer alloc] init];
- [TXLiveBase setLogLevel:LOGLEVEL_NULL];
-
- if (!self.isLivePlay)
- {
- _btnCacheStrategy = nil;
- }
- else
- {
- _btnCacheStrategy = [self createBottomBtnIndex:btn_index++ Icon:@"cache_time" Action:@selector(onAdjustCacheStrategy:) Gap:icon_gap Size:icon_size];
- }
- [self setCacheStrategy:CACHE_STRATEGY_AUTO];
-
- _videoPause = NO;
- _trackingTouchTS = 0;
-
- if (!self.isLivePlay)
- {
- _playStart.hidden = NO;
- _playProgress.hidden = NO;
- }
- else
- {
- _playStart.hidden = YES;
- _playProgress.hidden = YES;
- }
-
- //loading imageview
- float width = 34;
- float height = 34;
- float offsetX = (self.view.frame.size.width - width) / 2;
- float offsetY = (self.view.frame.size.height - height) / 2;
- NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"loading_image0.png"],[UIImage imageNamed:@"loading_image1.png"],[UIImage imageNamed:@"loading_image2.png"],[UIImage imageNamed:@"loading_image3.png"],[UIImage imageNamed:@"loading_image4.png"],[UIImage imageNamed:@"loading_image5.png"],[UIImage imageNamed:@"loading_image6.png"],[UIImage imageNamed:@"loading_image7.png"], nil];
- _loadingImageView = [[UIImageView alloc] initWithFrame:CGRectMake(offsetX, offsetY, width, height)];
- _loadingImageView.animationImages = array;
- _loadingImageView.animationDuration = 1;
- _loadingImageView.hidden = YES;
- [self.view addSubview:_loadingImageView];
-
- _videoContrainerView = [[UIView alloc] initWithFrame:self.view.bounds];
- [self.view insertSubview:_videoContrainerView atIndex:0];
- _videoContrainerView.center = self.view.center;
-
- [self startRtmp:1];
- }
- - (void)setPlayUrlStr:(NSString *)playUrlStr
- {
- _playUrlStr = playUrlStr;
- }
- #pragma -- example code bellow
- - (void)clearLog
- {
- _tipsMsg = @"";
- _logMsg = @"";
- [_statusView setText:@""];
- [_logViewEvt setText:@""];
- _startTime = [[NSDate date]timeIntervalSince1970]*1000;
- _lastTime = _startTime;
- }
- - (BOOL)checkPlayUrl:(NSString*)playUrl
- {
- #warning 暂时注释
- /*
- if (!([playUrl hasPrefix:@"http:"] || [playUrl hasPrefix:@"https:"] || [playUrl hasPrefix:@"rtmp:"]))
- {
- [self toastTip:ASLocalizedString(@"播放地址不合法,目前仅支持rtmp,flv,hls,mp4播放方式!")];
- return NO;
- }
- if (self.isLivePlay)
- {
- if ([playUrl hasPrefix:@"rtmp:"])
- {
- _playType = PLAY_TYPE_LIVE_RTMP;
- }
- else if (([playUrl hasPrefix:@"https:"] || [playUrl hasPrefix:@"http:"]) && [playUrl rangeOfString:@".flv"].length > 0)
- {
- _playType = PLAY_TYPE_LIVE_FLV;
- }
- else
- {
- [self toastTip:ASLocalizedString(@"播放地址不合法,直播目前仅支持rtmp,flv播放方式!")];
- return NO;
- }
- _playType = PLAY_TYPE_LIVE_RTMP_ACC;
- }
- else
- {
- if ([playUrl hasPrefix:@"https:"] || [playUrl hasPrefix:@"http:"])
- {
- if ([playUrl rangeOfString:@".flv"].length > 0)
- {
- _playType = PLAY_TYPE_VOD_FLV;
- }
- else if ([playUrl rangeOfString:@".m3u8"].length > 0)
- {
- _playType= PLAY_TYPE_VOD_HLS;
- }
- else if ([playUrl rangeOfString:@".mp4"].length > 0)
- {
- _playType= PLAY_TYPE_VOD_MP4;
- }
- else
- {
- [self toastTip:ASLocalizedString(@"播放地址不合法,点播目前仅支持flv,hls,mp4播放方式!")];
- return NO;
- }
- }
- else
- {
- [self toastTip:ASLocalizedString(@"播放地址不合法,点播目前仅支持flv,hls,mp4播放方式!")];
- return NO;
- }
- }
-
- */
- return YES;
- }
- - (BOOL)startRtmp:(NSInteger)create_type
- {
- _create_type = create_type;
-
- NSString* playUrl = _playUrlStr;
- if (playUrl.length == 0)
- {
- playUrl = RTMP_URL;
- }
-
- if (![self checkPlayUrl:playUrl])
- {
- return NO;
- }
-
- [self clearLog];
-
- if(_txLivePlayer != nil)
- {
- _txLivePlayer.delegate = self;
- [_txLivePlayer setupVideoWidget:CGRectMake(0, 0, 0, 0) containView:self.view insertIndex:0];
- //设置播放器缓存策略
- //这里将播放器的策略设置为自动调整,调整的范围设定为1到4s,您也可以通过setCacheTime将播放器策略设置为采用
- //固定缓存时间。如果您什么都不调用,播放器将采用默认的策略(默认策略为自动调整,调整范围为1到4s)
- //[_txLivePlayer setCacheTime:5];
- //[_txLivePlayer setMinCacheTime:1];
- //[_txLivePlayer setMaxCacheTime:4];
- int result = [_txLivePlayer startLivePlay:playUrl type:_playType];
- if (result == -1)
- {
- [self toastTip:ASLocalizedString(@"非腾讯云链接,若要放开限制请联系腾讯云商务团队")];
- return NO;
- }
- if( result != 0)
- {
- NSLog(ASLocalizedString(@"播放器启动失败"));
- return NO;
- }
-
- if (_screenPortrait)
- {
- [_txLivePlayer setRenderRotation:HOME_ORIENTATION_RIGHT];
- }
- else
- {
- [_txLivePlayer setRenderRotation:HOME_ORIENTATION_DOWN];
- }
- if (_renderFillScreen)
- {
- [_txLivePlayer setRenderMode:RENDER_MODE_FILL_SCREEN];
- }
- else
- {
- [_txLivePlayer setRenderMode:RENDER_MODE_FILL_EDGE];
- }
-
- if (_create_type == 1)
- {
- [_txLivePlayer setRenderMode:RENDER_MODE_FILL_EDGE];
- }
- else
- {
- [_txLivePlayer setRenderMode:RENDER_MODE_FILL_SCREEN];
- }
-
- [self startLoadingAnimation];
-
- _videoPause = NO;
- [_btnPlay setImage:[UIImage imageNamed:@"fw_relive_suspend"] forState:UIControlStateNormal];
- }
- _startPlayTS = [[NSDate date]timeIntervalSince1970]*1000;
- return YES;
- }
- - (void)stopRtmp
- {
- [self stopLoadingAnimation];
- if(_txLivePlayer != nil)
- {
- _txLivePlayer.delegate = nil;
- [_txLivePlayer stopPlay];
- [_txLivePlayer removeVideoWidget];
- }
- }
- - (void)rePlay
- {
- if (_delegate && [_delegate respondsToSelector:@selector(playAgain:isHideLeaveTip:)])
- {
- [_delegate playAgain:self isHideLeaveTip:NO];
- }
- }
- #pragma mark - ----------------------- TXLivePlayListener代理事件 -----------------------
- - (void)onPlayEvent:(int)EvtID withParam:(NSDictionary*)param;
- {
- if (EvtID != PLAY_EVT_PLAY_PROGRESS)
- {
- NSLog(@"==========playEvtID1:%d",EvtID);
- }
-
- NSDictionary* dict = param;
-
- dispatch_async(dispatch_get_main_queue(), ^{
- if (EvtID == PLAY_EVT_RCV_FIRST_I_FRAME)
- {
- if (_delegate && [_delegate respondsToSelector:@selector(firstFrame:)])
- {
- [_delegate firstFrame:self];
- _rePlayTime = 0;
- }
- }
- else if (EvtID == PLAY_EVT_PLAY_BEGIN)
- {
- [self stopLoadingAnimation];
- long long playDelay = [[NSDate date]timeIntervalSince1970]*1000 - _startPlayTS;
- NSLog(@"AutoMonitor:PlayFirstRender,cost=%lld", playDelay);
- }
- else if (EvtID == PLAY_EVT_PLAY_PROGRESS && !_startSeek)
- {
- // 避免滑动进度条松开的瞬间可能出现滑动条瞬间跳到上一个位置
- long long curTs = [[NSDate date]timeIntervalSince1970]*1000;
- if (llabs(curTs - _trackingTouchTS) < 500) {
- return;
- }
- _trackingTouchTS = curTs;
-
- float progress = [dict[EVT_PLAY_PROGRESS] floatValue];
- int intProgress = progress + 0.5;
- _playStart.text = [[NSString stringWithFormat:@"%02d:%02d", (int)(intProgress / 60), (int)(intProgress % 60)] stringByAppendingString:[NSString stringWithFormat:@"/%@",_playDurationStr]];
- [_playProgress setValue:progress];
-
- float duration = [dict[EVT_PLAY_DURATION] floatValue];
- int intDuration = duration + 0.5;
- if (duration > 0 && _playProgress.maximumValue != duration) {
- [_playProgress setMaximumValue:duration];
- _playDurationStr = [NSString stringWithFormat:@"%02d:%02d", (int)(intDuration / 60), (int)(intDuration % 60)];
- }
- return ;
- }
- else if (EvtID == PLAY_ERR_NET_DISCONNECT)
- {
- [self stopRtmp];
- _play_switch = NO;
- [_btnPlay setImage:[UIImage imageNamed:@"fw_relive_start"] forState:UIControlStateNormal];
- [_playProgress setValue:0];
- _playStart.text = @"00:00/00:00";
- _videoPause = NO;
- [self performSelector:@selector(rePlay) withObject:nil afterDelay:3];
- }
- else if (EvtID == PLAY_EVT_PLAY_END)
- {
- [_txLivePlayer pause];
- [_btnPlay setImage:[UIImage imageNamed:@"fw_relive_start"] forState:UIControlStateNormal];
- }
- else if (EvtID == PLAY_EVT_PLAY_LOADING)
- {
- [self startLoadingAnimation];
- }
-
- long long time = [(NSNumber*)[dict valueForKey:EVT_TIME] longLongValue];
- int mil = time % 1000;
- NSDate* date = [NSDate dateWithTimeIntervalSince1970:time/1000];
- NSString* Msg = (NSString*)[dict valueForKey:EVT_MSG];
- [self appendLog:Msg time:date mills:mil];
- });
- }
- - (void)onNetStatus:(NSDictionary*) param
- {
- NSDictionary* dict = param;
- _qualityDict = param;
- /*
- dispatch_async(dispatch_get_main_queue(), ^{
- int netspeed = [(NSNumber*)[dict valueForKey:NET_STATUS_NET_SPEED] intValue];
- int vbitrate = [(NSNumber*)[dict valueForKey:NET_STATUS_VIDEO_BITRATE] intValue];
- int settrate = [(NSNumber*)[dict valueForKey:NET_STATUS_SET_VIDEO_BITRATE] intValue];
-
- _kbpsRecvStr = StringFromInt(vbitrate);
- _kbpsSendStr = StringFromInt(settrate);
-
- int abitrate = [(NSNumber*)[dict valueForKey:NET_STATUS_AUDIO_BITRATE] intValue];
- int cachesize = [(NSNumber*)[dict valueForKey:NET_STATUS_CACHE_SIZE] intValue];
- int dropsize = [(NSNumber*)[dict valueForKey:NET_STATUS_DROP_SIZE] intValue];
- int jitter = [(NSNumber*)[dict valueForKey:NET_STATUS_NET_JITTER] intValue];
- int fps = [(NSNumber*)[dict valueForKey:NET_STATUS_VIDEO_FPS] intValue];
- int width = [(NSNumber*)[dict valueForKey:NET_STATUS_VIDEO_WIDTH] intValue];
- int height = [(NSNumber*)[dict valueForKey:NET_STATUS_VIDEO_HEIGHT] intValue];
- float cpu_usage = [(NSNumber*)[dict valueForKey:NET_STATUS_CPU_USAGE] floatValue];
- NSString *serverIP = [dict valueForKey:NET_STATUS_SERVER_IP];
- int codecCacheSize = [(NSNumber*)[dict valueForKey:NET_STATUS_CODEC_CACHE] intValue];
- int nCodecDropCnt = [(NSNumber*)[dict valueForKey:NET_STATUS_CODEC_DROP_CNT] intValue];
-
- NSString* log = [NSString stringWithFormat:@"CPU:%.1f%%\tRES:%d*%d\tSPD:%dkb/s\nJITT:%d\tFPS:%d\tARA:%dkb/s\nQUE:%d|%d\tDRP:%d|%d\tVRA:%dkb/s\nSVR:%@\t",
- cpu_usage*100,
- width,
- height,
- netspeed,
- jitter,
- fps,
- abitrate,
- codecCacheSize,
- cachesize,
- nCodecDropCnt,
- dropsize,
- vbitrate,
- serverIP];
- [_statusView setText:log];
-
- });
- */
- }
- - (void)startLoadingAnimation
- {
- if (_loadingImageView != nil)
- {
- _loadingImageView.hidden = NO;
- [_loadingImageView startAnimating];
- }
- }
- - (void)stopLoadingAnimation
- {
- if (_loadingImageView != nil)
- {
- _loadingImageView.hidden = YES;
- [_loadingImageView stopAnimating];
- }
- }
- #pragma ###TXLivePlayListener
- - (void)appendLog:(NSString*) evt time:(NSDate*) date mills:(int)mil
- {
- if (evt == nil)
- {
- return;
- }
- NSDateFormatter* format = [[NSDateFormatter alloc] init];
- format.dateFormat = @"hh:mm:ss";
- NSString* time = [format stringFromDate:date];
- NSString* log = [NSString stringWithFormat:@"[%@.%-3.3d] %@", time, mil, evt];
- if (_logMsg == nil) {
- _logMsg = @"";
- }
- _logMsg = [NSString stringWithFormat:@"%@\n%@", _logMsg, log ];
- [_logViewEvt setText:_logMsg];
- }
- #pragma mark - ----------------------- 底部按钮事件 -----------------------
- #pragma mark 点击日志按钮
- - (void)clickLog:(UIButton*) sender
- {
- if (_log_switch == YES)
- {
- _statusView.hidden = YES;
- _logViewEvt.hidden = YES;
- [sender setImage:[UIImage imageNamed:@"log"] forState:UIControlStateNormal];
- _cover.hidden = YES;
- _log_switch = NO;
- }
- else
- {
- _statusView.hidden = NO;
- _logViewEvt.hidden = NO;
- [sender setImage:[UIImage imageNamed:@"log2"] forState:UIControlStateNormal];
- _cover.hidden = NO;
- _log_switch = YES;
- }
- // 2019年08月24日
- sender.hidden = YES;
- }
- #pragma mark 点击横竖屏按钮
- - (void) clickScreenOrientation:(UIButton*) sender
- {
- _screenPortrait = !_screenPortrait;
-
- if (_screenPortrait)
- {
- [sender setImage:[UIImage imageNamed:@"landscape"] forState:UIControlStateNormal];
- [_txLivePlayer setRenderRotation:HOME_ORIENTATION_RIGHT];
- }
- else
- {
- [sender setImage:[UIImage imageNamed:@"portrait"] forState:UIControlStateNormal];
- [_txLivePlayer setRenderRotation:HOME_ORIENTATION_DOWN];
- }
- }
- #pragma mark 点击填充模式按钮
- - (void) clickRenderMode:(UIButton*) sender
- {
- _renderFillScreen = !_renderFillScreen;
-
- if (_renderFillScreen) {
- [sender setImage:[UIImage imageNamed:@"adjust"] forState:UIControlStateNormal];
- [_txLivePlayer setRenderMode:RENDER_MODE_FILL_SCREEN];
- } else {
- [sender setImage:[UIImage imageNamed:@"fill"] forState:UIControlStateNormal];
- [_txLivePlayer setRenderMode:RENDER_MODE_FILL_EDGE];
- }
- }
- #pragma mark 点击硬件加速按钮
- - (void) onClickHardware:(UIButton*)sender
- {
- if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
- [self toastTip:ASLocalizedString(@"iOS 版本低于8.0,不支持硬件加速.")];
- return;
- }
-
- if (_play_switch == YES)
- {
- [self stopRtmp];
- }
-
- _txLivePlayer.enableHWAcceleration = !_bHWDec;
-
- _bHWDec = _txLivePlayer.enableHWAcceleration;
-
- if(_bHWDec)
- {
- [sender setImage:[UIImage imageNamed:@"quick"] forState:UIControlStateNormal];
- }
- else
- {
- [sender setImage:[UIImage imageNamed:@"quick2"] forState:UIControlStateNormal];
- }
-
- if (_play_switch == YES) {
- if (_bHWDec) {
-
- [self toastTip:ASLocalizedString(@"切换为硬解码. 重启播放流程")];
- }
- else
- {
- [self toastTip:ASLocalizedString(@"切换为软解码. 重启播放流程")];
-
- }
-
- [self startRtmp:_create_type];
- }
- }
- #pragma mark UISlider代理方法
- - (void)onSeek:(UISlider *)slider
- {
- #warning 暂时注释
- // [_txLivePlayer seek:_sliderValue];
-
-
- _trackingTouchTS = [[NSDate date]timeIntervalSince1970]*1000;
- _startSeek = NO;
- NSLog(@"vod seek drag end");
- }
- - (void)onSeekBegin:(UISlider *)slider
- {
- _startSeek = YES;
- NSLog(@"vod seek drag begin");
- }
- - (void)onDrag:(UISlider *)slider
- {
- float progress = slider.value;
- int intProgress = progress + 0.5;
- _playStart.text = [[NSString stringWithFormat:@"%02d:%02d",(int)(intProgress / 60), (int)(intProgress % 60)] stringByAppendingString:[NSString stringWithFormat:@"/%@",_playDurationStr]];
- _sliderValue = slider.value;
- }
- - (void)dragSliderDidEnd:(UISlider *)slider
- {
- _startSeek = NO;
- }
- - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
- {
- _vCacheStrategy.hidden = YES;
- }
- #pragma mark - ----------------------- 清晰度设置 -----------------------
- - (void) setCacheStrategy:(NSInteger) nCacheStrategy
- {
- if (_btnCacheStrategy == nil || _cacheStrategy == nCacheStrategy) return;
-
- if (_txLivePlayConfig == nil)
- {
- _txLivePlayConfig = [[TXLivePlayConfig alloc] init];
- }
-
- _cacheStrategy = nCacheStrategy;
- switch (_cacheStrategy) {
- case CACHE_STRATEGY_FAST:
- _txLivePlayConfig.bAutoAdjustCacheTime = YES;
- _txLivePlayConfig.minAutoAdjustCacheTime = CACHE_TIME_FAST;
- _txLivePlayConfig.maxAutoAdjustCacheTime = CACHE_TIME_FAST;
- [_txLivePlayer setConfig:_txLivePlayConfig];
- break;
-
- case CACHE_STRATEGY_SMOOTH:
- _txLivePlayConfig.bAutoAdjustCacheTime = NO;
- _txLivePlayConfig.cacheTime = CACHE_TIME_SMOOTH;
- [_txLivePlayer setConfig:_txLivePlayConfig];
- break;
-
- case CACHE_STRATEGY_AUTO:
- _txLivePlayConfig.bAutoAdjustCacheTime = YES;
- _txLivePlayConfig.minAutoAdjustCacheTime = CACHE_TIME_AUTO_MIN;
- _txLivePlayConfig.maxAutoAdjustCacheTime = CACHE_TIME_AUTO_MAX;
- [_txLivePlayer setConfig:_txLivePlayConfig];
- break;
-
- default:
- break;
- }
- }
- - (void) onAdjustCacheStrategy:(UIButton*) sender
- {
- #if TEST_MUTE
- static BOOL flag = YES;
- [_txLivePlayer setMute:flag];
- flag = !flag;
- #else
- if (_vCacheStrategy == nil)
- {
- CGSize size = [[UIScreen mainScreen] bounds].size;
- _vCacheStrategy = [[UIControl alloc]init];
- _vCacheStrategy.frame = CGRectMake(0, size.height-120, size.width, 120);
- [_vCacheStrategy setBackgroundColor:[UIColor whiteColor]];
-
- UILabel* title= [[UILabel alloc]init];
- title.frame = CGRectMake(0, 0, size.width, 50);
- [title setText:ASLocalizedString(@"缓存策略")];
- title.textAlignment = NSTextAlignmentCenter;
- [title setFont:[UIFont fontWithName:@"" size:14]];
-
- [_vCacheStrategy addSubview:title];
-
- int gap = 30;
- int width = (size.width - gap*2 - 20) / 3;
- _radioBtnFast = [UIButton buttonWithType:UIButtonTypeCustom];
- _radioBtnFast.frame = CGRectMake(10, 60, width, 40);
- [_radioBtnFast setTitle:ASLocalizedString(@"极速")forState:UIControlStateNormal];
- [_radioBtnFast addTarget:self action:@selector(onAdjustFast:) forControlEvents:UIControlEventTouchUpInside];
-
- _radioBtnSmooth = [UIButton buttonWithType:UIButtonTypeCustom];
- _radioBtnSmooth.frame = CGRectMake(10 + gap + width, 60, width, 40);
- [_radioBtnSmooth setTitle:ASLocalizedString(@"流畅")forState:UIControlStateNormal];
- [_radioBtnSmooth addTarget:self action:@selector(onAdjustSmooth:) forControlEvents:UIControlEventTouchUpInside];
-
- _radioBtnAUTO = [UIButton buttonWithType:UIButtonTypeCustom];
- _radioBtnAUTO.frame = CGRectMake(size.width - 10 - width, 60, width, 40);
- [_radioBtnAUTO setTitle:ASLocalizedString(@"自动")forState:UIControlStateNormal];
- [_radioBtnAUTO addTarget:self action:@selector(onAdjustAuto:) forControlEvents:UIControlEventTouchUpInside];
-
- [_vCacheStrategy addSubview:_radioBtnFast];
- [_vCacheStrategy addSubview:_radioBtnSmooth];
- [_vCacheStrategy addSubview:_radioBtnAUTO];
-
- [self.view addSubview:_vCacheStrategy];
- }
-
- _vCacheStrategy.hidden = NO;
- switch (_cacheStrategy) {
- case CACHE_STRATEGY_FAST:
- [_radioBtnFast setBackgroundImage:[UIImage imageNamed:@"black"] forState:UIControlStateNormal];
- [_radioBtnFast setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- [_radioBtnSmooth setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal];
- [_radioBtnSmooth setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- [_radioBtnAUTO setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal];
- [_radioBtnAUTO setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- break;
-
- case CACHE_STRATEGY_SMOOTH:
- [_radioBtnFast setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal];
- [_radioBtnFast setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- [_radioBtnSmooth setBackgroundImage:[UIImage imageNamed:@"black"] forState:UIControlStateNormal];
- [_radioBtnSmooth setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- [_radioBtnAUTO setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal];
- [_radioBtnAUTO setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- break;
-
- case CACHE_STRATEGY_AUTO:
- [_radioBtnFast setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal];
- [_radioBtnFast setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- [_radioBtnSmooth setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal];
- [_radioBtnSmooth setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- [_radioBtnAUTO setBackgroundImage:[UIImage imageNamed:@"black"] forState:UIControlStateNormal];
- [_radioBtnAUTO setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- break;
-
- default:
- break;
- }
- #endif
- }
- - (void) onAdjustFast:(UIButton*) sender
- {
- _vCacheStrategy.hidden = YES;
- [self setCacheStrategy:CACHE_STRATEGY_FAST];
- }
- - (void) onAdjustSmooth:(UIButton*) sender
- {
- _vCacheStrategy.hidden = YES;
- [self setCacheStrategy:CACHE_STRATEGY_SMOOTH];
- }
- - (void) onAdjustAuto:(UIButton*) sender
- {
- _vCacheStrategy.hidden = YES;
- [self setCacheStrategy:CACHE_STRATEGY_AUTO];
- }
- #pragma mark - ----------------------- 进入前后台 -----------------------
- - (void)onAppDidEnterBackGround
- {
- #warning 暂时注释
- /*
- if (_play_switch == YES && _appIsInterrupt == NO)
- {
- if (_playType == PLAY_TYPE_VOD_FLV || _playType == PLAY_TYPE_VOD_HLS || _playType == PLAY_TYPE_VOD_MP4)
- {
- if (!_videoPause)
- {
- [_txLivePlayer pause];
- }
- }
- _appIsInterrupt = YES;
- }
- */
- }
- - (void)onAppWillEnterForeground
- {
- #warning 暂时注释
- /*
- if (_play_switch == YES && _appIsInterrupt == YES)
- {
- if (_playType == PLAY_TYPE_VOD_FLV || _playType == PLAY_TYPE_VOD_HLS || _playType == PLAY_TYPE_VOD_MP4)
- {
- if (!_videoPause)
- {
- [_txLivePlayer resume];
- }
- }
- _appIsInterrupt = NO;
- }
- */
- }
- #pragma mark - ----------------------- 声音打断监听 -----------------------
- - (void)onAudioInterruption:(NSNotification *)notification
- {
- #warning 暂时注释
- /*
- NSDictionary *info = notification.userInfo;
- AVAudioSessionInterruptionType type = [info[AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
- if (type == AVAudioSessionInterruptionTypeBegan)
- {
- if (_play_switch == YES && _appIsInterrupt == NO)
- {
- if (_playType == PLAY_TYPE_VOD_FLV || _playType == PLAY_TYPE_VOD_HLS || _playType == PLAY_TYPE_VOD_MP4)
- {
- if (!_videoPause)
- {
- [_txLivePlayer pause];
- }
- }
- _appIsInterrupt = YES;
- }
- }
- else
- {
- AVAudioSessionInterruptionOptions options = [info[AVAudioSessionInterruptionOptionKey] unsignedIntegerValue];
- if (options == AVAudioSessionInterruptionOptionShouldResume)
- {
- if (_play_switch == YES && _appIsInterrupt == YES)
- {
- if (_playType == PLAY_TYPE_VOD_FLV || _playType == PLAY_TYPE_VOD_HLS || _playType == PLAY_TYPE_VOD_MP4)
- {
- if (!_videoPause)
- {
- [_txLivePlayer resume];
- }
- }
- _appIsInterrupt = NO;
- }
- }
- }
- */
- }
- #pragma mark - ----------------------- 自定义Toast -----------------------
- /**
- 获取指定宽度width的字符串在UITextView上的高度
- @param textView 待计算的UITextView
- @param width 限制字符串显示区域的宽度
- @return 返回的高度
- */
- - (float)heightForString:(UITextView *)textView andWidth:(float)width
- {
- CGSize sizeToFit = [textView sizeThatFits:CGSizeMake(width, MAXFLOAT)];
- return sizeToFit.height;
- }
- - (void)toastTip:(NSString*)toastInfo
- {
- NSLog(@"======playtoastInfo:%@",toastInfo);
-
- CGRect frameRC = [[UIScreen mainScreen] bounds];
- frameRC.origin.y = frameRC.size.height - 110;
- frameRC.size.height -= 110;
- __block UITextView * toastView = [[UITextView alloc] init];
-
- toastView.editable = NO;
- toastView.selectable = NO;
-
- frameRC.size.height = [self heightForString:toastView andWidth:frameRC.size.width];
-
- toastView.frame = frameRC;
-
- toastView.text = toastInfo;
- toastView.backgroundColor = [UIColor whiteColor];
- toastView.alpha = 0.5;
-
- [self.view addSubview:toastView];
-
- dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);
-
- dispatch_after(popTime, dispatch_get_main_queue(), ^(){
- [toastView removeFromSuperview];
- toastView = nil;
- });
- }
- #pragma mark - ----------------------- 创建按钮 -----------------------
- - (UIButton*)createBottomBtnIndex:(int)index Icon:(NSString*)icon Action:(SEL)action Gap:(int)gap Size:(int)size
- {
- UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
- btn.frame = CGRectMake((index+1)*gap + index*size, [[UIScreen mainScreen] bounds].size.height - size - 10, size, size);
- [btn setImage:[UIImage imageNamed:icon] forState:UIControlStateNormal];
- [btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:btn];
- return btn;
- }
- @end
|