zoukankan      html  css  js  c++  java
  • 视频播放(iOS开发)

    视频播放

    一.视频播放介绍(5种实现方案)

    1. AVPlayer
      • 优点
        • 可以自定义UI,进行控制
      • 缺点
        • 单纯的播放,没有控制UI,而且如果要显示播放界面,需要借助AVPlayerLayer,添加图层到需要展示的图层上
    2. MPMoviePlayerController
      • 优点
        • 自带播放控制UI,不需要手动添加
      • 缺点
        • 不能自定义UI
        • 只能将此控制器视图添加到其他视图进行展示
        • 此控制器不是视图控制器,不能弹出
    3. MPMoviePlayerViewController
      • 优点
        • 自带播放控制UI,不需要手动添加
        • 此控制器是视图控制器,可以弹出,可以压栈
        • 也可以手动调整视图大小,添加其他视图上
      • 缺点
        • 不能自定义UI
    4. 针对第2/3种情况,在iOS9之后,统一使用AVPlayerViewController
      • 优点
        • 自带播放控制UI,不需要手动添加
        • 此控制器是视图控制器,可以弹出,可以压栈
        • 也可以手动调整视图大小,添加到其他视图上
      • 缺点
        • 不能自定义UI
    5. 第三方框架Vitamio

    二.使用AVPlayer播放远程视频

    1.实现播放功能

    1. 通过远程URL创建AVPlayer
    2. 开始播放
      • [self.player play];
    3. 存在问题
      • 只能播放声音,看不到图像
      • 解决方案:需要借助AVPlayerLayer对象,根据player创建图层,添加到视图上

    2.实现视频显示功能

    1. 根据player对象,创建AVPlayerLayer对象
      • AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    2. 设置图层AVPlayerLayer的大小
      • layer.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
    3. 添加到需要展示的视图上即可
      • [self.view.layer addSublayer:layer];

    3.封装专门用于播放的视图

    • 主要封装一些操作的工具条

    备注

    • iOS9.0网络请求(ATS)适配(HTTPS->HTTP)
    • NSAppTransportSecurity
    • NSAllowsArbitraryLoads->true

    三.使用MPMoviePlayerController播放视频

    • 相比于AVPlayer播放,自带一些控制按钮
    • 导入MediaPlayer框架
    • 根据URL创建控制器MPMoviePlayerController
    • 设置播放视图frame,添加到需要展示的视图上
      • 设置播放视图的frame
        • self.moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
      • 设置播放视图控制样式
        • self.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
      • 添加播放视图到要显示的视图
        • [self.view addSubview:self.moviePlayer.view];
    • 播放
      • [self.moviePlayer play];
    • 注意事项
      • 此控制器不是视图控制器,不能直接弹出
      • 播放器的播放状态,是通过通知的方式告诉外界

    四.使用MPMoviePlayerViewController播放视频

    • 导入MediaPlayer框架
    • 根据URL创建控制器MPMoviePlayerViewController
    • 直接modal弹出该控制器(或者设置播放视图frame,添加到需要展示的视图上)
      • [self presentViewController:self.playerVC animated:YES completion:nil];
    • 播放
      • [self.playerVC.moviePlayer play];

    五.iOS9.0之后,需要使用AVPlayerViewController

    • 导入框架
      • AVFoundation
      • AVKit
    • 根据URL创建AVPlayer
    • 根据AVPlayer,创建AVPlayerViewController控制器
      • self.playerVC = [[AVPlayerViewController alloc] init];
      • self.playerVC.player = player;
    • 设置播放视图frame,添加到需要展示的视图上
      • 设置播放视图的frame
        • self.playerVC.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
      • 添加播放视图到要显示的视图
        • [self.view addSubview:self.playerVC.view];
      • 或者直接弹出此控制器
        • [self presentViewController:self.playerVC animated:YES completion:nil];
    • 播放
      • [self.playerVC.player play];

    六.Vitamio框架

    • 官网
    • 主要功能
      • Vitamio能够流畅播放720P甚至1080P高清mkv/flv/mp4/mov/ts/rmvb等常见格式的视频
      • 还可以在Android和iOS上跨平台支持mms/rtsp/rtmp/hls(m3u8)等常见的多种视频流媒体协议,包括直播与点播
    • 使用权限
      • 非个人移动应用均需购买Vitamio使用授权
      • 标准免费版仅限于个人开发者使用
    • 使用步骤
      • 导入框架
      • 添加系统依赖库
      • 项目配置
        • TARGETS->Build Settings->Other Linker Flags->"-OjbC"
      • 导入头文件
        • #import "Vitamio.h"
      • 代码实现
        • 获取单例
          • VMediaPlayer.sharedInstance()
        • 设置承载式图,以及代理
          • mMPlayer.setupPlayerWithCarrierView(view,withDelegate:self)
        • 设置数据源
          • mMPlayer.setDataSource(NSURL(string:videoUrl),header:nil)
        • 异步准备视频
          • mMPlayer.prepareAsync()
        • 在代理方法中开始播放(VMediaPlayerDelegate)
    // 当'播放器准备完成'时, 该协议方法被调用, 我们可以在此调用 [player start] 来开始音视频的播放.
    func mediaPlayer(player: VMediaPlayer!, didPrepared arg: AnyObject!) {
        mMPayer.start()
    }
    
    // 当'该音视频播放完毕'时, 该协议方法被调用, 我们可以在此作一些播放器善后操作, 如: 重置播放器, 准备播放下一个音视频等
    func mediaPlayer(player: VMediaPlayer!, playbackComplete arg: AnyObject!) {
        player.reset()
    }
    
    // 如果播放由于某某原因发生了错误, 导致无法正常播放, 该协议方法被调用, 参数 arg 包含了错误原因.
    func mediaPlayer(player: VMediaPlayer!, error arg: AnyObject!) {
        print("nal")
    }
    
    
    	- 暂停播放
    		- mMPlayer.pause()
    	- 停止播放
    		- mMPlayer.reset()
    		- mMPlayer.unSetupPlayer()
    	- 继续播放
    		- mMPlayer.start()
    	- 倍速播放
    		- mMPlayer.setPlaybackSpeed
    	- 播放到指定时间
    		- seekTo
  • 相关阅读:
    从运维域看 Serverless 真的就是万能银弹吗?
    C#技术漫谈之垃圾回收机制(GC)(转)
    题解 hdu4624 Endless Spin
    JS递归删除所有子元素【原】
    Asp.Net 生成验证图片
    mouseover显示层mouseout隐藏层,并且在鼠标放上层时显示层【原】
    C# yield关键字的使用
    MS SQL SERVER中的临时表
    猫 老鼠 人的编程题
    面试题:接口和抽象类的区别 【转】
  • 原文地址:https://www.cnblogs.com/coderwjq/p/6236921.html
Copyright © 2011-2022 走看看