iOS 视频播放

1、视频播放器
需导入:
#import <MediaPlayer/MediaPlayer.h>(用于 MPMoviePlayerViewController

#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
// 点击是下载视频,然后跳转
   
QWModel * model = self . arr [indexPath. row ];
    NSURL * url = [NSURL URLWithString:model.url];
    // 创建的是一个视频播放控制器,跟相册选择器相似
    AVPlayerViewController * pVc = [[AVPlayerViewController alloc]init];  
   pVc. player =[ AVPlayer playerWithURL :url];
    //可以直接当前的tableView拥有一个控制属性,在后面的代码中赋值就可以,那么就可以直接调用下面的代码了
    [ xxviewController presentViewController:vc animated:YES completion:nil] ;
    //MPMoviePlayerViewController(可以使用这个来达到同样的效果)


关于视频播放器的其他简介
1 >导入框架 MediaPlayer.framework
提示,从Xcode6开始不再有默认的Frameworks文件夹,导入的框架会单独放置
如果需要可以自行建立一个名为Frameworks的分组

2>监听播放器事件:通知中心

1]播放状态 MPMoviePlayerPlaybackStateDidChangeNotification

MPMoviePlaybackStateStopped,          
停止(需要用代码停止才会被触发,正常播放完成只暂停状态)
MPMoviePlaybackStatePlaying,          
播放
MPMoviePlaybackStatePaused,           
暂停
MPMoviePlaybackStateInterrupted,      
中断
MPMoviePlaybackStateSeekingForward,   
向前搜索
MPMoviePlaybackStateSeekingBackward   
向后搜索

2]播放完成 MPMoviePlayerPlaybackDidFinishNotification

// 如果是全屏,退出全屏
if (self.player.isFullscreen) {
    [
self.player setFullscreen:NO animated:YES];
}
[
self.player.view removeFromSuperview];

3]截屏完成 MPMoviePlayerThumbnailImageRequestDidFinishNotification

// 提示,时间数组中包含的时间必须是浮点数
[self.player requestThumbnailImagesAtTimes:@[@1.0] timeOption:MPMovieTimeOptionNearestKeyFrame];
视频格式(使用不同的编码方案对跟视频文件进行打包):

TS 流-实时的流,将视频文件拆分成多个小块,如果丢失一个,只会出现马赛克
FS 流-文件流,一旦任何位置被破坏,整个文件都无法播放,适合做片头 & 广告等

苹果目前支持主流的 " 编码方案 " ,都已经封装好了!

以下是部分 m3u8 资源,仅用于演示流媒体服务

http:
//live.3gv.ifeng.com/live/hongkong.m3u8    凤凰卫视
http:
//live.3gv.ifeng.com:80/live/FHZXHD.m3u8   凤凰高清
http:
//live.3gv.ifeng.com:80/live/zhongwen.m3u8 凤凰中文
http:
//210.59.248.53/hls-live/livepkgr/_definst_/liveevent/live-ch1-3.m3u8 好消息

http:
//devstreaming.apple.com/videos/watch/Getting_Started_With_Watchkit/Getting_Started_With_Watchkit.m3u8

注意:要播放 m3u8 ,需要使用 MPMoviePlayerController ,否则全屏播放会有问题。



以下是视频播放器的代码实现
.h
#import <UIKit/UIKit.h>

@interface HMMoviePlayerView : UIView

/** 播放指定 URL 的视频 */
- (
void )playWithURL:( NSURL *)url;

/** 停止播放 */
- (
void )stopPlayback;

/** 截取指定时间点的图像 */
- (
void )caputreImageAtTime:( double )time completion:( void (^)( UIImage *image))completion;

@end

.m

#import "HMMoviePlayerView.h"
#import
<MediaPlayer/MediaPlayer.h>

@interface HMMoviePlayerView()
/** 视频播放器 */
@property (nonatomic, strong) MPMoviePlayerController *player;
/** 播放完成后显示的图像 */
@property (nonatomic, weak) UIImageView *imageView;

/** 截图完成块代码 */
@property (nonatomic, copy) void (^captureCompletion) (UIImage *);
@end

@implementation HMMoviePlayerView

- (
UIImageView *)imageView {
   
if (_imageView == nil) {
       
UIImageView *iv = [[UIImageViewalloc] initWithFrame:self.bounds];

       
// 把图像视图插入到最底层
        [
selfinsertSubview:iv atIndex:0];
       
       
_imageView = iv;
    }
   
return_imageView;
}

- (
MPMoviePlayerController *)player {
   
if (_player == nil) {
       
_player = [[MPMoviePlayerControlleralloc] init];
    }
   
return_player;
}

#pragma mark - 播放相关控制代码
/** 添加监听 */
- (
void)setupNotification {
   
// 监听播放完成通知
    [[
NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(playbackFinished) name:MPMoviePlayerPlaybackDidFinishNotificationobject:nil];
   
// 监听屏幕截图通知
    [[
NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(captureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotificationobject:nil];
}

- (
void)captureFinished:(NSNotification *)notification {
   
NSLog(@"截图完成 %@", notification);
   
   
UIImage *image = notification.userInfo[MPMoviePlayerThumbnailImageKey];

   
if (self.captureCompletion) {
       
self.captureCompletion(image);
    }
   
   
self.imageView.image = image;
}

- (
void)playbackFinished {
   
NSLog(@"播放完成");
   
   
// 如果是全屏播放完成,退回全屏
   
if (self.player.isFullscreen) {
        [
self.playersetFullscreen:NOanimated:YES];
    }
   
   
// 把播放器的视图从屏幕上删除
    [
self.player.viewremoveFromSuperview];
   
   
// 删除通知中心
    [[
NSNotificationCenterdefaultCenter] removeObserver:self];
}

#pragma mark - 公共方法
- (void)playWithURL:(NSURL *)url {
   
self.player.contentURL = url;
   
   
// 将播放器的视图添加到movieView
   
self.player.view.frame = self.bounds;
    [
selfaddSubview:self.player.view];
   
   
// 设置通知
    [
selfsetupNotification];
   
   
// 播放
    [
self.playerplay];
}

- (
void)stopPlayback {
    [
self.playerstop];
}

- (
void)caputreImageAtTime:(double)time completion:(void (^)(UIImage *image))completion {
   
// 在此方法中,completion不需要执行
   
// 需要定义一个属性,记录住completion的块代码,然后在需要的时候执行
   
self.captureCompletion = completion;
   
    [
self.playerrequestThumbnailImagesAtTimes:@[@(time)]timeOption:MPMovieTimeOptionNearestKeyFrame];
}

@end


以下是 #import <AVFoundation/AVFoundation.h>头文件下 视频截屏的代码

//本地视频文件的路径
NSString *str = [[ NSBundle mainBundle]pathForResource:@“xxx"ofType:nil];

    //素材
    AVAsset *asset = [ AVAsset assetWithURL:[NSURLfileURLWithPath:str]];
   
//截取视频图片对象  封装一个视频路径
   
AVAssetImageGenerator *assetImage = [AVAssetImageGeneratorassetImageGeneratorWithAsset:asset];
   
   
//开始截取
   
//参数1
    [assetImage generateCGImagesAsynchronouslyForTimes:@[@160.0]completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
       //注意是sync
        dispatch_sync ( dispatch_get_main_queue (), ^{
            NSLog(@"%@",[NSThreadcurrentThread]);
//展示下截屏的图片
            self . imageview . image = [ UIImage imageWithCGImage:image];
        });
    }];

你可能感兴趣的:(iOS 视频播放)