iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)

介绍:

和音频播放一样,ios也提供个很多的API。如mediaPlayer.framework下的MPMediaPlayerController、AVFounditon.framework下的AVPlayer和AVKit下的AVPlayerViewcontroller。MPMovieplayerController已经在ios9.0中被废弃了,用来替代的是AVPlayerViewcontroller。尽管如此,但还是说一下比较熟悉的MPMovieplayerController.

1、MPMovieplayerController

<1>初始化MPMovieplayerController

// 创建本地URL(也可创建基于网络的URL)

NSURL* movieUrl = [[NSBundlemainBundle]URLForResource:@"movie"withExtension:@"mp4"];

// 使用指定URL创建MPMoviePlayerController

// MPMoviePlayerController将会播放该URL对应的视频

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerControlleralloc]initWithContentURL:movieUrl];

<2>设置属性并添加到当前控制器的View上

// 设置该播放器的控制条风格。
moviePlayer.controlStyle =MPMovieControlStyleEmbedded;

// 设置该播放器的缩放模式
moviePlayer.scalingMode =MPMovieScalingModeAspectFit;

//设置播放视图大小
 _movieplayer.view.frame = self.view.bounds;

//设置播放视图宽高自适应调整
_movieplayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//添加到当前控制器的View上
[self.View  addSubview:moviePlayer.view];

<3>播放选择

//播放缓冲
[self.movieplayer prepareToPlay];

//播放开始
[moviePlayer play];

//播放暂停
[moviePlayer pause];

//播放停止
[moviePlayer stop];

由于属性太多,这里只列出能完成简单的播放器的属性,其他属性可在头文件中查找,注意:播放的状态的监听和截图功能都是通过通知实现的。

这里给一个具体的代码:

ViewController类

#import "ViewController.h"
#import "PlayViewController.h"

@interface ViewController ()<PlayViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"播放器";
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    PlayViewController *playContronller = segue.destinationViewController;
    playContronller.delegate = self;
}

#pragma mark <PlayViewControllerDelegate>
-(void)dismissPlayViewController{

    [self dismissViewControllerAnimated:self completion:nil];
}
-(void)setImageWithThumbnailImage:(UIImage *)image{

    self.imageView.image = image;
}
@end

PlayViewController类

#import <UIKit/UIKit.h>

@protocol PlayViewControllerDelegate <NSObject>

//关闭模态窗体
-(void)dismissPlayViewController;

//设置截图
-(void)setImageWithThumbnailImage:(UIImage *)image;

@end

@interface PlayViewController : UIViewController
@property (assign,nonatomic)id<PlayViewControllerDelegate> delegate;
@end

#import "PlayViewController.h"
#import <MediaPlayer/MediaPlayer.h>
#import <AVKit/AVKit.h>

@interface PlayViewController ()
@property (strong,nonatomic)MPMoviePlayerController *movieplayer;
@end

@implementation PlayViewController

/** 创建视频播放器 */
-(MPMoviePlayerController *)movieplayer{

    if (!_movieplayer) {

        //设置播放器的属性
        NSURL *URL = [[NSBundle mainBundle]URLForResource:@"风景" withExtension:@".mp4"];
        _movieplayer = [[MPMoviePlayerController alloc]initWithContentURL:URL];
        _movieplayer.view.frame = self.view.bounds;
        _movieplayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        //添加通知
        [self addNotify];
    }
    return _movieplayer;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view addSubview:self.movieplayer.view];
    [self.movieplayer prepareToPlay];
    [self.movieplayer play];
}

//添加通知
-(void)addNotify{

    //注册播放完成的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:_movieplayer];

    //注册播放状态改变的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackStateChanged) name:MPMoviePlayerPlaybackStateDidChangeNotification
                                              object:_movieplayer];

    //注册全屏通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayDidEnterFullScreen) name:MPMoviePlayerDidEnterFullscreenNotification
                                            object:_movieplayer];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayDidExitFullScreen) name:MPMoviePlayerDidExitFullscreenNotification
                                               object:_movieplayer];

    //注册请求截屏的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerRequestThumbnailImage) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
                                               object:_movieplayer];
    //发送截图请求
    [self.movieplayer requestThumbnailImagesAtTimes:@[@(5.0f),@(10.0f)] timeOption:MPMovieTimeOptionNearestKeyFrame];
}

//截屏
-(void)moviePlayerRequestThumbnailImage{

    //获取图片
    UIImage *image = [self.movieplayer thumbnailImageAtTime:5.0f timeOption:MPMovieTimeOptionNearestKeyFrame];

    NSLog(@"%@",image);

    if ([self.delegate respondsToSelector:@selector(setImageWithThumbnailImage:)]) {

        [self.delegate setImageWithThumbnailImage:image];
    }
}

//播放完成
-(void)moviePlayBackDidFinish:(NSNotification *)notification{

    NSLog(@"播放完成");
}

//播放状态改变
-(void)moviePlayBackStateChanged{

    switch (self.movieplayer.playbackState) {
        case MPMoviePlaybackStateStopped:
            NSLog(@"播放停止");
            break;
        case MPMoviePlaybackStatePlaying:
            NSLog(@"播放中");
            break;
        case MPMoviePlaybackStatePaused:
            NSLog(@"播放暂停");
            break;
        case MPMoviePlaybackStateInterrupted:
            NSLog(@"播放中断");
            break;
        case MPMoviePlaybackStateSeekingForward:
            NSLog(@"快进播放");
            break;
        case MPMoviePlaybackStateSeekingBackward:
            NSLog(@"回退播放");
            break;
    }
}

//进入全屏
-(void)moviePlayDidEnterFullScreen{

    NSLog(@"进入全屏");
}

//离开全屏
-(void)moviePlayDidExitFullScreen{

    NSLog(@"离开全屏");

    //关闭播放器
    [self.movieplayer.view removeFromSuperview];
     self.movieplayer = nil;

    if ([self.delegate respondsToSelector:@selector(dismissPlayViewController)]) {

       [self.delegate dismissPlayViewController];
    }
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}
@end

演示结果截图:

播放前:                                             播放中:

  

播放过程中一个指定时间点的视频截图

2、AVPlayer

AVPlayer既可以播放音乐又可以播放视频;使用AVPlayer不能直接显示视频,必须要加入AVPlayerLayer中,并添加到其他能显示的layer中。

//获取播放源的url
NSString *filePath = [[NSBundlemainBundle] pathForResource:@"backspace"ofType:@"mov"];
NSURL *sourceMovieURL = [NSURLfileURLWithPath:filePath];

//创建播放器
AVAsset *movieAsset= [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:movieAsset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];

//创建播放图层
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = self.view.layer.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
[self.view.layer addSublayer:playerLayer];

//开始播放
[player play];

3、AVPlayerViewcontroller

AVPlayerViewcontroller继承自UIViewController,一般适用于点击一个视频缩略图,modal出一个新的界面来进行播放的情况。

用法:

//创建播放器
AVPlayerViewController *player = [[AVPlayerViewController alloc]init];
player.player = [[AVPlayer alloc]initWithURL:movieUrl];

//模态出播放器
[self presentViewController:player animated:YES completion:nil];

4、ffmpeg-AVPlayer-for-iOS——强大的iOS视频播放框架

ffmpeg-avplayer-for-ios是一个微小但是强大的iOS视频播放框架,能够播放大多数的音频和视频格式文件(包括网络音频和视频流),没有格式转换的烦恼,不依赖VLC和SDL。支持播放1080P视频,但是建议只在iPad Air & iPhone 5s设备上播放1080P视频。

ffmpeg-avplayer-for-ios是专门针对iOS开发者编写的AVPlayer SDK,只需几行代码便可在应用中加入强大的视频播放器。

ffmpeg-avplayer-for-ios依赖于iOS OpenGL ES 2.0框架和基于LGPL协议开源的FFmpeg类库。

截图:

特性:

1、支持ARC;

2、支持armv7, armv7s, arm64, i386和x86-64;

3、支持播放本地文件;

4、支持Windows SMB/CIFS文件 (PRO version only);

5、支持http, https和rtmp协议;

6、解析音频和视频持续时间、帧尺寸信息;

7、获取视频缩略图;

8、实时位&帧率和网络缓冲进度计算;

9、查询当前播放时间信息;

10、播放速度控制;

11、亮度,对比度,饱和度控制;

12、支持音频、视频播放背景;

13、支持全屏模式;

14、系统音量控制;

15、从指定的事件位置播放;

16、支持播放、暂停、停止、重播、快进、快退。

17、支持音频会话中断处理程序;

18、自定义字幕字体;

19、支持嵌入字幕格式;

