亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

AVplayer的使用教程

2019-11-09 17:13:44
字體:
來源:轉載
供稿:網友

GitHub地址

公司做視頻服務的,寫了一個播放器Demo。主要功能都已經實現,自己再插入幾個控制控件。

先梳理幾個問題:

1.AVplayer的播放

2.uislider進度條

3.全屏模式

4.單個頁面強制橫屏

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

自定義一個view用來播放視頻。

////  PlayerView.m//  videodemo////  Created by meipaipai on 17/2/3.//  Copyright © 2017年 meipaipai. All rights reserved.//#import "PlayerView.h"#import "LykSlider.h"@interface PlayerView ()@PRoperty (nonatomic, strong) AVPlayer *player;@property (nonatomic, strong) AVPlayerItem *playerItem;@property (nonatomic ,strong) id playbackTimeObserver;@property (nonatomic, strong) NSString *totalTime;//視頻總時間@property (nonatomic, strong) NSDateFormatter *dateFormatter;//時間格式//控制臺@property (nonatomic, strong) UIView *controlView;//控制臺視圖@property (nonatomic, strong) UIButton *playButton;//播放按鈕@property (nonatomic, strong) LykSlider *playSlider;//進度條@property (nonatomic, strong) UILabel *playTime;//播放時間@property (nonatomic, strong) UIButton *fullScreen;//全屏@endstatic UIImage *thumbImage;@implementation PlayerView-(void)dealloc{    [self.playerItem removeObserver:self forKeyPath:@"status" context:nil];    [self.playerItem removeObserver:self forKeyPath:@"loadedTimeRanges" context:nil];    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];    [self.player removeTimeObserver:self.playbackTimeObserver];}-(instancetype)initWithFrame:(CGRect)frame{    self = [super initWithFrame:frame];    if (self) {        NSURL *videoUrl = [NSURL URLWithString:@"http://v.jxvdy.com/sendfile/w5bgP3A8JgiQQo5l0hvoNGE2H16WbN09X-ONHPq3P3C1BISgf7C-qVs6_c8oaw3zKScO78I--b0BGFBRxlpw13sf2e54QA"];        self.playerItem = [AVPlayerItem playerItemWithURL:videoUrl];        self.player = [AVPlayer playerWithPlayerItem:self.playerItem];        //解決iOS 10偶爾播放不了的問題        if([[UIDevice currentDevice] systemVersion].intValue>=10){            //      增加下面這行可以解決ios10兼容性問題了            self.player.automaticallyWaitsToMinimizeStalling = NO;        }                // 添加視頻播放結束通知        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayDidEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];        //  監聽status屬性        [self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];        //  監聽loadedTimeRanges屬性        [self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];        [self.player play];    }    return self;}//重寫layer方法+ (Class)layerClass {    return [AVPlayerLayer class];}//重寫get方法- (AVPlayer *)player {    return [(AVPlayerLayer *)[self layer] player];}//重寫set方法- (void)setPlayer:(AVPlayer *)player {    [(AVPlayerLayer *)[self layer] setPlayer:player];}//KVO-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{    AVPlayerItem *playerItem = (AVPlayerItem *)object;    if ([keyPath isEqualToString:@"status"]) {        //準備播放        if (playerItem.status == AVPlayerItemStatusReadyToPlay) {            // 轉換成秒            CGFloat totalSecond = playerItem.duration.value / playerItem.duration.timescale;            // 轉換成播放時間            self.totalTime = [self convertTime:totalSecond];            // 監聽播放狀態            [self monitoringPlayback:self.playerItem];            //控制臺UI            [self customVideoSlider:totalSecond];                    } else if (playerItem.status == AVPlayerStatusFailed) {            NSLog(@"播放失敗");        }    } else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {        NSTimeInterval timeInterval = [self availableDuration];// 計算緩沖進度        NSLog(@"Time Interval:%f",timeInterval);        CGFloat currentSecond = playerItem.currentTime.value / playerItem.currentTime.timescale;        //緩沖好后自動播放        if (timeInterval > currentSecond && self.playButton.selected == NO) {            [self.player play];        }    }}//緩沖- (NSTimeInterval)availableDuration {    NSArray *loadedTimeRanges = [[self.player currentItem] loadedTimeRanges];    CMTimeRange timeRange = [loadedTimeRanges.firstObject CMTimeRangeValue];// 獲取緩沖區域    float startSeconds = CMTimeGetSeconds(timeRange.start);    float durationSeconds = CMTimeGetSeconds(timeRange.duration);    NSTimeInterval result = startSeconds + durationSeconds;// 計算緩沖總進度    return result;}//視頻總時間轉換- (NSString *)convertTime:(CGFloat)second{    NSDate *d = [NSDate dateWithTimeIntervalSince1970:second];    if (second/3600 >= 1) {        [[self dateFormatter] setDateFormat:@"HH:mm:ss"];    } else {        [[self dateFormatter] setDateFormat:@"mm:ss"];    }    NSString *showtimeNew = [[self dateFormatter] stringFromDate:d];    return showtimeNew;}//dateFormatter懶加載- (NSDateFormatter *)dateFormatter {    if (!_dateFormatter) {        _dateFormatter = [[NSDateFormatter alloc] init];    }    return _dateFormatter;}//監聽播放狀態- (void)monitoringPlayback:(AVPlayerItem *)playerItem {        __weak typeof(self) weakSelf = self;    self.playbackTimeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:NULL usingBlock:^(CMTime time) {        // 計算當前在第幾秒        CGFloat currentSecond = playerItem.currentTime.value / playerItem.currentTime.timescale;        NSString *timeString = [weakSelf convertTime:currentSecond];        NSLog(@"%@", timeString);        weakSelf.playSlider.value = currentSecond;        weakSelf.playTime.text = [NSString stringWithFormat:@"%@/%@", timeString, weakSelf.totalTime];    }];}//自定義控制臺- (void)customVideoSlider:(CGFloat)second {    //控制臺視圖    self.controlView = [[UIView alloc] init];    self.controlView.alpha = 0.8;    self.controlView.backgroundColor = [UIColor blackColor];    [self addSubview:self.controlView];    //播放按鈕    float itemY = self.controlView.bounds.size.height / 6;    self.playButton = [UIButton buttonWithType:UIButtonTypeCustom];    if (self.playButton.selected) {        [self.playButton setImage:[UIImage imageNamed:@"videoPlay"] forState:UIControlStateNormal];    } else {        [self.playButton setImage:[UIImage imageNamed:@"videoStop"] forState:UIControlStateNormal];    }    [self.playButton addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchDown];    [self.controlView addSubview:self.playButton];    //視頻時間    self.playTime = [[UILabel alloc] init];    self.playTime.textColor = [UIColor whiteColor];    self.playTime.font = [UIFont systemFontOfSize:itemY * 2];    self.playTime.text = [NSString stringWithFormat:@"00:00/%@", self.totalTime];    [self.controlView addSubview:self.playTime];    //全屏    self.fullScreen = [UIButton buttonWithType:UIButtonTypeCustom];    [self.fullScreen setImage:[UIImage imageNamed:@"videoBig"] forState:UIControlStateNormal];    [self.fullScreen addTarget:self action:@selector(clickFullButton:) forControlEvents:UIControlEventTouchDown];    [self.controlView addSubview:self.fullScreen];    //進度條    self.playSlider = [[LykSlider alloc] init];    self.playSlider.minimumValue = 0;// 設置最小值    self.playSlider.maximumValue = second;// 設置最大值    self.playSlider.value = 0;// 設置初始值    self.playSlider.continuous = NO;// 設置可連續變化,yes連續變化會觸發方法,no當滑塊拖動停止會觸發方法    [self.playSlider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];    [self.controlView addSubview:self.playSlider];        [self changeFrame:self.frame];}//控制臺按鈕點擊事件-(void)clickButton:(UIButton *)sender{    sender.selected = !sender.selected;    if (sender.selected) {        [self.playButton setImage:[UIImage imageNamed:@"videoPlay"] forState:UIControlStateNormal];        [self.player pause];    } else {        [self.playButton setImage:[UIImage imageNamed:@"videoStop"] forState:UIControlStateNormal];        [self.player play];    }}//全屏按鈕點擊事件-(void)clickFullButton:(UIButton *)sender{    sender.selected = !sender.selected;    if (sender.selected) {        [self.fullScreen setImage:[UIImage imageNamed:@"videoSmall"] forState:UIControlStateNormal];        //調用全屏block        self.pushBlockWithView();    } else {        [self.fullScreen setImage:[UIImage imageNamed:@"videoBig"] forState:UIControlStateNormal];        //調用小屏block        self.popBlockWithView();    }}//改變frame-(void)changeFrame:(CGRect)frame{    self.frame = frame;    self.controlView.frame = CGRectMake(0, self.bounds.size.height / 7 * 6, self.bounds.size.width, self.bounds.size.height / 7);    float itemY = self.controlView.bounds.size.height / 6;    self.playButton.frame = CGRectMake(itemY, itemY, self.controlView.bounds.size.height - itemY * 2, self.controlView.bounds.size.height - itemY * 2);    self.playTime.frame = CGRectMake(self.playButton.frame.size.width + itemY * 6, itemY * 2, 200, itemY * 2);    self.playTime.font = [UIFont systemFontOfSize:itemY * 2];    self.fullScreen.frame = CGRectMake(self.bounds.size.width - self.controlView.bounds.size.height, itemY, self.controlView.bounds.size.height - itemY * 2, self.controlView.bounds.size.height - itemY * 2);    self.playSlider.frame = CGRectMake(0, -itemY, self.controlView.bounds.size.width, itemY * 2);    thumbImage = [self OriginImage:[UIImage imageNamed:@"videoThum"] scaleToSize:CGSizeMake(itemY * 2, itemY * 2)];    [self.playSlider setThumbImage:thumbImage forState:UIControlStateNormal];}//裁剪圖片大小-(UIImage *)OriginImage:(UIImage *)image scaleToSize:(CGSize)size {    UIGraphicsBeginImageContext(size);  //size 為CGSize類型,即你所需要的圖片尺寸    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return scaledImage;   //返回的就是已經改變的圖片}//進度條拖動方法-(void)sliderValueChanged:(UISlider *)sender{    [self.player seekToTime:CMTimeMake(sender.value,1)];}//播放完成處理- (void)moviePlayDidEnd:(NSNotification *)notification {    [self.player seekToTime:kCMTimeZero completionHandler:^(BOOL finished) {    }];}@end

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

