iOS - MPMoviePlayer 视频播放

简介: 前言 MP_EXTERN_CLASS_AVAILABLE(3_2) NS_DEPRECATED_IOS(3_2, 9_0, "Use AVPlayerViewController in AVKit.

前言

    MP_EXTERN_CLASS_AVAILABLE(3_2) NS_DEPRECATED_IOS(3_2, 9_0, "Use AVPlayerViewController in AVKit.")
    @interface MPMoviePlayerViewController : UIViewController
     
    @available(iOS, introduced=3.2, deprecated=9.0, message="Use AVPlayerViewController in AVKit.")
    public class MPMoviePlayerViewController : UIViewController
    
    
    MP_EXTERN_CLASS_AVAILABLE(2_0) NS_DEPRECATED_IOS(2_0, 9_0, "Use AVPlayerViewController in AVKit.")
    @interface MPMoviePlayerController : NSObject <MPMediaPlayback>
    
    @available(iOS, introduced=2.0, deprecated=9.0, message="Use AVPlayerViewController in AVKit.")
    public class MPMoviePlayerController : NSObject, MPMediaPlayback
  • 视频播放:
    • 添加库文件:MediaPlayer.framework
    • 包含头文件:#import <MediaPlayer/MediaPlayer.h>

1、本地/网络视频播放

1.1 使用 MPMoviePlayerViewController 播放

  • Objective-C

        // 添加库文件:MediaPlayer.framework
        // 包含头文件:#import <MediaPlayer/MediaPlayer.h>
    
        // 声明媒体播放控件
        @property(nonatomic, retain)MPMoviePlayerViewController *mpMoviePlayerVC;
    
        // 加载文件路径,加载本地视频
        NSURL *mediaUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"步步高手机" ofType:@"mp4"]];
    
        // 加载文件路径,加载网络视频
        NSURL *mediaUrl = [NSURL URLWithString:@"http://w2.dwstatic.com/1/5/1525/127352-100-1434554639.mp4"];
    
        // 实例化媒体播放控件
        mpMoviePlayerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:mediaUrl];
    
        // 弹出播放页面,开始播放
        [self presentMoviePlayerViewControllerAnimated: mpMoviePlayerVC];
  • Swift

        // 添加库文件:MediaPlayer.framework
        // 包含头文件:import MediaPlayer
    
        // 声明媒体播放控件
        var mpMoviePlayerVC:MPMoviePlayerViewController!
    
        // 加载文件路径,加载本地视频
        let mediaUrl:NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("步步高手机", ofType: "mp4")!)
    
        // 加载文件路径,加载网络视频
        let mediaUrl:NSURL = NSURL(string: "http://w2.dwstatic.com/1/5/1525/127352-100-1434554639.mp4")!
    
        // 实例化媒体播放控件
        mpMoviePlayerVC = MPMoviePlayerViewController(contentURL: mediaUrl)
    
        // 弹出播放页面,开始播放
        self.presentMoviePlayerViewControllerAnimated(mpMoviePlayerVC)

1.2 使用 MPMoviePlayerController 播放

  • Objective-C

        // 添加库文件:MediaPlayer.framework
        // 包含头文件:#import <MediaPlayer/MediaPlayer.h>
    
        // 声明媒体播放控件
        @property(nonatomic, retain)MPMoviePlayerController *mpMoviePlayer;
    
        // 加载文件路径,加载本地视频
        NSURL *mediaUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"步步高手机" ofType:@"mp4"]];
    
        // 加载文件路径,加载网络视频
        NSURL *mediaUrl = [NSURL URLWithString:@"http://w2.dwstatic.com/1/5/1525/127352-100-1434554639.mp4"];
    
        // 实例化媒体播放控件
        mpMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaUrl];
    
        // 添加播放页面,开始播放
        [self.view addSubview:mpMoviePlayer.view];
    
        // 设置是否全屏播放,必须设置,必须放在添加页面之后设置,为 NO 时,必须设置 mpMoviePlayer.view.frame
        mpMoviePlayer.fullscreen = YES;
  • Swift

        // 添加库文件:MediaPlayer.framework
        // 包含头文件:import MediaPlayer
    
        // 声明媒体播放控件
        var mpMoviePlayer:MPMoviePlayerController!
    
        // 加载文件路径,加载本地视频
        let mediaUrl:NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("步步高手机", ofType: "mp4")!)
    
        // 加载文件路径,加载网络视频
        let mediaUrl:NSURL = NSURL(string: "http://w2.dwstatic.com/1/5/1525/127352-100-1434554639.mp4")!
    
        // 实例化媒体播放控件
        mpMoviePlayer = MPMoviePlayerController(contentURL: mediaUrl)
    
        // 添加播放页面,开始播放
        self.view.addSubview(mpMoviePlayer.view)
    
        // 设置是否全屏播放,必须设置,必须放在添加页面之后设置,为 NO 时,必须设置 mpMoviePlayer.view.frame
        mpMoviePlayer.fullscreen = true

2、本地/网络视频播放设置

2.1 使用 MPMoviePlayerViewController 播放

  • Objective-C

        // 显示播放页面
        /*
            弹出播放页面,开始播放
        */
        [self presentMoviePlayerViewControllerAnimated: mpMoviePlayerVC];
    
        // 开始播放
        [mpMoviePlayerVC.moviePlayer play];
    
        // 暂停播放
        [mpMoviePlayerVC.moviePlayer pause];
    
        // 停止播放
        /*
            停止播放会自动退出播放界面
        */
        [mpMoviePlayerVC.moviePlayer stop];
    
        // 退出播放
        /*
            退出播放界面,停止播放
        */
        [self dismissMoviePlayerViewControllerAnimated];
  • Swift

        // 显示播放页面
        /*
            弹出播放页面,开始播放
        */
        self.presentMoviePlayerViewControllerAnimated(mpMoviePlayerVC)
    
        // 开始播放
        mpMoviePlayerVC.moviePlayer.play()
    
        // 暂停播放
        mpMoviePlayerVC.moviePlayer.pause()
    
        // 停止播放
        /*
            停止播放会自动退出播放界面
        */
        mpMoviePlayerVC.moviePlayer.stop()
    
        // 退出播放
        /*
            退出播放界面,停止播放
        */
        self.dismissMoviePlayerViewControllerAnimated()

