• 视频的播放


    //

    //  ViewController.m

    //  UI-NO-21

    //

    //  Created by Bruce on 15/8/21.

    //  Copyright (c) 2015年 Bruce. All rights reserved.

    //

     

    #import "ViewController.h"

    //播放视频 导入<MediaPlayer/MediaPlayer.h>

    #import <MediaPlayer/MediaPlayer.h>

     

    //如果想使用AVAssetImageGenerator 获得截图 必须导入AVFoundation

    #import <AVFoundation/AVFoundation.h>

    //AVAsset 通过URL 获得视频的资源

    //AVAssetImageGenerator 可以得到 视频里面的图片

     

    @interface ViewController ()

    {

        

        MPMoviePlayerController *moviePlayer;

    }

    @end

     

    @implementation ViewController

     

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.view.backgroundColor = [UIColor blackColor];

        

        

    //    moviewPlayer 可以通过 通知 来检测到  视频播放的状态  MPMoviePlayerPlaybackStateDidChangeNotification

        

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeSate:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];

        

        

        

        NSString *path = [[NSBundle mainBundle] pathForResource:@"IMG_8435" ofType:@"m4v"];

        

        UIImage *image = [self thumbnailImage:path];

        

        self.view.backgroundColor = [UIColor colorWithPatternImage:image];

        

        /*

        

    //    播放视频的类

        moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:path]];

    //    *****还需要 设置 moviePlayer.view   的frame

        moviePlayer.view.frame = CGRectMake(100, 200, 200, 300);

        moviePlayer.view.backgroundColor = [UIColor redColor];

        

    //    设置视频显示控制的样式

        moviePlayer.controlStyle = MPMovieControlStyleFullscreen;

        

    //    设置 视频 是否循环播放

    //    MPMovieRepeatModeNone, 不循环

    //    MPMovieRepeatModeOne    循环

        moviePlayer.repeatMode = MPMovieRepeatModeOne;

     

    //    *****需要把 视频播放器的view 添加在  需要播放的视图上

        [self.view addSubview:moviePlayer.view];

        

    //    是否允许分享到airPlay

        moviePlayer.allowsAirPlay = YES;

        

        NSLog(@"是否 使用了 AirPlay %d",moviePlayer.airPlayVideoActive);

        

    //    如果播放的是网络视频  是否需要 自动继续播放

        moviePlayer.shouldAutoplay = YES;

        

    //  设置 视频 全屏

    //    moviePlayer.fullscreen = YES;

    //    [moviePlayer setFullscreen:YES animated:YES];

        

    //    播放

        [moviePlayer play];

        

        NSLog(@"是否是全屏 %d",moviePlayer.isFullscreen);

     

        

        

    //    获得视频的加载状态

    //    MPMovieLoadStateUnknown        = 0, 未知的状态

    //    MPMovieLoadStatePlayable       = 1 << 0, 可以播放的状态

    //    MPMovieLoadStatePlaythroughOK  = 1 << 1,  Playback will be automatically started in this state when shouldAutoplay is YES   如果使用了shouldAutoplay = YES  有可以播放的 自动播放

    //    MPMovieLoadStateStalled        = 1 << 2, // 没有网络数据 可以播放的时候

    //    moviePlayer.loadState

         */

        

    //    [moviePlayer stop];

    }

     

    - (void)changeSate:(NSNotification *)not

    {

        

        NSLog(@"视频播放的当前时间%f",moviePlayer.currentPlaybackTime);

        

        

    //    可以获得 整个视频播放的对象

        MPMoviePlayerController *mp = not.object;

        

    //    playbackState 只读的属性   可以通过它  来获取到  视频播放的状态

        

    //    MPMoviePlaybackStateStopped, 停止

    //    MPMoviePlaybackStatePlaying, 播放

    //    MPMoviePlaybackStatePaused, 暂停

    //    MPMoviePlaybackStateInterrupted, 中断

    //    MPMoviePlaybackStateSeekingForward, 快进

    //    MPMoviePlaybackStateSeekingBackward 回退

        

        switch (mp.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;

            }

            default: {

                break;

            }

        }

    //    通过moviePlayerController  获得截图的方法

    //    MPMovieTimeOptionNearestKeyFrame, 获得相对时间截图

    //    MPMovieTimeOptionExact 获得绝对时间的截图

    //    [moviePlayer requestThumbnailImagesAtTimes:@[@(1),@(5)] timeOption:MPMovieTimeOptionNearestKeyFrame];

    //    检测截图成功的通知名字

    //    MPMoviePlayerThumbnailImageRequestDidFinishNotification

        

    //    可以获得 通知传过来 内容的 图片的key

    //    MPMoviePlayerThumbnailImageKey

    }

     

    //FFMPEG VFL 转码的开源框架

    - (UIImage *)thumbnailImage:(NSString *)path

    {

    //    1、通过URL获得视频的资源

    //    AVAsset

    //    AVURLAsset

        

        AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:path]];

    //    AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:path]];

        

        

    //    2、初始化 视频资源图片的持有者

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

        

    //    3、开始截图

    //    <#(CMTime)#>  包含了 时间的值

    //    帧数

    //    copyCGImageAtTime  拷贝哪个时间段的图片(包扣了哪一帧)

    //    CGImageRef 是图片的数据  参数

        CGImageRef ref = [generator copyCGImageAtTime:CMTimeMake(1, 2) actualTime:nil error:nil];

        

    //    CGImageRef 转换成UIImage

        UIImage *image = [UIImage imageWithCGImage:ref];

        

        return image;

    }

     

     

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

     

    @end

     

  • 相关阅读:
    java 学习进度二
    java 学习进度一
    Lua 笔记17
    chrome浏览器扩展的事件处理
    指定的参数错误。Vim.Host.DiskPartitionInfo.-spec VSPHERE.LOCALAdministrator WIN-DOPGQVRRU2C
    MySQL分区表
    MySQL绿色版的安装(mysql-5.6.22-win32.zip)
    Oracle操作语言分类
    注册表法修改IE8安全级别的方法
    JDK版本不兼容问题之:一台机器安装多个版本的JDK
  • 原文地址:https://www.cnblogs.com/wukun16/p/4884147.html
Copyright © 2020-2023  润新知