03.音頻視頻播放 音頻視頻播放

@(iOS Study)[音視頻播放]


目錄

  • 03.音頻視頻播放 音頻視頻播放知識(shí)點(diǎn) (自己整理)
    • 音頻/視頻播放
  • 1.播放網(wǎng)絡(luò)音樂(lè)(AVPlayer)
    • 創(chuàng)建AVPlayer的幾種方式
    • 播放網(wǎng)絡(luò)音樂(lè)
  • 2.播放網(wǎng)絡(luò)視頻(AVPlayer)
    • 使用AVPlayer實(shí)現(xiàn)網(wǎng)絡(luò)視頻的播放
  • 3.MPMoviePlayerController視頻播放器控制器實(shí)現(xiàn)播放視頻
    • MPMoviePlayerController播放視頻
  • 4.MPMoviePlayerViewController播放網(wǎng)絡(luò)視頻
    • MPMoviePlayerViewController播放視頻
  • 5.使用AVPlayerViewController播放網(wǎng)絡(luò)視頻
    • 使用AVKit/AVKit框架中的AVPlayerViewController播放視頻
  • 6.Vitamio SDK的集成
    • Vitamio SDK功能介紹
  • 7.SizeClasses的簡(jiǎn)單使用
    • 屏幕適配
    • SizeClasses簡(jiǎn)述

音頻/視頻播放


1.播放網(wǎng)絡(luò)音樂(lè)(AVPlayer)

創(chuàng)建AVPlayer的幾種方式

  • 通過(guò)url創(chuàng)建AVPlayer播放器,使用playerWithURL方法創(chuàng)建播放器
  • 通過(guò)AVPlayerItem創(chuàng)建AVPlayer播放器,使用playerWithPlayerItem方法創(chuàng)建播放器

播放網(wǎng)絡(luò)音樂(lè)

  • 播放網(wǎng)絡(luò)音樂(lè),實(shí)現(xiàn)播放網(wǎng)絡(luò)音樂(lè),切換音樂(lè)
    • 切換音樂(lè),使用replaceCurrentItemWithPlayerItem切換音樂(lè)
NSURL *url = [NSURL URLWithString:@"http://tsmusic128.tc.qq.com/37023937.mp3"];
AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
[self.player replaceCurrentItemWithPlayerItem:item]; 
  • 參考代碼
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

/** 創(chuàng)建播放器 */
@property (nonatomic, strong) AVPlayer *player;

@end

@implementation ViewController

- (IBAction)playOneLine {
    // 播放音樂(lè)
    [self.player play];
}
- (IBAction)otherMusic {
    NSURL *url = [NSURL URLWithString:@"http://tsmusic128.tc.qq.com/37023937.mp3"];
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
    
    // SINGLE: 切換音樂(lè)
    [self.player replaceCurrentItemWithPlayerItem:item];
}

/** 懶加載 */
- (AVPlayer *)player
{
    if (_player == nil) {
        // REMARKS: 創(chuàng)建播放器,通過(guò)playerWithPlayerItem方法創(chuàng)建音樂(lè)播放器,播放網(wǎng)絡(luò)音樂(lè)
        NSURL *url = [NSURL URLWithString:@"http://cc.stream.qqmusic.qq.com/C100003j8IiV1X8Oaw.m4a?fromtag=52"];
        AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
        _player = [AVPlayer playerWithPlayerItem:item];
    }
    
    return _player;
}

2.播放網(wǎng)絡(luò)視頻(AVPlayer)

AVPlayer屬于AVFoundation框架

使用AVPlayer實(shí)現(xiàn)網(wǎng)絡(luò)視頻的播放

  • AVPlayer播放網(wǎng)絡(luò)視頻
    • 創(chuàng)建AVPlayerLayer,設(shè)置AVPlayerLayer的frame,并添加到控制器view的Layer上,實(shí)現(xiàn)視頻播放
      • 使用playerLayerWithPlayer方法創(chuàng)建AVPlayerLayer
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
    playerLayer.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.width * 9 / 16);
    [self.view.layer addSublayer:playerLayer]; 
  • AVPlayer播放網(wǎng)絡(luò)視頻示例代碼
// REMARKS: 通過(guò)AVPlayer實(shí)現(xiàn)視頻播放
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.player play];
}