20、支持多个音频、字幕流;

21、支持SRT, ASS, SSA, SMI格式;

Github托管地址:https://github.com/iMoreApps/ffmpeg-avplayer-for-ios

时间: 2024-07-30 13:43:22

iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)的相关文章

ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)

ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:https://github.com/niexiaobo/ 实现功能 :播放视频 ,视频后台下载 (真机调试功能正常) 1.使用ZFPlayer播放视频(可以在线和本地播放,基于AVPlayer,调节音量和屏幕亮度) 2.使用 WHCNetWorkKit 实现下载,后台下载(多任务同时下载,单任务下载,

关于iOS中音视频播放的几种方式介绍

在IOS设计中,音视频的播放通常涉及到大部分设计过程中,因此清晰了解并使用音视频播放结构就很重要了,下面介绍几种常用的音视频的播放方式: (一) 使用系统提供的播放器,用system sound service去播放时长小于30s的音乐,通常是.caf,.aif,.wav格式: 创建一个系统播放对象: AudioServicesCreateSystemSoundID ( CFURLRef inFileURL, SystemSoundID *outSystemSoundID); AudioServ

[ios]ios的延迟执行方法

1.最直接的方法performSelector:withObject:afterDelay: 这种方法的缺点:每次要为延时写一个方法 2.使用类别,用BOLCK执行 [代码]c#/cpp/oc代码: 01 @implementation NSObject (PerformBlockAfterDelay) 02   03 - (void)performBlock:(void (^)(void))block 04           afterDelay:(NSTimeInterval)delay

ios媒体视频播放器应用项目

源码WSY_XMHelper,基于ReactiveCocoa和MVVM架构的流媒体视频播放器应用,此项目为一个完整项目.基于MVVM架构, 集成流媒体视频下载及播放,支持下拉刷新,上拉加载等.如果你想学习MVVM,此项目为一个很好的例子. 项目源码下载:http://code.662p.com/view/9891.html<ignore_js_op> <ignore_js_op> 详细说明:http://ios.662p.com/thread-2344-1-1.html

iOS媒体视频播放器应用源码

源码WSY_XMHelper,基于ReactiveCocoa和MVVM架构的流媒体视频播放器应用,此项目为一个完整项目.基于MVVM架构, 集成流媒体视频下载及播放,支持下拉刷新,上拉加载等.如果你想学习MVVM,此项目为一个很好的例子. 源码下载: http://code.662p.com/view/9891.html 2015-1-7 15:12 上传 详细说明:http://ios.662p.com/thread-2344-1-1.html

ios 网络视频播放---分解ZFPlayer

核心1.  AVPlayerLayer 用于显示视频 核心2.  监听播放相关属性 A.  status: AVPlayerStatusReadyToPlay---视频就可以播放了 AVPlayerStatusFailed---视频加载失败,这时可以通过self.player.error.description属性来找出具体的原因 AVPlayerItemStatusUnknown----未知原因 B.  loadedTimeRanges:当前视频缓存情况(缓冲的进度),监听此属性可以在UI中更

iOS音视频播放

一.音频播放 1.音效播放(短时间的音频文件) 1> AudioServicesCreateSystemSoundID 2> AudioServicesPlaySystemSound 2.音乐播放(长时间的音频文件) 1> AVAudioPlayer 只能播放本地的音频文件 >MPMusicPlayerController 2> AVPlayer 能播放本地.远程的音频.视频文件 基于Layer显示,得自己去编写控制面板 3> MPMoviePlayerControll

ios系统视频播放器MPMoviePlayerController应用遇到的坑

最近在做视频播放时应用系统MPMoviePlayerController播放器播放视频,发现点击快进快退会出现黑屏现象,并且点击完成按钮也不会返回,代码以及界面如下所示: NSURL *url=[self getNetworkUrl]; _moviePlayer=[[MPMoviePlayerController alloc]initWithContentURL:url]; _moviePlayer.view.frame=CGRectMake(0, 0, kScreenWidth, kScree

iOS之视频播放MPMoviePlayerViewController

需要导入的框架 #import <MediaPlayer/MediaPlayer.h> MediaPlayer.framework MPMoviePlayerViewController: 打开网络视频: -(void)openmovie { MPMoviePlayerViewController *movie = [[MPMoviePlayerViewControlleralloc]initWithContentURL:[NSURLURLWithString:@"视频网络地址&qu