解決問題:

1.uislider滑塊大小無法控制

解決:

自定義圖片更改滑塊圖片

- (void)setThumbImage:(nullable UIImage *)image forState:(UIControlState)state;

通過控制圖片大小來改變滑塊大小

//裁剪圖片大小-(UIImage *)OriginImage:(UIImage *)image scaleToSize:(CGSize)size {    UIGraphicsBeginImageContext(size);  //size 為CGSize類型,即你所需要的圖片尺寸    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return scaledImage;   //返回的就是已經改變的圖片}2.uislider滑塊拖動不靈敏,有時點不中

解決:傳言都說uislider frame的高度沒用,實際高度是一個范圍,只是對樣式沒有改變,問題的原因就是高度值太小,點不中。

3.視頻播放不了

解決:iOS 10版本問題,avplayer新增屬性automaticallyWaitsToMinimizeStalling,設置為no就可以

4.全屏強制橫屏

解決:

appdelegate.h

#import <UIKit/UIKit.h>@interface AppDelegate : UIResponder <UIapplicationDelegate>@property (strong, nonatomic) UIWindow *window;/** *  是否強制橫屏 */@property  BOOL isForceLandscape;/** *  是否強制豎屏 */@property  BOOL isForcePortrait;@endappdelegate.m

static AppDelegate *_appDelegate;+(AppDelegate *)appDelegate{    return _appDelegate;}-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{        if (self.isForceLandscape) {        return UIInterfaceOrientationMaskLandscape;    }else if (self.isForcePortrait){        return UIInterfaceOrientationMaskPortrait;    }    return UIInterfaceOrientationMaskAll;}需要橫屏的viewcontroller加入下列代碼

-(void)viewWillAppear:(BOOL)animated{    [self forceOrientationLandscape];}/** *  強制橫屏 */-(void)forceOrientationLandscape{    //這段代碼,只能旋轉屏幕不能達到強制橫屏的效果    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {        SEL selector = NSSelectorFromString(@"setOrientation:");        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];        [invocation setSelector:selector];        [invocation setTarget:[UIDevice currentDevice]];        int val = UIInterfaceOrientationLandscapeRight;        [invocation setArgument:&val atIndex:2];        [invocation invoke];    }    //加上代理類里的方法,旋轉屏幕可以達到強制橫屏的效果    AppDelegate *appdelegate=(AppDelegate *)[UIApplication sharedApplication].delegate;    appdelegate.isForceLandscape=YES;    [appdelegate application:[UIApplication sharedApplication] supportedInterfaceOrientationsForWindow:self.view.window];}-(void)viewWillDisappear:(BOOL)animated{    AppDelegate *appdelegate=(AppDelegate *)[UIApplication sharedApplication].delegate;    appdelegate.isForcePortrait=NO;    appdelegate.isForceLandscape=NO;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品magnet| 在线观看视频亚洲| 欧美日韩国产999| 国产精品影片在线观看| 欧美中文字幕在线视频| 国产精品视频一区二区高潮| 亚洲肉体裸体xxxx137| 亚洲人成网站免费播放| 欧美巨乳在线观看| 久久久久一本一区二区青青蜜月| 国产日韩欧美视频| 欧美日韩中文字幕日韩欧美| 欧美中在线观看| 成人网在线免费看| 国产精品网址在线| 亚洲精品日韩欧美| 亚洲第一男人天堂| 亚洲欧美制服中文字幕| 久久久久久999| 色综合视频一区中文字幕| 成人欧美一区二区三区在线湿哒哒| 668精品在线视频| 深夜成人在线观看| 日韩av片免费在线观看| 国产精品久久久久久久久久免费| 欧美肥臀大乳一区二区免费视频| 亚洲第一区第一页| 欧美性受xxx| 久久视频国产精品免费视频在线| 一区二区三区在线播放欧美| 少妇久久久久久| 国产成人精品免费久久久久| 久久人人爽国产| 成人欧美一区二区三区黑人孕妇| 久久人人97超碰精品888| 51色欧美片视频在线观看| 亚洲伦理中文字幕| 欧美日韩国内自拍| 国语自产精品视频在线看一大j8| 亚洲一区二区国产| 国产精品久久97| 国产日韩欧美在线观看| 久久久久久久影视| 91最新在线免费观看| 国产一区二区在线播放| 91在线观看免费高清完整版在线观看| 欧美性jizz18性欧美| 日韩av资源在线播放| 欧美日本在线视频中文字字幕| 午夜精品一区二区三区视频免费看| 久久99精品视频一区97| 成人免费网站在线看| 亚洲国产日韩欧美在线99| 久久久久久伊人| 福利一区福利二区微拍刺激| 亚洲男女自偷自拍图片另类| 福利一区视频在线观看| 欧美大片在线看免费观看| 国产z一区二区三区| 欧美成人中文字幕在线| 国产精品视频久| 日韩一区二区三区xxxx| 国产伦精品免费视频| 欧美一级视频在线观看| 欧美午夜无遮挡| 亚洲欧美日韩一区二区三区在线| 久久久久久久久久久91| 国产精品一区二区在线| 国产成人精品综合久久久| 欧美多人乱p欧美4p久久| 日韩欧美在线国产| 宅男66日本亚洲欧美视频| 国产精品一区二区久久久久| 亚洲天堂视频在线观看| 91精品视频免费看| 日韩资源在线观看| 日韩精品中文字幕在线播放| 亚洲欧美三级在线| 日韩欧美精品免费在线| 成人免费xxxxx在线观看| 国产一级揄自揄精品视频| 一级做a爰片久久毛片美女图片| 欧美一级片久久久久久久| 久久久91精品国产| 国产一区二区免费| 久久99精品久久久久久青青91| 2019亚洲日韩新视频| 久久99青青精品免费观看| 日韩资源在线观看| 97精品一区二区视频在线观看| 亚洲美女自拍视频| 国产成人短视频| 国产精品午夜视频| 日韩av中文字幕在线免费观看| 色先锋资源久久综合5566| 国产一区二区丝袜高跟鞋图片| 久热99视频在线观看| 91亚洲精品视频| 色青青草原桃花久久综合| 国产精品爱啪在线线免费观看| 欧美一级视频免费在线观看| 亚洲第一男人av| 国产伦精品免费视频| 4438全国亚洲精品在线观看视频| 亚洲自拍中文字幕| 免费99精品国产自在在线| 有码中文亚洲精品| 国产精品96久久久久久又黄又硬| 精品性高朝久久久久久久| 国内精品伊人久久| 久久影视三级福利片| 久久综合五月天| 久久精品久久久久久| 不卡av在线网站| 日韩一区二区久久久| 91久久精品国产91性色| 日韩在线激情视频| 欧美电影免费观看大全| 麻豆国产精品va在线观看不卡| 日韩中文在线不卡| 7777kkkk成人观看| 中文字幕日韩欧美在线| 中文日韩电影网站| 91午夜理伦私人影院| 国产精品视频免费在线观看| 日本一欧美一欧美一亚洲视频| 精品久久久久久中文字幕大豆网| 亚洲第一区第二区| 国产精品视频一| 国产精品久久不能| 精品国产一区二区三区久久狼黑人| 国产精品黄色影片导航在线观看| 91在线视频免费| 亚洲乱码av中文一区二区| 色偷偷av亚洲男人的天堂| 最近的2019中文字幕免费一页| 欧美疯狂性受xxxxx另类| 国产91网红主播在线观看| 97色在线观看免费视频| 国产精品永久免费视频| 国产精品日韩精品| 亚洲国产欧美自拍| 欧美另类高清videos| 欧美激情精品久久久久久| 亚洲人成人99网站| 久久国产精品免费视频| 亚洲免费成人av电影| 91亚洲国产成人久久精品网站| 亚洲成人精品久久| 自拍偷拍免费精品| 欧美成人午夜激情在线| 国产偷国产偷亚洲清高网站| 88国产精品欧美一区二区三区| 亚洲激情视频网| 91在线视频成人| 欧美性在线视频| 亚洲成人999| 日韩亚洲国产中文字幕| 欧美日韩一区二区三区在线免费观看| 亚洲人线精品午夜| 国产91在线高潮白浆在线观看| 久久免费精品日本久久中文字幕| 羞羞色国产精品| 另类少妇人与禽zozz0性伦|