1. 程式人生 > >iOS視訊播放

iOS視訊播放

在iOS中處理視訊播放一般可以使用MPMoviePlayerViewController或者AVPlayer

一、MPMoviePlayerViewController的使用

MPMoviePlayerViewController是系統封裝的一個播放器控制器,其中對於視訊的控制由其屬性@property (nonatomic, readonly) MPMoviePlayerController *moviePlayer;負責。

1.建立使用

NSURL *URL = [NSURL fileURLWithPath:_videoPath];
        _player = [[MPMoviePlayerViewController alloc] initWithContentURL:URL];
_player.moviePlayer.controlStyle = MPMovieControlStyleNone;//不顯示控制控制元件 _player.moviePlayer.repeatMode = MPMovieRepeatModeNone;//不迴圈播放 _player.moviePlayer.scalingMode =MPMovieScalingModeAspectFill;//儲存寬高比,填滿檢視 [_player.moviePlayer prepareToPlay]; [_player.moviePlayer
play];播放

若要將播放器檢視加到某個view上,要這樣寫

[self.view addSubview:_player.view];

2.播放狀態的監控處理

有時候,播放器開始播放的時候,會有一點黑屏的緩衝載入時間,感覺上會先黑屏一下才出現視訊,為了視訊載入的時候不顯示黑屏,一般可先覆蓋一張圖片(比如視訊第一幀),等待視訊載入完成才隱藏圖片播放視訊。這種場景下便需要監聽播放器的通知了。

MPMoviePlayerViewController的狀態監控可通過moviePlayer的發出的通知來接收。下面介紹下常用到的。

a.狀態改變