2.2 使用 MPMoviePlayerController 播放

  • Objective-C

        // 判断媒体是否正在通过 AirPlay 播放
        BOOL airPlayVideoActive = mpMoviePlayer.isAirPlayVideoActive;
    
        // 判断是否准备好显示
        BOOL readyForDisplay = mpMoviePlayer.readyForDisplay;
    
        // 获取播放控制器所在的视图
        /*
            The view in which the media and playback controls are displayed
        */
        UIView *playbackView = mpMoviePlayer.view;
    
        // 获取媒体播放背景视图
        /*
            A view for customization which is always displayed behind movie content
        */
        UIView *backgroundView = mpMoviePlayer.backgroundView;
    
        // 获取播放状态
        /*
            MPMoviePlaybackStateStopped,                停止
            MPMoviePlaybackStatePlaying,                播放
            MPMoviePlaybackStatePaused,                 暂停
            MPMoviePlaybackStateInterrupted,            中断
            MPMoviePlaybackStateSeekingForward,         快进
            MPMoviePlaybackStateSeekingBackward         快退
    
            Returns the current playback state of the movie player
        */
        MPMoviePlaybackState playbackState = mpMoviePlayer.playbackState;
    
        // 获取网络加载状态
        /*
            MPMovieLoadStateUnknown        = 0,       状态未知
            MPMovieLoadStatePlayable       = 1 << 0,  可播放
            MPMovieLoadStatePlaythroughOK  = 1 << 1,  Playback will be automatically started in this
                                                      state when shouldAutoplay is YES
            MPMovieLoadStateStalled        = 1 << 2,  Playback will be automatically paused in this 
                                                      state, if started
    
            Returns the network load state of the movie player
        */
        MPMovieLoadState loadState = mpMoviePlayer.loadState;
    
        // 获取媒体类型
        /*
            MPMovieMediaTypeMaskNone  = 0,
            MPMovieMediaTypeMaskVideo = 1 << 0,
            MPMovieMediaTypeMaskAudio = 1 << 1
    
            The types of media in the movie, or MPMovieMediaTypeNone if not known
        */
        MPMovieMediaTypeMask movieMediaType = mpMoviePlayer.movieMediaTypes;
    
        // 获取媒体原始尺寸
        /*
            The natural size of the movie, or CGSizeZero if not known/applicable
        */
        CGSize naturalSize = mpMoviePlayer.naturalSize;
    
        // 获取媒体播放时长
        /*
            The duration of the movie, or 0.0 if not known
        */
        NSTimeInterval duration = mpMoviePlayer.duration;
    
        // 获取当前可播放的时长
        /*
            for progressively downloaded network content
        */
        NSTimeInterval playableDuration = mpMoviePlayer.playableDuration;
    
        // 设置播放页面大小
        mpMoviePlayer.view.frame = CGRectMake(10, 30, self.view.bounds.size.width - 20, 200);
    
        // 缓冲视频
        /*
            即使不写,系统也会自动调用该方法
        */
        [mpMoviePlayer prepareToPlay];
    
        // 显示播放页面
        /*
            添加播放页面,开始播放
        */
        [self.view addSubview:mpMoviePlayer.view];
    
        // 开始播放
        [mpMoviePlayer play];
    
        // 暂停播放
        [mpMoviePlayer pause];
    
        // 停止播放
        [mpMoviePlayer stop];
    
        // 设置全屏
        [mpMoviePlayer setFullscreen:YES animated:YES];
    
        // 快进
        [mpMoviePlayer beginSeekingForward];
    
        // 快退
        [mpMoviePlayer beginSeekingBackward];
    
        // 停止快进或快退
        [mpMoviePlayer endSeeking];
    
        // 设置是否全屏播放
        /*
            必须设置,必须放在添加页面之后设置,设置为 NO 时,必须设置 mpMoviePlayer.view.frame 的大小
        */
        mpMoviePlayer.fullscreen = NO;
    
        // 设置是否自动开始播放
        /*
            默认为 YES
        */
        mpMoviePlayer.shouldAutoplay = NO;
    
        // 设置是否允许通过 AirPlay 播放
        /*
            Defaults to YES on iOS 5.0 and later
        */
        mpMoviePlayer.allowsAirPlay = NO;
    
        // 设置当前播放时间
        mpMoviePlayer.currentPlaybackTime = 10;
    
        // 设置当前播放速度
        /*
            默认为 1.0 (normal speed),设为 0.0 时暂停播放
        */
        mpMoviePlayer.currentPlaybackRate = 1.0;
    
        // 设置开始播放时间
        /*
            The start time of movie playback. Defaults to NaN, indicating the natural start time of 
            the movie
        */
        mpMoviePlayer.initialPlaybackTime = 10;
    
        // 设置停止播放时间
        /*
            The end time of movie playback. Defaults to NaN, which indicates natural end time of 
            the movie
        */
        mpMoviePlayer.endPlaybackTime = 20;
    
        // 设置播放控制器类型
        /*
            MPMovieControlStyleNone,        没有控制器,  No controls
            MPMovieControlStyleEmbedded,    嵌入式,默认,Controls for an embedded view   可将播放窗口全屏化
            MPMovieControlStyleFullscreen,  全屏式,     Controls for fullscreen playback
    
            MPMovieControlStyleDefault = MPMovieControlStyleEmbedded
        */
        mpMoviePlayer.controlStyle = MPMovieControlStyleEmbedded;
    
        // 设置重复播放模式
        /*
            MPMovieRepeatModeNone,   不重复,默认
            MPMovieRepeatModeOne     重复播放
        */
        mpMoviePlayer.repeatMode = MPMovieRepeatModeNone;
    
        // 设置画面缩放模式
        /*
            MPMovieScalingModeNone,         不做任何缩放
            MPMovieScalingModeAspectFit,    适应屏幕大小,保持宽高比,默认
            MPMovieScalingModeAspectFill,   充满屏幕,保持宽高比
            MPMovieScalingModeFill          充满屏幕,不保持宽高比
        */
        mpMoviePlayer.scalingMode = MPMovieScalingModeAspectFit;
    
        // 设置媒体资源类型
        /*
            The playback type of the movie. Defaults to MPMovieSourceTypeUnknown.
            Specifying a playback type before playing the movie can result in faster load times.
    
            MPMovieSourceTypeUnknown,
            MPMovieSourceTypeFile,         Local or progressively downloaded network content
            MPMovieSourceTypeStreaming     Live or on-demand streaming content
        */
        mpMoviePlayer.movieSourceType = MPMovieSourceTypeFile;
  • Swift

        // 判断媒体是否正在通过 AirPlay 播放
        let airPlayVideoActive:Bool = mpMoviePlayer.airPlayVideoActive
    
        // 判断是否准备好显示
        let readyForDisplay:Bool = mpMoviePlayer.readyForDisplay
    
        // 获取播放控制器所在的视图
        /*
            The view in which the media and playback controls are displayed
        */
        let playbackView:UIView = mpMoviePlayer.view
    
        // 获取媒体播放背景视图
        /*
            A view for customization which is always displayed behind movie content
        */
        let backgroundView:UIView = mpMoviePlayer.backgroundView
    
        // 获取播放状态
        /*
            Stopped,           停止
            Playing,           播放
            Paused,            暂停
            Interrupted,       中断
            SeekingForward,    快进
            SeekingBackward    快退
    
            Returns the current playback state of the movie player
        */
        let playbackState:MPMoviePlaybackState = mpMoviePlayer.playbackState
    
        // 获取网络加载状态
        /*
            Unknown        = 0,        状态未知
            Playable       = 1 << 0,   可播放
            PlaythroughOK  = 1 << 1,   Playback will be automatically started in this state when 
                                       shouldAutoplay is YES
            Stalled        = 1 << 2,   Playback will be automatically paused in this state, if started
    
            Returns the network load state of the movie player
        */
        let loadState:MPMovieLoadState = mpMoviePlayer.loadState
    
        // 获取媒体类型
        /*
            MaskNone  = 0,
            MaskVideo = 1 << 0,
            MaskAudio = 1 << 1
    
            The types of media in the movie, or MPMovieMediaTypeNone if not known
        */
        let movieMediaType:MPMovieMediaTypeMask = mpMoviePlayer.movieMediaTypes
    
        // 获取媒体原始尺寸
        /*
            The natural size of the movie, or CGSizeZero if not known/applicable
        */
        let naturalSize:CGSize = mpMoviePlayer.naturalSize
    
        // 获取媒体播放时长
        /*
            The duration of the movie, or 0.0 if not known
        */
        let duration:NSTimeInterval = mpMoviePlayer.duration
    
        // 获取当前可播放的时长
        /*
            for progressively downloaded network content
        */
        let playableDuration:NSTimeInterval = mpMoviePlayer.playableDuration
    
        // 设置播放页面大小
        mpMoviePlayer.view.frame = CGRectMake(10, 30, self.view.bounds.size.width - 20, 200)
    
        // 缓冲视频
        /*
            即使不写,系统也会自动调用该方法
        */
        mpMoviePlayer.prepareToPlay()
    
        // 显示播放页面
        /*
            添加播放页面,开始播放
        */
        self.view.addSubview(mpMoviePlayer.view)
    
        // 开始播放
        mpMoviePlayer.play()
    
        // 暂停播放
        mpMoviePlayer.pause()
    
        // 停止播放
        mpMoviePlayer.stop()
    
        // 设置全屏
        mpMoviePlayer.setFullscreen(true, animated: true)
    
        // 快进
        mpMoviePlayer.beginSeekingForward()
    
        // 快退
        mpMoviePlayer.beginSeekingBackward()
    
        // 停止快进或快退
        mpMoviePlayer.endSeeking()
    
        // 设置是否全屏播放
        /*
            必须设置,必须放在添加页面之后设置,设置为 NO 时,必须设置 mpMoviePlayer.view.frame 的大小
        */
        mpMoviePlayer.fullscreen = false
    
        // 设置是否自动开始播放
        /*
            默认为 YES
        */
        mpMoviePlayer.shouldAutoplay = false
    
        // 设置是否允许通过 AirPlay 播放
        /*
            Defaults to YES on iOS 5.0 and later
        */
        mpMoviePlayer.allowsAirPlay = false
    
        // 设置当前播放时间
        mpMoviePlayer.currentPlaybackTime = 10
    
        // 设置当前播放速度
        /*
            默认为 1.0 (normal speed),设为 0.0 时暂停播放
        */
        mpMoviePlayer.currentPlaybackRate = 1.0
    
        // 设置开始播放时间
        /*
            The start time of movie playback. Defaults to NaN, indicating the natural start time of 
            the movie
        */
        mpMoviePlayer.initialPlaybackTime = 10
    
        // 设置停止播放时间
        /*
            The end time of movie playback. Defaults to NaN, which indicates natural end time of 
            the movie
        */
        mpMoviePlayer.endPlaybackTime = 20
    
        // 设置播放控制器类型
        /*
            None,        没有控制器,  No controls
            Embedded,    嵌入式,默认,Controls for an embedded view     可将播放窗口全屏化
            Fullscreen,  全屏式,     Controls for fullscreen playback
        */
        mpMoviePlayer.controlStyle = MPMovieControlStyle.Embedded
    
        // 设置重复播放模式
        /*
            None,   不重复,默认
            One     重复播放
        */
        mpMoviePlayer.repeatMode = MPMovieRepeatMode.None
    
        // 设置画面缩放模式
        /*
            None,          不做任何缩放
            AspectFit,     适应屏幕大小,保持宽高比,默认
            AspectFill,    充满屏幕,保持宽高比
            Fill           充满屏幕,不保持宽高比
        */
        mpMoviePlayer.scalingMode = MPMovieScalingMode.AspectFit
    
        // 设置媒体资源类型
        /*
            The playback type of the movie. Defaults to MPMovieSourceTypeUnknown.
            Specifying a playback type before playing the movie can result in faster load times.
    
            Unknown,
            File,          Local or progressively downloaded network content
            Streaming      Live or on-demand streaming content
        */
        mpMoviePlayer.movieSourceType = MPMovieSourceType.File

