当前位置:   article > 正文

AVPlayer实现简单播放器_简单av

简单av

  在我们之前的项目,视频的播放都是使用MPMoviePlayerViewController(包含了播放的UI,并封装好了播放的一些函数),但是苹果的官网表示从IOS9版本开始,MPMoviePlayerViewController被弃用了,推荐使用AVPictureInPictureController或者AVPlayerViewController。

  但是一直使用苹果封装的ViewController可控性依旧比较差,如:

(1)播放状态无法获得;

(2)置于后台和唤醒时,在不同设备上视频播放展现状态不同;

(3)视频播放进度与画面不同步;

(4)播放的声音和画面不同步;

(5)无法直接加其他UI,如:分享按钮等。

基于以上几点考虑,我决定直接用AVPlayer直接实现一个播放器,完成一些简单的播放功能。

基本功能:

(1)进度条、视频播放画面、播放时间同步;

(2)可以播放和暂停,且两种状态有不同UI切换;

(3)进度条可以拖动,且视频播放画面同步;

(4)点击关闭按钮可以销毁播放器;

(5)增加了AutoLayout布局约束

(6)视频的横竖屏切换播放与设备的横竖屏切换同步。

(7)一些小细节,如:进度条拖拽、点击、抬起时,播放/暂停按钮UI的变化;置于后台和唤醒,重新设置视频播放状态等。

代码如下:

头文件:ViewController.h

  1. #import <UIKit/UIKit.h>
  2. #import <AVFoundation/AVFoundation.h>
  3. @interface ViewController : UIViewController
  4. @property (nonatomic,strong)AVPlayer *avPlayer;
  5. @property (nonatomic,strong)AVPlayerItem *avPlayerItem;
  6. @property (nonatomic,strong)AVPlayerLayer *avPlayerLayer;
  7. //装载视频layer、进度条、时间、时长等UI的容器
  8. @property (nonatomic,strong)UIView *videoContainer;
  9. //进度条UI
  10. @property (nonatomic,strong)UISlider *progress;
  11. //当前播放时间UI
  12. @property (nonatomic,strong) UILabel *startLabel;
  13. //视频总时长UI
  14. @property (nonatomic,strong) UILabel *endLabel;
  15. //关闭按钮
  16. @property (nonatomic,strong) UIButton *closeButton;
  17. //控制播放和暂停的按钮
  18. @property (nonatomic,strong) UIButton *playButton;
  19. //当前播放时间
  20. @property (nonatomic,assign) float playheadTime;
  21. //是否处于播放状态
  22. @property (nonatomic,assign) BOOL isPlaying;
  23. //播放帧的监视器
  24. @property (nonatomic,strong) id playTimeObserver;
  25. @end

实现:ViewController.m

  1. <span style="font-size:14px;">#import "ViewController.h"
  2. @interface ViewController ()
  3. @end
  4. static NSBundle *playerBundle;
  5. NSString * const XAdVideoStatusKey = @"status";
  6. @implementation ViewController
  7. - (void)viewDidLoad {
  8. [super viewDidLoad];
  9. NSString *urlString = @"要播放的视频地址 http://....";
  10. [self configPlayerControllerWithURL:urlString];
  11. }
  12. - (void)didReceiveMemoryWarning {
  13. [super didReceiveMemoryWarning];
  14. }
  15. #pragma mark - public
  16. - (void) configPlayerControllerWithURL:(NSString *)urlString{
  17. [self initBundle];
  18. [self setProgressRefProperties];
  19. [self showUI];
  20. NSURL *url = [NSURL URLWithString:urlString];
  21. [self setupPlayerWithURL:url];
  22. }
  23. /*
  24. * 重头播放
  25. */
  26. - (void)play{
  27. if (self.avPlayer) {
  28. self.isPlaying = YES;
  29. [self.avPlayer play];
  30. }
  31. }
  32. /*
  33. * 暂停
  34. */
  35. - (void)pause
  36. {
  37. if (self.avPlayer) {
  38. [self.avPlayer pause];
  39. self.isPlaying = NO;
  40. }
  41. }
  42. /*
  43. * 销毁对象
  44. */
  45. - (void)cancel {
  46. if (self.avPlayer) {
  47. [self.avPlayer pause];
  48. }
  49. [self removeUIView];
  50. [self removePlayerItemObserver];
  51. [self removePlayerObserver];
  52. [self destroyAllProperties];
  53. }
  54. /*
  55. * 从某一帧播放
  56. */
  57. - (void)playFromTime:(double)time
  58. {
  59. NSLog(@"playFromTime = %f",time);
  60. if (self.avPlayer) {
  61. [self seekToTime:time];
  62. [self.avPlayer play];
  63. self.isPlaying = YES;
  64. }
  65. }
  66. /*
  67. * 在某一帧暂停
  68. */
  69. - (void)pauseOnTime:(double)time
  70. {
  71. NSLog(@"pauseOnTime = %f",time);
  72. if (self.avPlayer) {
  73. [self seekToTime:time];
  74. [self.avPlayer pause];
  75. self.isPlaying = NO;
  76. }
  77. }
  78. #pragma mark - action event
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/308893
推荐阅读
相关标签
  

闽ICP备14008679号