[self addObserver:
@selector(loadStatusChanged:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
- (void)loadStatusChanged:(NSNotification *)notification {
    MPMoviePlayerController *player = notification.object;
    if ([player isEqual: _player.moviePlayer] && (player.loadState & MPMovieLoadStatePlayable)) {
        [player play];//現在才播放
        [_coverView removeFromSuperview];//移除遮蓋圖片
    }
}

b.視訊播放結束(失敗)

[self addObserver:@selector(playDidFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
- (void)playDidFinished:(NSNotification *)notification {
    MPMoviePlayerController *player = notification.object;
    if (![player isEqual:_player.moviePlayer]) {
        return;
    }
    NSDictionary *notificationUserInfo = [notification userInfo];
    NSNumber *resultValue = [notificationUserInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
    MPMovieFinishReason reason = [resultValue intValue];
    if (reason == MPMovieFinishReasonPlaybackError)
    {
        NSError *mediaPlayerError = [notificationUserInfo objectForKey:@"error"];
        if (mediaPlayerError) {
            GLLoge(@"動畫播放失敗: %@", [mediaPlayerError localizedDescription]);
        } else {
            GLLoge(@"動畫播放出錯了");
        }
    }
}

注意:

不可以同時載入播放兩個以上的MPMoviePlayerViewController,多個播放器最終只有一個播放能生效,通知也只能收到一個播放器發出的。

二,AVPlayer的使用

AVPlayer相對於MPMoviePlayerViewController更為底層,功能更強大。

需要引入庫#import <AVFoundation/AVFoundation.h>

1.建立使用

@property (nonatomic)AVPlayer *player;
@property (nonatomic)AVPlayerItem *playerItem;

_playerItem=[AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"launch" withExtension:@"mp4"]]; //建立播放源物件

_player=[AVPlayer playerWithPlayerItem:self.playerItem];//播放器物件

AVPlayerLayer *layer=[AVPlayerLayer playerLayerWithPlayer:self.player];
    layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
    layer.frame=[UIScreen mainScreen].bounds;
    layer.backgroundColor=[[UIColor whiteColor] CGColor];
    [self.layer addSublayer:layer];//必須使用AVPlayerLayer加到view的layer中,否則看不到視訊

[_player play];

2.AVPlayer的狀態監控

AVPlayer是沒有迴圈播放模式的,但可以通過狀態監控,在視訊播放完後,從頭再播放。它的播放控制和各種狀態是通過其播放源AVPlayerItem來監控的。

a.播放完成監控(可實現迴圈播放)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(runLoopTheMovie:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
- (void)runLoopTheMovie:(NSNotification *)notification{
    //註冊的通知  可以自動把 AVPlayerItem 物件傳過來,只要接收一下就OK

    AVPlayerItem * playItem = [notification object];
    //關鍵程式碼
    [playItem seekToTime:kCMTimeZero];//時間撥到0,重新開始

    [_player play];
}

b.狀態改變和緩衝進度,可處理遮蓋圖片避免閃黑屏以及載入進度的顯示

[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// 監聽status屬性
 [self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];// 監聽loadedTimeRanges 緩衝屬性
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

    AVPlayerItem *playerItem = (AVPlayerItem *)object;
    if ([keyPath isEqualToString:@"status"]) {
        if ([playerItem status] == AVPlayerStatusReadyToPlay) {
            NSLog(@"AVPlayerStatusReadyToPlay");

            //隱藏遮蓋圖片
            [UIView animateWithDuration:0.3 animations:^{
                self.coverImageView.alpha=0;
            } completion:^(BOOL finish){
                if (finish) {
                    self.coverImageView.hidden=YES;
                }

            }];

        } else if ([playerItem status] == AVPlayerStatusFailed) {
            GLLoge(@"動畫播放失敗");

        }
    }

    else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
     NSTimeInterval timeInterval = [self availableDuration];// 計算緩衝進度
     NSLog(@"Time Interval:%f",timeInterval);
     CMTime duration = self.playerItem.duration;
     CGFloat totalDuration = CMTimeGetSeconds(duration);
     [self.videoProgress setProgress:timeInterval / totalDuration animated:YES];
     }
}

- (NSTimeInterval)availableDuration {
    NSArray *loadedTimeRanges = [[self.playerView.player currentItem] loadedTimeRanges];
    CMTimeRange timeRange = [loadedTimeRanges.firstObject CMTimeRangeValue];// 獲取緩衝區域
    float startSeconds = CMTimeGetSeconds(timeRange.start);
    float durationSeconds = CMTimeGetSeconds(timeRange.duration);
    NSTimeInterval result = startSeconds + durationSeconds;// 計算緩衝總進度
    return result;
}

- (NSString *)convertTime:(CGFloat)second{
    NSDate *d = [NSDate dateWithTimeIntervalSince1970:second];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    if (second/3600 >= 1) {
        [formatter setDateFormat:@"HH:mm:ss"];
    } else {
        [formatter setDateFormat:@"mm:ss"];
    }
    NSString *showtimeNew = [formatter stringFromDate:d];
    return showtimeNew;
}

這裡附上取視訊第一幀的程式碼:

//獲取視訊第一幀影象
- (UIImage*)getCoverImage{

    AVURLAsset *asset = [AVURLAsset assetWithURL:[[NSBundle mainBundle] URLForResource:@"launch" withExtension:@"mp4"]];

    NSParameterAssert(asset);

    AVAssetImageGenerator *assetImageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

    assetImageGenerator.appliesPreferredTrackTransform =YES;

    assetImageGenerator.apertureMode =AVAssetImageGeneratorApertureModeEncodedPixels;

    CGImageRef thumbnailImageRef = NULL;

    NSError *thumbnailImageGenerationError = nil;

    CMTime time = CMTimeMakeWithSeconds(0.0, 600);

    thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:time actualTime:NULL error:&thumbnailImageGenerationError];

    if (!thumbnailImageRef)
        NSLog(@"thumbnailImageGenerationError %@", thumbnailImageGenerationError);



    UIImage *thumbnailImage = thumbnailImageRef ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] :nil;

    CGImageRelease(thumbnailImageRef);

    return thumbnailImage;

}

相關推薦

IOS-視訊播放AVPlayer2

引言 假如你現在打算做一個類似百度音樂、豆瓣電臺的線上音樂類APP,你會怎樣做? 首先了解一下音訊播放的實現級別: (1) 離線播放:這裡並不是指應用不聯網,而是指播放本地音訊檔案,包括先下完完成音訊檔案再進行播放的情況,這種使用AVFoundation裡的AVAudio

iOS 視訊播放實現:AVPlayerViewController

直接上程式碼 - (void)viewDidLoad {     [super viewDidLoad];     [self.view addSubview:self.moviePlayer.view];     [self.moviePlayer.player p

swift for ios 視訊播放

swift視訊播放一般常用的方式有兩種 AVPlayer 和MPMoviePlayer 這些方法直接繫結一個viewController不需要任何控制元件就可以用 非常方便 程式碼

iOS視訊播放

在iOS中處理視訊播放一般可以使用MPMoviePlayerViewController或者AVPlayer 一、MPMoviePlayerViewController的使用 MPMoviePlayerViewController是系統封裝的一個播放器控制器

iOS 視訊播放橫豎屏的轉化

我們在做視訊播放開發的時候,常常會用到橫屏的播放,今天就記錄下我做專案時候做橫屏的方法,主要是使用註冊通知,然後識別手機是否旋轉方向去旋轉橫屏。 思路: 獲取到手機已經旋轉的通知以後,先改變播放器的transform進行旋轉,然後改變frame 去改變播放器的大

iOS 視訊播放(一) MPMoviePlayerViewController、避免在後臺銷燬

轉自:http://blog.csdn.net/xueer8835/article/details/22286629 #import <MediaPlayer/MediaPlayer.h> MediaPlayer.framework。 MPMoviePl

iOS 視訊播放

視訊格式(使用不同的編碼方案對跟視訊檔案進行打包):-TS流-實時的流,將視訊檔案拆分成多個小塊,如果丟失一個,只會出現馬賽克-FS流-檔案流,一旦任何位置被破壞,整個檔案都無法播放,適合做片頭&廣告等蘋果目前支援主流的"編碼方案",都已經封裝好了!以下是部分 m3u8 資源,僅用於演示流媒體服務 h

ios視訊播放器封裝(全屏播放,鎖屏、手勢調節亮度、音量、進度)

今天給大家帶來的是一個基於AVplayer封裝的視訊播放器,支援視訊全屏播放、手勢加減音量,快進後退、調節螢幕亮度、定位視訊播放暫停時刻、實際觀看時間、全屏播放鎖屏等功能。如果需要的話希望能幫到你 , 當然, 有任何不妥的地方 歡迎指正。喜歡的可以關注下我的部落格、我的簡書

ios 視訊播放

NSString*path=[[NSBundle mainBundle] pathForResource:@"a" ofType:@"mp4"];     NSURL *url=[NSURL fileURLWithPath:path];     movie = [[MPMo

iOS視訊播放介面顯示音量調節控制元件

    在工作中需要在視訊播放介面顯示控制音量的滑塊,所以學習了一下,關於音量控制(要使用真機)     AVPlayer:提供音量控制api,但是隻支援IOS7     AVAudioPlayer

iOS 超好用的本地視訊播放器推薦!

本地播放器作為日常生活中不可或缺的一款工具類APP,Windows、Android等平臺不乏一些功能與體驗兼優的產品,但 iOS 平臺的使用者就沒有那麼幸運了,優秀的產品鳳毛麟角,且多數收費。 這源於 iOS 平臺的特殊性,完美支援各種視訊格式並不容易,幾乎沒有大廠在這方面投入,QQ影音

IOS多媒體-音樂播放 視訊播放//匯入音訊工具箱框架。

使用SystemSoundld播放簡短聲音 //匯入音訊工具箱框架。 import AudioToolbox  //使用SystemSoundld播放簡短聲音     func test1() {         //

iOS視訊—FFmepg基礎知識:視訊播放流程&視訊播放器&播放器資訊檢視工具

FFmepg基礎知識 視訊播放流程 通常我們看到的視訊格式:mp4,mov,flv,wmv等等,稱之為封裝格式,通過解封裝之後,同時拿到音訊壓縮資料和視訊壓縮資料。分別對其進行音訊視訊解碼得到音訊取樣和視訊畫素資料,然後把音訊資料渲染到視訊上面進行同步播放。 視訊播放器

iOS視訊—FFmepg基礎知識:視訊播放流程&視訊播放器&播放器資訊檢視工具

FFmepg基礎知識 視訊播放流程 通常我們看到的視訊格式:mp4,mov,flv,wmv等等,稱之為封裝格式,通過解封裝之後,同時拿到音訊壓縮資料和視訊壓縮資料。分別對其進行音訊視訊解碼得到音訊取樣

iOS 10 Safari 視訊播放新政策

提醒:本文最後更新於 788 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 隨著 iOS 10 的正式釋出,Safari 也迎來了大量更新,例如新增了對 ES6、CSP2.0、Shadow DOM 等功能和特性的支援。本文為大家介紹 iOS10 自帶 Safari 瀏覽器在視訊播放政策上的

IOS自動播放音訊/視訊

ios 為了節省使用者流量,對於 audio 和 video標籤的 preload 和 autopaly 標籤會自動攔截,除非使用者手動點選互動才會執行 。 對於背景音樂,又必須載入的時候就要執行,解決方法:(不過注意只能在微信瀏覽器裡面開啟) document

iOS:FFmpeg視訊播放和直播框架

視訊直播和播放轉碼器框架 介紹:   FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPL或GPL許可證。   它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,l

用air在ios播放h264視訊,需要使用StageVideo

Stage Video是Adobe提供的一種渲染視訊的新途徑。 這種方法充分利用了底層的視訊硬體設施。 而結果是大大地降低了CPU的負載,這便意味著在低效能裝置中能表現出更高的幀率以及更少的記憶體使用率。 使用stage video的話,StageVideo物件並不會位於F

iOS螢幕旋轉之為橫屏視訊播放增加豎屏模式

在App Store上的大部分視訊播放App中,都實現了豎屏小屏播放以顯示更多相關資訊,橫屏切換到全屏播放,這樣的互動顯得優雅而大方。最近專案裡有個這樣的需求,為全屏視訊播放加上豎屏模式。下面,讓我們一起來實現這個需求。 iOS中的方向 iOS裝置中有兩種方向,一種是裝

微信開發H5 video 視訊ios可以播放但是在android手機上無法播放或者黑屏

1、首先視訊在ios無法播放可能的原因是視訊地址可能無效,在確認視訊在PC端瀏覽器可以播放後則看是否是ios的安全限制,視訊放的位置不可以訪問到。 2、視訊在android上黑屏,可以播放但是暫停時黑