3、监听播放进度

    // Movie Property Notifications:媒体属性观察者

        MPMovieMediaTypesAvailableNotification   // 媒体属性可获取
        MPMovieSourceTypeAvailableNotification   // 媒体类型是 MPMovieSourceTypeUnknown

        MPMovieDurationAvailableNotification     // 媒体播放时长可获取
        MPMovieNaturalSizeAvailableNotification  // 媒体原始尺寸可获取

    // Movie Player Notifications:媒体播放观察者

        MPMediaPlaybackIsPreparedToPlayDidChangeNotification   // 准备播放

        MPMoviePlayerPlaybackDidFinishNotification            // 播放完成或退出播放

        MPMoviePlayerPlaybackDidFinishReasonUserInfoKey       // NSNumber (MPMovieFinishReason)

        MPMoviePlayerPlaybackStateDidChangeNotification       // 播放状态改变,通过程序或者用户操作改变

        MPMoviePlayerScalingModeDidChangeNotification         // 画面缩放模式改变

        MPMoviePlayerLoadStateDidChangeNotification           // 网络加载状态改变

        MPMoviePlayerNowPlayingMovieDidChangeNotification     // 当前播放媒体改变

        MPMoviePlayerWillEnterFullscreenNotification          // 将要进入全屏播放状态
        MPMoviePlayerDidEnterFullscreenNotification           // 已经进入全屏播放状态
        MPMoviePlayerWillExitFullscreenNotification           // 将要退出全屏播放状态
        MPMoviePlayerDidExitFullscreenNotification            // 已经退出全屏播放状态
        MPMoviePlayerFullscreenAnimationDurationUserInfoKey   // NSNumber of double (NSTimeInterval)
        MPMoviePlayerFullscreenAnimationCurveUserInfoKey      // NSNumber of NSUInteger (UIViewAnimationCurve)

        MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification  // 开始或停止通过 AirPlay 播放

        MPMoviePlayerReadyForDisplayDidChangeNotification       // 准备好显示
  • Objective-C

        // 添加系统通知观察者
        /*
            观察的状态发生改变时将会调用添加的相应方法进行处理
        */
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(playFinished) 
                                                     name:MPMoviePlayerPlaybackDidFinishNotification 
                                                   object:mpMoviePlayer];
    
        // 观察者响应事件
        - (void)playFinished {
    
        }
    
        // 取消监听
        [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                        name:MPMoviePlayerPlaybackDidFinishNotification 
                                                      object:mpMoviePlayer];
  • Swift

        // 添加系统通知观察者
        /*
            观察的状态发生改变时将会调用添加的相应方法进行处理
        */
        NSNotificationCenter.defaultCenter().addObserver(self, 
                                                selector: #selector(MpMoviePlayerController.playFinished), 
                                                    name: MPMoviePlayerPlaybackDidFinishNotification, 
                                                  object: mpMoviePlayer)
    
        // 观察者响应事件
        func playFinished() {
    
        }
    
        // 取消监听
        NSNotificationCenter.defaultCenter().removeObserver(self, 
                                                       name: MPMoviePlayerPlaybackDidFinishNotification, 
                                                     object: mpMoviePlayer)
目录
相关文章
|
移动开发 JavaScript Android开发
iOS12网页视频播放点击全屏按钮会导致闪退
iOS12网页视频播放点击全屏按钮会导致闪退
374 0
|
iOS开发
iOS Video Gravity 视频播放时的拉伸方式
iOS Video Gravity 视频播放时的拉伸方式
585 0
iOS Video Gravity 视频播放时的拉伸方式
|
iOS开发
【iOS 开发】同步快速判断视频是否可以播放
背景 拿到一个视频的 url 地址(无论是远程还是本地),有时候在播放之前需要检测该视频是否可以播放(本地可能是文件损坏,远端地址情况更复杂),下面介绍两种适用不同情况的方法来实现。
1683 0

热门文章

最新文章

  • 1
    苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
    117
  • 2
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    64
  • 3
    uniapp云打包ios应用证书的获取方法,生成指南
    105
  • 4
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    139
  • 5
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    43
  • 6
    iOS各个证书生成细节
    64
  • 7
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    290
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    91
  • 9
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    100
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    86