/** 懶加載AVPlayer */
- (AVPlayer *)player
{
    if (_player == nil) {
        
        // 創(chuàng)建AVPlayer
        NSURL *url = [NSURL URLWithString:@"http://v1.mukewang.com/19954d8f-e2c2-4c0a-b8c1-a4c826b5ca8b/L.mp4"];
        AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
        _player = [AVPlayer playerWithPlayerItem:item];
        
        // SINGLE: 使用playerLayerWithPlayer方法創(chuàng)建AVPlayerLayer,并設(shè)置AVPlayerLayer的frame,添加到控制器的view的Layer上,實(shí)現(xiàn)視頻播放
        AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
        playerLayer.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.width * 9 / 16);
        [self.view.layer addSublayer:playerLayer];
    }
    return _player;
}

3.MPMoviePlayerController視頻播放器控制器實(shí)現(xiàn)播放視頻

MPMoviePlayerController視頻播放器控制器屬于MediaPlayer框架

MPMoviePlayerController播放視頻

  • 使用MPMoviePlayerController播放視頻步驟
    • 創(chuàng)建MPMoviePlayerController視頻播放器
    • 設(shè)置播放器view的frame
    • 將播放器的view添加到當(dāng)前控制器的view上
    • 設(shè)置全屏播放,橫豎屏切換有問(wèn)題
      _playerController.controlStyle = MPMovieControlStyleFullscreen;
    • 播放視頻[self.playerController play];
  • MPMoviePlayerController播放視頻示例代碼
#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>

@interface ViewController ()

/** MPMoviePlayerController視頻播放器控制器 */
@property (nonatomic, strong) MPMoviePlayerController *playerController;

@end

@implementation ViewController

// REMARKS: 使用MPMoviePlayerController播放視頻

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.playerController play];
}

- (MPMoviePlayerController *)playerController
{
    if (_playerController == nil) {
        
        NSURL *url = [NSURL URLWithString:@"http://v1.mukewang.com/19954d8f-e2c2-4c0a-b8c1-a4c826b5ca8b/L.mp4"];
        // 創(chuàng)建視頻播放器
        _playerController = [[MPMoviePlayerController alloc] initWithContentURL:url];
        // 設(shè)置播放器view的frame
        _playerController.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.width * 9 / 16);
        
        // 將播放器的view添加到當(dāng)前控制器的view上
        [self.view addSubview:_playerController.view];
        
        // SINGLE: 設(shè)置全屏播放,橫豎屏切換有問(wèn)題
//        _playerController.controlStyle = MPMovieControlStyleNone;
        _playerController.controlStyle = MPMovieControlStyleFullscreen;
    }
    return _playerController;
}

@end

4.MPMoviePlayerViewController播放網(wǎng)絡(luò)視頻

MPMoviePlayerViewController屬于MediaPlayer框架

MPMoviePlayerViewController播放視頻

  • MPMoviePlayerViewController播放視頻實(shí)現(xiàn)步驟
    • MPMoviePlayerViewController繼承UIViewController,所以播放器可以直接用Modal方式展示
#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController ()

@property (nonatomic, strong) MPMoviePlayerViewController *moviePlayerController;

@end

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self presentViewController:self.moviePlayerController animated:YES completion:nil];
}

// REMARKS: 使用MPMoviePlayerViewController播放視頻
- (MPMoviePlayerViewController *)moviePlayerController
{
    if (_moviePlayerController == nil) {
        NSURL *url = [NSURL URLWithString:@"http://v1.mukewang.com/19954d8f-e2c2-4c0a-b8c1-a4c826b5ca8b/L.mp4"];
        _moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
    }
    return _moviePlayerController;
}

@end

5.使用AVPlayerViewController播放網(wǎng)絡(luò)視頻

AVPlayerViewController屬于AVKit框架

使用AVKit/AVKit框架中的AVPlayerViewController播放視頻

  • 示例代碼
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>

@interface ViewController ()

@property (nonatomic, strong) AVPlayerViewController *playerViewController;

@end

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self presentViewController:self.playerViewController animated:YES completion:nil];
}

// REMARKS: 使用AVKit/AVKit框架中的AVPlayerViewController播放視頻
- (AVPlayerViewController *)playerViewController
{
    if (_playerViewController == nil) {
        
        NSURL *url = [NSURL URLWithString:@"http://v1.mukewang.com/19954d8f-e2c2-4c0a-b8c1-a4c826b5ca8b/L.mp4"];
        AVPlayer *player = [AVPlayer playerWithURL:url];
        
        _playerViewController = [[AVPlayerViewController alloc] init];
        _playerViewController.player = player;
    }
    return _playerViewController;
}

@end

6.Vitamio SDK的集成

Vitamio SDK功能介紹

  • 功能介紹

    • 1.可手動(dòng)切換全半屏狀態(tài)
    • 2.切換播放速率
    • 3.切換視頻
    • 4.支持橫豎屏
    • 5.支持本地與網(wǎng)絡(luò)視頻
  • Vitamio SDK的github鏈接


7.SizeClasses的簡(jiǎn)單使用

屏幕適配

  • 1.為什么蘋(píng)果推出SizeClasses
    • iPhone3gs-4s : frame直接寫(xiě)死
    • iPad : autoresizing—>根據(jù)父控件frame發(fā)生改變,子控件跟著一起改變
    • iPhone5-iPhone5s : autolayout —>自動(dòng)布局
    • iPhone6和iPhone6p : size Classes—>發(fā)現(xiàn)屏幕變的太多樣化,界面大統(tǒng)一

SizeClasses簡(jiǎn)述

  • SizeClasses概念

    • 僅僅是對(duì)屏幕進(jìn)行了分類, 真正排布UI元素還得使用autolayout
    • 不再有橫豎屏的概念, 只有屏幕尺寸的概念
    • 不再有具體尺寸的概念, 只有抽象尺寸的概念
  • 把寬度和高度各分為3種情況

    • Compact : 緊湊(小)
    • Any : 任意
    • Regular : 寬松(大)
  • SizeClasses可分為9類

1.SizeClasses可分為9類.png
  • 練習(xí)SizeClasses

    • 練習(xí)1:UIButton手機(jī)橫屏的時(shí)候顯示,豎屏的時(shí)候不顯示
    • 練習(xí)2:橫屏的時(shí)候在左上角,豎屏的時(shí)候,在右下角
    • 練習(xí)3:iPad當(dāng)中也顯示在中間
    • 練習(xí)4:圖片的顯示 : 一般情況下顯示一張圖片,iPad顯示特有的圖片
    • 練習(xí)5:Label的顯示
    • 練習(xí)6:約束沖突
  • 符號(hào)代表
    減號(hào)- 表示 Compact
    乘號(hào) 表示 Any*
    加號(hào)+ 表示 Regular

    • storyboard SizeClasses截圖
2.storyboard SizeClasses截圖.png
  • 繼承性

    w:Compact h:Compact 繼承 (w:Any h:Compact , w:Compact h:Any , w:Any h:Any)
    w:Regular h:Compact 繼承 (w:Any h:Compact , w:Regular h:Any , w:Any h:Any)
    w:Compact h:Regular 繼承 (w:Any h:Regular , w:Compact h:Any , w:Any h:Any)
    w:Regular h:Regular 繼承 (w:Any h:Regular , w:Regular h:Any , w:Any h:Any)

  • 設(shè)備對(duì)應(yīng)屏幕

    iPhone4S,iPhone5/5s,iPhone6
    豎屏:(w:Compact h:Regular)
    橫屏:(w:Compact h:Compact)
    iPhone6 Plus
    豎屏:(w:Compact h:Regular)
    橫屏:(w:Regular h:Compact)
    iPad
    豎屏:(w:Regular h:Regular)
    橫屏:(w:Regular h:Regular)
    Apple Watch(猜測(cè))
    豎屏:(w:Compact h:Compact)
    橫屏:(w:Compact h:Compact)

  • sizeclass和autolayout的作用

    sizeclass:僅僅是對(duì)屏幕進(jìn)行了分類
    autolayout:對(duì)屏幕中各種元素進(jìn)行約束(位置\尺寸)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哪替,一起剝皮案震驚了整個(gè)濱河市鄙早,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伯襟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沸呐,死亡現(xiàn)場(chǎng)離奇詭異断部,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)朵你,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)各聘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人抡医,你說(shuō)我怎么就攤上這事躲因。” “怎么了忌傻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵大脉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我水孩,道長(zhǎng)镰矿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任俘种,我火速辦了婚禮秤标,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘安疗。我一直安慰自己抛杨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布荐类。 她就那樣靜靜地躺著怖现,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玉罐。 梳的紋絲不亂的頭發(fā)上屈嗤,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音吊输,去河邊找鬼饶号。 笑死,一個(gè)胖子當(dāng)著我的面吹牛季蚂,可吹牛的內(nèi)容都是我干的茫船。 我是一名探鬼主播琅束,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼算谈!你這毒婦竟也來(lái)了涩禀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤然眼,失蹤者是張志新(化名)和其女友劉穎艾船,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體高每,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屿岂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲸匿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爷怀。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晒骇,靈堂內(nèi)的尸體忽然破棺而出霉撵,到底是詐尸還是另有隱情磺浙,我是刑警寧澤洪囤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站撕氧,受9級(jí)特大地震影響瘤缩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伦泥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一剥啤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧不脯,春花似錦府怯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至复局,卻和暖如春冲簿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亿昏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工峦剔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人角钩。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓吝沫,卻偏偏與公主長(zhǎng)得像呻澜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惨险,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容