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
View Code

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
View Code
#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
View Code

演示結果截圖: 

播放前:                                             播放中:                          

  

  播放過程中一個指定時間點的視頻截圖

 

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格式;
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM