xml地图|网站地图|网站标签 [设为首页] [加入收藏]

iOS开发系列,实现视频的录制

来源:http://www.ccidsi.com 作者:最新解决方案 人气:178 发布时间:2020-04-20
摘要:手续 3 :监听事件 //播放完成 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(captureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil]; //播放状态发生改变 [[NSNotif
手续 3 :监听事件
 //播放完成 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(captureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil]; //播放状态发生改变 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stateChanged) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];

视频

  • 1.播放录制的八个框架;
  • AVFoundation:提供了针尖对麦芒底层的API,不带分界面效果.

  • MediaPlayer:对AVFoundation举行了打包,提供了相比便利的播放器使用.

  • AVKit:ios9推出,集AVFoundation和MediaPlayer之大成.

  • 2.播放器的创立

  • 1> MPMoviewPlayerViewController(带分界面包车型地铁摄像播放器卡塔尔国:

      获取视频文件的url路径 ->对象方法创建视频播放控制器 ->modal展示.
    
  • 2> MPMoviewPlayerController(不带分界面包车型大巴录像播放器卡塔尔:

      获取视频文件路径 ->创建控制器对象 ->将播放器的视图添加到要展示的界面上 ->[控制器对象 play];
    
  • 3> AVPlayer,偏底层,不仅可以够播放音频又足以播放摄像,播放摄像要求增多layer到父视图上.

    //创建资源对象  获取文件信息
    AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:@"http://baobab.wdjcdn.com/14676170652191(23).mp4"]];
    //创建播放项目  曲目
    AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
    //AVPlayer既可以播音频也可以播视频,可以本地也可以播网络
    self.avPlayer = [[AVPlayer alloc] initWithPlayerItem:item];
    //设置视图layer
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
    [self.view.layer addSublayer:layer];
    layer.frame = [UIScreen mainScreen].bounds;
    //播放
    [self.avPlayer play];
    
  • 4> AVPlayerViewController

    //带界面的播放器
    AVPlayerViewController *playerVc = [[AVPlayerViewController alloc] init];
    //设置播放器
    //创建资源对象  获取文件信息
    AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:@"http://baobab.wdjcdn.com/14676170652191(23).mp4"]];
    //创建播放项目  曲目
    AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
    AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:item];
    playerVc.player = avPlayer;
    //进行modal展示
    [self presentViewController:playerVc animated:YES completion:nil];
    [avPlayer play];
    
  • 3.奇怪作用:

    • 1> 横屏全屏播放(视图旋转90度,frame设置为荧屏大小卡塔尔国

      [UIView animateWithDuration:0.25 animations:^{
          self.playerController.view.transform = CGAffineTransformRotate(self.playerController.view.transform, M_PI_2);
          self.playerController.view.frame = [UIScreen mainScreen].bounds;
      }];
      
    • 2> 获取全屏的Down事件(viewDidLoad中用文告监听退出全屏事件卡塔尔(قطر‎退出全屏&暂停时,表明触发了Down事件

        //监听通知  退出全屏时
       [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didExitFullScreen) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
      
    • 3> 已经退出全屏后调用

        - (void)didExitFullScreen{
      
        //判断播放状态
        if (self.playerController.playbackState == MPMoviePlaybackStatePaused) {
              NSLog(@"点击Down");
              //移除视图
              [self.playerController.view removeFromSuperview];
              }
        }
      

近期意识一篇好随笔:

步骤 2 :设置录制的输入
- setUpVideo{ // 1.1 获取视频输入设备 AVCaptureDevice *videoCaptureDevice=[self getCameraDeviceWithPosition:AVCaptureDevicePositionBack];//取得后置摄像头 // 视频 HDR  // videoCaptureDevice.videoHDREnabled = YES; // 设置最大,最小帧速率 //videoCaptureDevice.activeVideoMinFrameDuration = CMTimeMake; // 1.2 创建视频输入源 NSError *error=nil; self.videoInput= [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:&error]; // 1.3 将视频输入源添加到会话 if ([self.session canAddInput:self.videoInput]) { [self.session addInput:self.videoInput]; }}

音乐

1.框架:AVFoundation

2.根本类:AV奥迪oPlayer (只好播放本地音乐卡塔尔国.

  对象方法创建:  _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

3.音乐的播放.暂停和停止的兑现:依照音频文件路线伊始化播放器 -> 进行缓冲

  [self.player prepareToPlay];

4.注意点:停播是音乐结束缓冲,但播放进程并不会清零.暂停音乐是不常停播,但缓冲继续.音乐播放,隐式缓冲.

  关键方法: 
    -(void)play;//播放
    -(void)prepareToPlay;//缓存播放
    -(void)pause;//暂停
    -(void)stop;//停止

视频

手续 3 :初步化对象
 _recorder = [[AVAudioRecorder alloc] initWithURL:self.recordFileUrl settings:recordSetting error:nil]; if (_recorder) { _recorder.meteringEnabled = YES; [_recorder prepareToRecord]; [_recorder record]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self stopRecord]; }); }

摄像录像

  • 1.框架:AVFoundation.

  • 2.关键类:

      AVCaptureDeviceInput(摄入设备)
      AVCaptureMoviewFileOutput(输出设备)
      AVCaptureSession(采集会话)
      AVCaptureVideoPreviewLayer(预览视图)
    
  • 3.录像录像的兑现思路:

          输入设备(音频输入麦克风,视频输入摄像头) -> 输出设备(视频文件) ->管理输入设备和输出设备的会话 ->预览视图 ->开始录制 ->录制视频的保存路径,输出设备开始录制 ->停止录制.
    
    • 输入音频设备:

        AVCaptureDevice *video = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
      
    • 输入录制设备:

        self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:video error:nil];
      
    • 输出设备:

        self.output = [[AVCaptureMovieFileOutput alloc] init];
      
    • 会话:

        self.session = [[AVCaptureSession alloc] init];
        //加入输入设备
        if ([self.session canAddInput:self.videoInput]) {
      
            [self.session addInput:self.videoInput];
        }
        if ([self.session canAddInput:self.audioInput]) {
      
            [self.session addInput:self.audioInput];
        }
        //加入输出设备
        if ([self.session canAddOutput:self.output]) {
            [self.session addOutput:self.output];
        }
      
    • 预览视图:

        self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
      
    • 开始收集:

        [self.session startRunning];
      
    • 开班录像:

        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"录制.mp4"];
        NSURL *url = [NSURL fileURLWithPath:path];
        [self.output startRecordingToOutputFileURL:url recordingDelegate:self];
      
    • 停下录像(三步:甘休摄像 甘休搜罗和移除预览视图State of Qatar

        [self.output stopRecording];
        [self.session stopRunning];
        [self.previewLayer removeFromSuperlayer];
      
  • 4.在做客迈克风和录制头时应伸手客商授权,在info,plist文件中对Mike风和摄像头进行描述.

MPMoviePlayerController

在iOS中播放摄像能够利用MediaPlayer.framework种的MPMoviePlayerController类来产生,它帮忙当地摄像和互连网录像播放。这一个类完结了MPMediaPlayback契约,因而全体平日的播放器调控作而成效,举个例子播放、暂停、结束等。可是MPMediaPlayerController本身并不是三个整机的视图调节器,即使要在UI中显得摄像要求将view属性加多到分界面中。下边列出了MPMoviePlayerController的常用属性和章程:

属性 说明
@property (nonatomic, copy) NSURL *contentURL 播放媒体URL,这个URL可以是本地路径,也可以是网络路径
@property (nonatomic, readonly) UIView *view 播放器视图,如果要显示视频必须将此视图添加到控制器视图中
@property (nonatomic, readonly) UIView *backgroundView 播放器背景视图
@property (nonatomic, readonly) MPMoviePlaybackState playbackState 媒体播放状态,枚举类型:
MPMoviePlaybackStateStopped:停止播放
MPMoviePlaybackStatePlaying:正在播放
MPMoviePlaybackStatePaused:暂停
MPMoviePlaybackStateInterrupted:中断
MPMoviePlaybackStateSeekingForward:向前定位
MPMoviePlaybackStateSeekingBackward:向后定位
@property (nonatomic, readonly) MPMovieLoadState loadState 网络媒体加载状态,枚举类型:
MPMovieLoadStateUnknown:位置类型
MPMovieLoadStatePlayable:
MPMovieLoadStatePlaythroughOK:这种状态如果shouldAutoPlay为YES将自动播放
MPMovieLoadStateStalled:停滞状态
@property (nonatomic) MPMovieControlStyle controlStyle 控制面板风格,枚举类型:
MPMovieControlStyleNone:无控制面板 
MPMovieControlStyleEmbedded:嵌入视频风格 
MPMovieControlStyleFullscreen:全屏 
MPMovieControlStyleDefault:默认风格
@property (nonatomic) MPMovieRepeatMode repeatMode; 重复播放模式,枚举类型:
MPMovieRepeatModeNone:不重复,默认值
MPMovieRepeatModeOne:重复播放
@property (nonatomic) BOOL shouldAutoplay 当网络媒体缓存到一定数据时是否自动播放,默认为YES
@property (nonatomic, getter=isFullscreen) BOOL fullscreen 是否全屏展示,默认为NO,注意如果要通过此属性设置全屏必须在视图显示完成后设置,否则无效
@property (nonatomic) MPMovieScalingMode scalingMode 视频缩放填充模式,枚举类型:
MPMovieScalingModeNone:不进行任何缩放
MPMovieScalingModeAspectFit:固定缩放比例并且尽量全部展示视频,不会裁切视频
MPMovieScalingModeAspectFill:固定缩放比例并填充满整个视图展示,可能会裁切视频
MPMovieScalingModeFill:不固定缩放比例压缩填充整个视图,视频不会被裁切但是比例失衡
@property (nonatomic, readonly) BOOL readyForDisplay 是否有相关媒体被播放
@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes 媒体类别,枚举类型:
MPMovieMediaTypeMaskNone:未知类型
MPMovieMediaTypeMaskVideo:视频
MPMovieMediaTypeMaskAudio:音频
@property (nonatomic) MPMovieSourceType movieSourceType 媒体源,枚举类型:
MPMovieSourceTypeUnknown:未知来源
MPMovieSourceTypeFile:本地文件
MPMovieSourceTypeStreaming:流媒体(直播或点播)
@property (nonatomic, readonly) NSTimeInterval duration 媒体时长,如果未知则返回0
@property (nonatomic, readonly) NSTimeInterval playableDuration 媒体可播放时长,主要用于表示网络媒体已下载视频时长
@property (nonatomic, readonly) CGSize naturalSize 视频实际尺寸,如果未知则返回CGSizeZero
@property (nonatomic) NSTimeInterval initialPlaybackTime 起始播放时间
@property (nonatomic) NSTimeInterval endPlaybackTime 终止播放时间
@property (nonatomic) BOOL allowsAirPlay 是否允许无线播放,默认为YES
@property (nonatomic, readonly, getter=isAirPlayVideoActive) BOOL airPlayVideoActive 当前媒体是否正在通过AirPlay播放
@property(nonatomic, readonly) BOOL isPreparedToPlay 是否准备好播放
@property(nonatomic) NSTimeInterval currentPlaybackTime 当前播放时间,单位:秒
@property(nonatomic) float currentPlaybackRate 当前播放速度,如果暂停则为0,正常速度为1.0,非0数据表示倍率
对象方法 说明
- (instancetype)initWithContentURL:(NSURL *)url 使用指定的URL初始化媒体播放控制器对象
- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated 设置视频全屏,注意如果要通过此方法设置全屏则必须在其视图显示之后设置,否则无效
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option 获取在指定播放时间的视频缩略图,第一个参数是获取缩略图的时间点数组;第二个参数代表时间点精度,枚举类型:
MPMovieTimeOptionNearestKeyFrame:时间点附近
MPMovieTimeOptionExact:准确时间
- (void)cancelAllThumbnailImageRequests 取消所有缩略图获取请求
- (void)prepareToPlay 准备播放,加载视频数据到缓存,当调用play方法时如果没有准备好会自动调用此方法
- (void)play 开始播放
- (void)pause 暂停播放
- (void)stop 停止播放
- (void)beginSeekingForward 向前定位
- (void)beginSeekingBackward 向后定位
- (void)endSeeking 停止快进/快退
通知 说明
MPMoviePlayerScalingModeDidChangeNotification 视频缩放填充模式发生改变
MPMoviePlayerPlaybackDidFinishNotification 媒体播放完成或用户手动退出,具体完成原因可以通过通知userInfo中的key为MPMoviePlayerPlaybackDidFinishReasonUserInfoKey的对象获取
MPMoviePlayerPlaybackStateDidChangeNotification 播放状态改变,可配合playbakcState属性获取具体状态
MPMoviePlayerLoadStateDidChangeNotification 媒体网络加载状态改变
MPMoviePlayerNowPlayingMovieDidChangeNotification 当前播放的媒体内容发生改变
MPMoviePlayerWillEnterFullscreenNotification 将要进入全屏
MPMoviePlayerDidEnterFullscreenNotification 进入全屏后
MPMoviePlayerWillExitFullscreenNotification 将要退出全屏
MPMoviePlayerDidExitFullscreenNotification 退出全屏后
MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification 当媒体开始通过AirPlay播放或者结束AirPlay播放
MPMoviePlayerReadyForDisplayDidChangeNotification 视频显示状态改变
MPMovieMediaTypesAvailableNotification 确定了媒体可用类型后
MPMovieSourceTypeAvailableNotification 确定了媒体来源后
MPMovieDurationAvailableNotification 确定了媒体播放时长后
MPMovieNaturalSizeAvailableNotification 确定了媒体的实际尺寸后
MPMoviePlayerThumbnailImageRequestDidFinishNotification 缩略图请求完成之后
MPMediaPlaybackIsPreparedToPlayDidChangeNotification 做好播放准备后

注意MPMediaPlayerController的意况等音讯实际不是经过代理来和外围人机联作的,而是通过布告中央,因而从地点的列表中得以看出常用的片段通报。由于MPMoviePlayerController本人对于媒体播放做了纵深的包裹,使用起来就特别轻巧:创制MPMoviePlayerController对象,设置frame属性,将MPMoviePlayerController的view增加到调控器视图中。上边的示范中将创立三个广播调整器并丰硕播放状态退换及广播完结的通知:

//
//  ViewController.m
//  MPMoviePlayerController
//
//  Created by Kenshin Cui on 14/03/30.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//

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

@interface ViewController ()

@property (nonatomic,strong) MPMoviePlayerController *moviePlayer;//视频播放控制器

@end

@implementation ViewController

#pragma mark - 控制器视图方法
- (void)viewDidLoad {
    [super viewDidLoad];

    //播放
    [self.moviePlayer play];

    //添加通知
    [self addNotification];

}

-(void)dealloc{
    //移除所有通知监控
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


#pragma mark - 私有方法
/**
 *  取得本地文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getFileUrl{
    NSString *urlStr=[[NSBundle mainBundle] pathForResource:@"The New Look of OS X Yosemite.mp4" ofType:nil];
    NSURL *url=[NSURL fileURLWithPath:urlStr];
    return url;
}

/**
 *  取得网络文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getNetworkUrl{
    NSString *urlStr=@"http://192.168.1.161/The New Look of OS X Yosemite.mp4";
    urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url=[NSURL URLWithString:urlStr];
    return url;
}

/**
 *  创建媒体播放控制器
 *
 *  @return 媒体播放控制器
 */
-(MPMoviePlayerController *)moviePlayer{
    if (!_moviePlayer) {
        NSURL *url=[self getNetworkUrl];
        _moviePlayer=[[MPMoviePlayerController alloc]initWithContentURL:url];
        _moviePlayer.view.frame=self.view.bounds;
        _moviePlayer.view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        [self.view addSubview:_moviePlayer.view];
    }
    return _moviePlayer;
}

/**
 *  添加通知监控媒体播放控制器状态
 */
-(void)addNotification{
    NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];

}

/**
 *  播放状态改变,注意播放完成时的状态是暂停
 *
 *  @param notification 通知对象
 */
-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
    switch (self.moviePlayer.playbackState) {
        case MPMoviePlaybackStatePlaying:
            NSLog(@"正在播放...");
            break;
        case MPMoviePlaybackStatePaused:
            NSLog(@"暂停播放.");
            break;
        case MPMoviePlaybackStateStopped:
            NSLog(@"停止播放.");
            break;
        default:
            NSLog(@"播放状态:%li",self.moviePlayer.playbackState);
            break;
    }
}

/**
 *  播放完成
 *
 *  @param notification 通知对象
 */
-(void)mediaPlayerPlaybackFinished:(NSNotification *)notification{
    NSLog(@"播放完成.%li",self.moviePlayer.playbackState);
}


@end

运行作效果果:

皇家88平台 1
从上边的API我们也轻巧看出其实MPMoviePlayerController效率极其苍劲,通常花销中作为平常的媒体播放器也完全没相当。MPMoviePlayerController除了貌似的录制播放和调控外还会有一对强盛的功能,举例截取录制缩略图。央求录像缩略图时只要调用- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option办法钦定获得缩略图的时间点,然后监察和控制MPMoviePlayerThumbnailImageRequestDidFinishNotification通报,种种时间点的缩略图伏乞完毕就能够调用公告,在通知调用方法中能够通过MPMoviePlayerThumbnailImageKey获取UIImage对象管理就可以。譬喻下边包车型客车主次演示了在前后相继运行后得到多个时间点的缩略图的长河,截图成功后保存到相册:

//
//  ViewController.m
//  MPMoviePlayerController
//
//  Created by Kenshin Cui on 14/03/30.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//  视频截图

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

@interface ViewController ()

@property (nonatomic,strong) MPMoviePlayerController *moviePlayer;//视频播放控制器

@end

@implementation ViewController

#pragma mark - 控制器视图方法
- (void)viewDidLoad {
    [super viewDidLoad];

    //播放
    [self.moviePlayer play];

    //添加通知
    [self addNotification];

    //获取缩略图
    [self thumbnailImageRequest];
}

-(void)dealloc{
    //移除所有通知监控
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


#pragma mark - 私有方法
/**
 *  取得本地文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getFileUrl{
    NSString *urlStr=[[NSBundle mainBundle] pathForResource:@"The New Look of OS X Yosemite.mp4" ofType:nil];
    NSURL *url=[NSURL fileURLWithPath:urlStr];
    return url;
}

/**
 *  取得网络文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getNetworkUrl{
    NSString *urlStr=@"http://192.168.1.161/The New Look of OS X Yosemite.mp4";
    urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url=[NSURL URLWithString:urlStr];
    return url;
}

/**
 *  创建媒体播放控制器
 *
 *  @return 媒体播放控制器
 */
-(MPMoviePlayerController *)moviePlayer{
    if (!_moviePlayer) {
        NSURL *url=[self getNetworkUrl];
        _moviePlayer=[[MPMoviePlayerController alloc]initWithContentURL:url];
        _moviePlayer.view.frame=self.view.bounds;
        _moviePlayer.view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        [self.view addSubview:_moviePlayer.view];
    }
    return _moviePlayer;
}

/**
 *  获取视频缩略图
 */
-(void)thumbnailImageRequest{
    //获取13.0s、21.5s的缩略图
    [self.moviePlayer requestThumbnailImagesAtTimes:@[@13.0,@21.5] timeOption:MPMovieTimeOptionNearestKeyFrame];
}

#pragma mark - 控制器通知
/**
 *  添加通知监控媒体播放控制器状态
 */
-(void)addNotification{
    NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerThumbnailRequestFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:self.moviePlayer];

}

/**
 *  播放状态改变,注意播放完成时的状态是暂停
 *
 *  @param notification 通知对象
 */
-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
    switch (self.moviePlayer.playbackState) {
        case MPMoviePlaybackStatePlaying:
            NSLog(@"正在播放...");
            break;
        case MPMoviePlaybackStatePaused:
            NSLog(@"暂停播放.");
            break;
        case MPMoviePlaybackStateStopped:
            NSLog(@"停止播放.");
            break;
        default:
            NSLog(@"播放状态:%li",self.moviePlayer.playbackState);
            break;
    }
}

/**
 *  播放完成
 *
 *  @param notification 通知对象
 */
-(void)mediaPlayerPlaybackFinished:(NSNotification *)notification{
    NSLog(@"播放完成.%li",self.moviePlayer.playbackState);
}

/**
 *  缩略图请求完成,此方法每次截图成功都会调用一次
 *
 *  @param notification 通知对象
 */
-(void)mediaPlayerThumbnailRequestFinished:(NSNotification *)notification{
    NSLog(@"视频截图完成.");
    UIImage *image=notification.userInfo[MPMoviePlayerThumbnailImageKey];
    //保存图片到相册(首次调用会请求用户获得访问相册权限)
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
}

@end

截图效果:

皇家88平台 2     皇家88平台 3

手续 2 :设置采集样本参数
//设置参数 NSDictionary *recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys: //采样率 8000/11025/22050/44100/96000 [NSNumber numberWithFloat: 8000.0],AVSampleRateKey, // 音频格式 [NSNumber numberWithInt: kAudioFormatLinearPCM],AVFormatIDKey, //采样位数 8、16、24、32 默认为16 [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey, // 音频通道数 1 或 2 [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, //录音质量 [NSNumber numberWithInt:AVAudioQualityHigh],AVEncoderAudioQualityKey, nil];

视频截图(本质获取媒体文件中供给的关键帧图片卡塔尔

  • 1.落成思路:

      根据文件路径,创建视频文件资源(AVAsset) -> 创建媒体文件图片生成器(AVAssetImageGenerator) -> 获取当前播放时间 -> 生成图片:[图片生成器对象 generateCGImageAsynchronouslyForTimes:...];
    
  • 2.关键类:

      AVAsset(资源)
      媒体文件图片生成器(AVAssetImageGenerator)
    
  • 3.重要办法:

      创建媒体资源:AVAsset的类方法创建
    
      创建媒体文件图片生成器对象: AVAssetImageGenerator(类方法创建).
    
      获取当前媒体文件的播放时间:CMTime time  = self.avplayer.currentTime.
    
      生成图片:[媒体文件图片生成器对象 generateCGImagesAsynchronouslyForTimes...];
    
      //死锁: 在某个线程中嵌套该线程的同步任务才会死锁
    

UIImagePickerController拍照和录制摄像

下边看一下在iOS怎样拍片和摄像录像。在iOS中要照相和录像录像最简便易行的章程正是利用UIImagePickerController。UIImagePickerController世袭于UINavigationController,前面包车型客车篇章中首要行使它来筛选照片,其实UIImagePickerController的意义不仅仅如此,它还足以用来拍戏和摄像录像。首先看一下以此类常用的品质和办法:

属性 说明
@property(nonatomic)           UIImagePickerControllerSourceType     sourceType 拾取源类型,sourceType是枚举类型:
UIImagePickerControllerSourceTypePhotoLibrary:照片库
,默认值
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿
@property(nonatomic,copy)      NSArray                              *mediaTypes 媒体类型,默认情况下此数组包含kUTTypeImage,所以拍照时可以不用设置;但是当要录像的时候必须设置,可以设置为kUTTypeVideo(视频,但不带声音)或者kUTTypeMovie(视频并带有声音)
@property(nonatomic)           NSTimeInterval                        videoMaximumDuration 视频最大录制时长,默认为10 s
@property(nonatomic)           UIImagePickerControllerQualityType    videoQuality 视频质量,枚举类型:
UIImagePickerControllerQualityTypeHigh:高清质量
UIImagePickerControllerQualityTypeMedium:中等质量,适合WiFi传输
UIImagePickerControllerQualityTypeLow:低质量,适合蜂窝网传输
UIImagePickerControllerQualityType640x480:640*480
UIImagePickerControllerQualityTypeIFrame1280x720:1280*720
UIImagePickerControllerQualityTypeIFrame960x540:960*540
@property(nonatomic)           BOOL                                  showsCameraControls 是否显示摄像头控制面板,默认为YES
@property(nonatomic,retain)    UIView                                *cameraOverlayView  摄像头上覆盖的视图,可用通过这个视频来自定义拍照或录像界面
@property(nonatomic)           CGAffineTransform                     cameraViewTransform 摄像头形变
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode 摄像头捕获模式,捕获模式是枚举类型:
UIImagePickerControllerCameraCaptureModePhoto:拍照模式
UIImagePickerControllerCameraCaptureModeVideo:视频录制模式
@property(nonatomic) UIImagePickerControllerCameraDevice      cameraDevice 摄像头设备,cameraDevice是枚举类型:
UIImagePickerControllerCameraDeviceRear:前置摄像头
UIImagePickerControllerCameraDeviceFront:后置摄像头
@property(nonatomic) UIImagePickerControllerCameraFlashMode   cameraFlashMode  闪光灯模式,枚举类型:
UIImagePickerControllerCameraFlashModeOff:关闭闪光灯
UIImagePickerControllerCameraFlashModeAuto:闪光灯自动
UIImagePickerControllerCameraFlashModeOn:打开闪光灯
类方法 说明
(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType 指定的源类型是否可用,sourceType是枚举类型:
UIImagePickerControllerSourceTypePhotoLibrary:照片库
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿
(NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType 指定的源设备上可用的媒体类型,一般就是图片和视频
(BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice 指定的摄像头是否可用,cameraDevice是枚举类型:
UIImagePickerControllerCameraDeviceRear:前置摄像头
UIImagePickerControllerCameraDeviceFront:后置摄像头
(BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice 指定摄像头的闪光灯是否可用
(NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice 获得指定摄像头上的可用捕获模式,捕获模式是枚举类型:
UIImagePickerControllerCameraCaptureModePhoto:拍照模式
UIImagePickerControllerCameraCaptureModeVideo:视频录制模式
对象方法 说明
- (void)takePicture  编程方式拍照
- (BOOL)startVideoCapture  编程方式录制视频
- (void)stopVideoCapture 编程方式停止录制视频
代理方法 说明
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 媒体拾取完成
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 取消拾取
扩展方法(主要用于保存照片、视频到相簿) 说明
UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo) 保存照片到相簿
UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) 能否将视频保存到相簿
void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SEL completionSelector, void *contextInfo) 保存视频到相簿

要用UIImagePickerController来拍照大概录制摄像常常能够分成如下步骤:

  1. 创建UIImagePickerController对象。 
  2. 内定拾取源,平日接受照片时行使的拾取源是照片库可能相簿,此刻内需钦点为拍照头类型。 
  3. 点名录制头,前置录制头或然前置录制头。 
  4. 设置媒体类型mediaType,注意假诺是水墨画必得设置,假使是拍戏此步骤能够总结,因为mediaType暗许满含kUTTypeImage(注意媒体类型定义在MobileCoreServices.framework中) 
  5. 点名捕获格局,拍照只怕摄像录制。(录像录像时必需先安装媒体类型再安装捕获格局 
  6. ) 
  7. 体现UIImagePickerController(平日以模态窗口形式展开)。 
  8. 拍照和摄像录像甘休后在代理方法中展现/保存照片或录像。

天经地义这些历程中有超级多细节能够设置,举个例子是还是不是出示拍照调节面板,拍照后是还是不是允许编辑等等,通过下边包车型地铁质量/方法列表相信并不难明白。下边就以二个示范展示什么使用UIImagePickerController来拍照和摄像摄像,上边包车型大巴次第中假设将_isVideo设置为YES正是录制录像格局,摄像完后在主视图调整器中自动播放;假设将_isVideo设置为NO则为拍录格局,拍照完毕之后在主视图调整器中体现拍片的肖像:

//
//  ViewController.m
//  UIImagePickerController
//
//  Created by Kenshin Cui on 14/04/05.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (assign,nonatomic) int isVideo;//是否录制视频,如果为1表示录制视频,0代表拍照
@property (strong,nonatomic) UIImagePickerController *imagePicker;
@property (weak, nonatomic) IBOutlet UIImageView *photo;//照片展示视图
@property (strong ,nonatomic) AVPlayer *player;//播放器,用于录制完视频后播放视频

@end

@implementation ViewController

#pragma mark - 控制器视图事件
- (void)viewDidLoad {
    [super viewDidLoad];
    //通过这里设置当前程序是拍照还是录制视频
    _isVideo=YES;
}

#pragma mark - UI事件
//点击拍照按钮
- (IBAction)takeClick:(UIButton *)sender {
    [self presentViewController:self.imagePicker animated:YES completion:nil];
}

#pragma mark - UIImagePickerController代理方法
//完成
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照
        UIImage *image;
        //如果允许编辑则获得编辑后的照片,否则获取原始照片
        if (self.imagePicker.allowsEditing) {
            image=[info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片
        }else{
            image=[info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片
        }
        [self.photo setImage:image];//显示照片
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);//保存到相簿
    }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是录制视频
        NSLog(@"video...");
        NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//视频路径
        NSString *urlStr=[url path];
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
            //保存视频到相簿,注意也可以使用ALAssetsLibrary来保存
            UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存视频到相簿
        }

    }

    [self dismissViewControllerAnimated:YES completion:nil];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    NSLog(@"取消");
}

#pragma mark - 私有方法
-(UIImagePickerController *)imagePicker{
    if (!_imagePicker) {
        _imagePicker=[[UIImagePickerController alloc]init];
        _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//设置image picker的来源,这里设置为摄像头
        _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头
        if (self.isVideo) {
            _imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie];
            _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;
            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)

        }else{
            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;
        }
        _imagePicker.allowsEditing=YES;//允许编辑
        _imagePicker.delegate=self;//设置代理,检测操作
    }
    return _imagePicker;
}

//视频保存后的回调
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    if (error) {
        NSLog(@"保存视频过程中发生错误,错误信息:%@",error.localizedDescription);
    }else{
        NSLog(@"视频保存成功.");
        //录制完之后自动播放
        NSURL *url=[NSURL fileURLWithPath:videoPath];
        _player=[AVPlayer playerWithURL:url];
        AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:_player];
        playerLayer.frame=self.photo.frame;
        [self.photo.layer addSublayer:playerLayer];
        [_player play];

    }
}
@end

运作效果(录制录像):

皇家88平台 4

四、播放摄像

    1. 开创播放器
    1. 设置文件播放路线
    1. 监听事件
手续 1 :成立播放器
 self.videoPlayer = [[MPMoviePlayerController alloc] init]; [self.videoPlayer.view setFrame:self.view.bounds]; self.videoPlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:self.videoPlayer.view]; [self.videoPlayer prepareToPlay]; self.videoPlayer.controlStyle = MPMovieControlStyleNone; self.videoPlayer.shouldAutoplay = YES; self.videoPlayer.repeatMode = MPMovieRepeatModeOne;

录制转制(输出相册中的摄像并压缩卡塔尔

  • 1.实现思路:

      创建UIImagePickerController对象 ->设置代理,设置资源类型(获取图片)和媒体类型(获取视频) ->modal展示 ->在代理方法中获取路径获取媒体文件 ->创建媒体转制会话 ->设置输出的路径 ->设置可支持的输出格式 ->输出视频 ->销毁UIImagePickerController对象
    
  • 2.步骤:

    • 始建调控器:

        UIImagePickerController *imgVc = [[UIImagePickerController alloc] init];
      
    • 设置代理:

        imgVc.delegate = self;
      
    • 设置类型:

        imgVc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
      
    • 收获相册中央电视台频 须要设置媒体类型:

        imgVc.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
      
    • modal展示:

        [self presentViewController:imgVc animated:YES completion:nil];
      
    • 转制摄像:

      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
      
            NSLog(@"%@", info);
            //获取媒体文件
            NSURL *url = info[UIImagePickerControllerMediaURL];
            AVAsset *asset = [AVAsset assetWithURL:url];
            //创建媒体转制会话
            AVAssetExportSession *session = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetLowQuality];
            //设置转出的路径
            NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"转出的视频.mp4"];
            session.outputURL = [NSURL fileURLWithPath:filePath];
            //获取支持的转出格式
            [session determineCompatibleFileTypesWithCompletionHandler:^(NSArray<NSString *> * _Nonnull compatibleFileTypes) {
      
            NSLog(@"%@", compatibleFileTypes);
            }];
            //设置转出的格式 转出格式必须支持
            session.outputFileType = @"public.mpeg-4";
            //转出视频
            [session exportAsynchronouslyWithCompletionHandler:^{
      
            NSLog(@"完成转出");
            //销毁控制器
            [picker dismissViewControllerAnimated:YES completion:nil];
            }];
        }
      

皇家88平台 ,多谢抚玩,钟爱的话就点一下!

恢宏--使用AVFoundation生成缩略图

由早先面包车型客车情势我们应该已经观察,使用MPMoviePlayerController来生成缩略图丰裕轻松,可是只要单纯是是为了扭转缩略图而不举行录制播放的话,此刻应用MPMoviePlayerController就有一些大题小做了。其实选用AVFundation框架中的AVAssetImageGenerator就能够赢得录像缩略图。使用AVAssetImageGenerator获取缩略图大约分为多少个步骤:

  1. 创造AVURLAsset对象(此类首要用来获取媒体音信,包蕴录制、声音等)。 
  2. 根据AVURLAsset创建AVAssetImageGenerator对象。 
  3. 动用AVAssetImageGenerator的copyCGImageAtTime::方法赢得指准时期点的截图。
//
//  ViewController.m
//  AVAssetImageGenerator
//
//  Created by Kenshin Cui on 14/03/30.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //获取第13.0s的缩略图
    [self thumbnailImageRequest:13.0];
}

#pragma mark - 私有方法
/**
 *  取得本地文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getFileUrl{
    NSString *urlStr=[[NSBundle mainBundle] pathForResource:@"The New Look of OS X Yosemite.mp4" ofType:nil];
    NSURL *url=[NSURL fileURLWithPath:urlStr];
    return url;
}

/**
 *  取得网络文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getNetworkUrl{
    NSString *urlStr=@"http://192.168.1.161/The New Look of OS X Yosemite.mp4";
    urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url=[NSURL URLWithString:urlStr];
    return url;
}

/**
 *  截取指定时间的视频缩略图
 *
 *  @param timeBySecond 时间点
 */
-(void)thumbnailImageRequest:(CGFloat )timeBySecond{
    //创建URL
    NSURL *url=[self getNetworkUrl];
    //根据url创建AVURLAsset
    AVURLAsset *urlAsset=[AVURLAsset assetWithURL:url];
    //根据AVURLAsset创建AVAssetImageGenerator
    AVAssetImageGenerator *imageGenerator=[AVAssetImageGenerator assetImageGeneratorWithAsset:urlAsset];
    /*截图
     * requestTime:缩略图创建时间
     * actualTime:缩略图实际生成的时间
     */
    NSError *error=nil;
    CMTime time=CMTimeMakeWithSeconds(timeBySecond, 10);//CMTime是表示电影时间信息的结构体,第一个参数表示是视频第几秒,第二个参数表示每秒帧数.(如果要活的某一秒的第几帧可以使用CMTimeMake方法)
    CMTime actualTime;
    CGImageRef cgImage= [imageGenerator copyCGImageAtTime:time actualTime:&actualTime error:&error];
    if(error){
        NSLog(@"截取视频缩略图时发生错误,错误信息:%@",error.localizedDescription);
        return;
    }
    CMTimeShow(actualTime);
    UIImage *image=[UIImage imageWithCGImage:cgImage];//转化为UIImage
    //保存到相册
    UIImageWriteToSavedPhotosAlbum(image,nil, nil, nil);
    CGImageRelease(cgImage);
}

@end

调换的缩略图效果:

皇家88平台 5

五、录像录音

    1. 创建捕捉会话
    1. 安装采集样板参数
    1. 初阶化对象
    1. 金玉锦绣录音
步骤 1 :创制捕捉会话
 AVAudioSession *session =[AVAudioSession sharedInstance]; NSError *sessionError; [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; if (session != nil) { [session setActive:YES error:nil]; } self.session = session;

录音

  • 1.录音响效果应的贯彻:

      生成录音的存放路径(沙盒路径,拼接文件名:stringByAppendingPathComponent:@"音频名.caf") -> 设置采样率和位深 -> 对象方法创建录音机对象
    
  • 2.框架:AVFoundation.

    • 关键类:AVFoundationRecorder.

    • 关键办法:

          -(void)record;//录制
          -(void)pause;//暂停
          -(void)stop;//停止
      
  • 3.装置采集样板率和位深:

      NSDictionary *settings = @{AVSampleRateKey:@44100,AVLinearPCMBitDepthKey:@16};
    
  • 4.注意点:

      真机进行录音时,需要请求用户授权.在info.plist进行麦克风的授权说明.
    
  • 5.检查测验录音音量变化(&静默2s终止录音State of Qatar

      //开启检测音量变化
      self.recorder.meteringEnabled = YES;
    
      //开启定时器
      [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    
      - (void)updateMeters{
          //更新音量变化
          [self.recorder updateMeters];
          //获取瞬时音量
          float power = [self.recorder peakPowerForChannel:0];
          NSLog(@"%f", power);
          //静默两秒后就停止录音
          if (power < -30) {
              //累计静默计数
              self.muteCount  ;
              if (self.muteCount >= 120) { //静默两秒钟
                  //停止录音
                  [self.recorder stop];
                  //停止定时器
                  [self.displayLink invalidate];
              }
    
          } else {
    
              //有声音,就重新计数
              self.muteCount = 0;
          }
      }
    

趁着移动互连网的前进,如今的无绳电话机早就不是通话、发短信那么轻易了,播放音乐、录像、录音、拍照等都以很常用的功效。在iOS中对此多媒体的援助是拾贰分刚劲的,无论是音录制播放、录像,依然对Mike风、录制头的操作都提供了多套API。在后天的文章上校会对那些剧情开展逐个介绍。

手续 4 :实现录音
 [_recorder prepareToRecord]; [_recorder record];

音效

  • 1.iOS中音乐能够暂停,音响效果无法操作;何况音响效果能够即时播放,加载到地方,而音乐必要缓冲,边上面播.在iOS中只有小于30s的音乐才干够行使音效的章程开展播放.

  • 2.播放音响效果的兑现思路:最先化soundID -> 获取音频文件的本地路线(NSUHavalL类型卡塔尔 ->成立soundID -> 进行播放.

        音效播放的优化:以键值对的形式对音频文件和对应的soundID进行缓存,获取之前先判断对应的soundID是否已经在,存在的话直接在内存中取,不存在才创建:
        SystemSoundID systemSoundID;
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"buyao.caf" withExtension:nil];
        AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &systemSoundID);
        AudioServicesPlaySystemSound(systemSoundID);
    
        在接收到内存警告的情况下:释放soundID对应的内存地址,清空内存缓存.
        //释放soundID对应的内存地址
        for (NSNumber *soundIDNum in self.soundIDCache.allValues) {
    
              AudioServicesDisposeSystemSoundID([soundIDNum unsignedIntValue]);
        }
    
  • 3.框架:AVFoundation.

  • 4.关键类:SystemSoundID,每一个音频文件使用音响效果形式管理时,会完全的增加到内部存储器中,并被给与一个声响ID.

  • 5.C的对象和OC对象的转账中内部存款和储蓄器管理:

      __bridge 用于Foundation中的类和CoreFoundation中的类相互转换,并且内存管理所有权不会改变。
      __bridge_retained 只能用于Foundation对象转CoreFoundation引用,而且内存管理的所有权会移交给引CoreFoundation的引用(注意手动内存管理)。
      __bridge_transfer 只能用于CoreFoundation引用转Foundation对象,而且内存管理的所有权会移交给引Foundation(会自动内存管理,不需要手动释放)。
    

音频会话

实则上边包车型大巴播放器还留存有的标题,比方平常大家看看的播放器即使脱离到后台也是能够播放的,而那几个播放器假如退出到后台它会活动制动踏板。假使要扶助后台播放供给做上边几件事情:

1.设置后台运维形式:在plist文件中加多Required background modes,并且安装item 0=App plays audio or streams audio/video using AirPlay(其实能够平昔通过Xcode在Project Targets-Capabilities-Background Modes中装置)

皇家88平台 6

2.装置AV奥迪(Audi卡塔尔国oSession的体系为AV奥迪oSessionCategoryPlayback並且调用setActive::方法运维会话。

    AVAudioSession *audioSession=[AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
    [audioSession setActive:YES error:nil];

3.为了能够让动用退到后台之后帮助耳麦调整,建议增加长间距调控事件(这一步不是后台播放必需的)

前两步是后台播放所不可不安装的,第三步关键用以收纳远程事件,那有个别剧情前边的文章中有详尽介绍,假设这一步不安装虽让也能够在后台播放,可是力所不及赢得音频调整权(假诺在使用当前采纳早先运用别的播放器播放音乐以来,这时候借使按耳麦播放键可能决定中央的播放开关则会播放前三个使用的旋律),并且不能够应用动铁耳机实行音频调整。第一步操作相信大家都相当的轻巧掌握,倘诺应用程序要允许运营到后台必得安装,平常情形下选拔假若进入后台会被挂起,通过该装置能够上应用程序继续在后台运营。可是第二步使用的AV奥迪(Audi卡塔尔oSession有不可缺少进行一下详尽的验证。

在iOS中种种应用都有多个音频会话,那么些会话就经过AV奥迪(Audi卡塔尔(قطر‎oSession来代表。AV奥迪(Audi卡塔尔oSession同样存在于AVFoundation框架中,它是单例格局设计,通过sharedInstance实行寻访。在接纳Apple设备时大家会意识有一点点应用只要张开其余音频播放就能够终止,而有些应用却得以和其余使用还要播放,在二种节奏景况中如何去调节播放的主意便是通过音频会话来成功的。上面是音频会话的两种会话情势:

会话类型 说明 是否要求输入 是否要求输出 是否遵从静音键
AVAudioSessionCategoryAmbient 混音播放,可以与其他音频应用同时播放
AVAudioSessionCategorySoloAmbient 独占播放
AVAudioSessionCategoryPlayback 后台播放,也是独占的
AVAudioSessionCategoryRecord 录音模式,用于录音时使用
AVAudioSessionCategoryPlayAndRecord 播放和录音,此时可以录音也可以播放
AVAudioSessionCategoryAudioProcessing 硬件解码音频,此时不能播放和录制 
AVAudioSessionCategoryMultiRoute 多种输入输出,例如可以耳机、USB设备同时播放

在乎:是或不是比照静音键表示在播放进度中一经客户通过硬件设置为静音是还是不是能关闭声音。

听别人说后边对音频会话的接头,相信大家付出出能够在后台播放的旋律播放器并简单,可是注意一下,在前头的代码中也事关设置完音频会话类型之后须求调用setActive::方法将会话激活技术起效能。近似的,假使八个应用已经在播音音频,张开大家的利用之后设置了在后台播放的对话类型,当时任何应用的音频会截止而播放大家的音频,假若希望大家的主次音频播放完事后(关闭或分离到后台之后)能够三回九转播放别的使用的点子的话则足以调用setActive::方法关闭对话。代码如下:

//
//  ViewController.m
//  KCAVAudioPlayer
//
//  Created by Kenshin Cui on 14/03/30.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//  AVAudioSession 音频会话

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#define kMusicFile @"刘若英 - 原来你也在这里.mp3"
#define kMusicSinger @"刘若英"
#define kMusicTitle @"原来你也在这里"

@interface ViewController ()<AVAudioPlayerDelegate>

@property (nonatomic,strong) AVAudioPlayer *audioPlayer;//播放器
@property (weak, nonatomic) IBOutlet UILabel *controlPanel; //控制面板
@property (weak, nonatomic) IBOutlet UIProgressView *playProgress;//播放进度
@property (weak, nonatomic) IBOutlet UILabel *musicSinger; //演唱者
@property (weak, nonatomic) IBOutlet UIButton *playOrPause; //播放/暂停按钮(如果tag为0认为是暂停状态,1是播放状态)

@property (weak ,nonatomic) NSTimer *timer;//进度更新定时器

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setupUI];

}

/**
 *  显示当面视图控制器时注册远程事件
 *
 *  @param animated 是否以动画的形式显示
 */
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    //开启远程控制
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    //作为第一响应者
    //[self becomeFirstResponder];
}
/**
 *  当前控制器视图不显示时取消远程控制
 *
 *  @param animated 是否以动画的形式消失
 */
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    //[self resignFirstResponder];
}

/**
 *  初始化UI
 */
-(void)setupUI{
    self.title=kMusicTitle;
    self.musicSinger.text=kMusicSinger;
}

-(NSTimer *)timer{
    if (!_timer) {
        _timer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:true];
    }
    return _timer;
}

/**
 *  创建播放器
 *
 *  @return 音频播放器
 */
-(AVAudioPlayer *)audioPlayer{
    if (!_audioPlayer) {
        NSString *urlStr=[[NSBundle mainBundle]pathForResource:kMusicFile ofType:nil];
        NSURL *url=[NSURL fileURLWithPath:urlStr];
        NSError *error=nil;
        //初始化播放器,注意这里的Url参数只能时文件路径,不支持HTTP Url
        _audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];
        //设置播放器属性
        _audioPlayer.numberOfLoops=0;//设置为0不循环
        _audioPlayer.delegate=self;
        [_audioPlayer prepareToPlay];//加载音频文件到缓存
        if(error){
            NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);
            return nil;
        }
        //设置后台播放模式
        AVAudioSession *audioSession=[AVAudioSession sharedInstance];
        [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
//        [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];
        [audioSession setActive:YES error:nil];
        //添加通知,拔出耳机后暂停播放
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(routeChange:) name:AVAudioSessionRouteChangeNotification object:nil];
    }
    return _audioPlayer;
}

/**
 *  播放音频
 */
-(void)play{
    if (![self.audioPlayer isPlaying]) {
        [self.audioPlayer play];
        self.timer.fireDate=[NSDate distantPast];//恢复定时器
    }
}

/**
 *  暂停播放
 */
-(void)pause{
    if ([self.audioPlayer isPlaying]) {
        [self.audioPlayer pause];
        self.timer.fireDate=[NSDate distantFuture];//暂停定时器,注意不能调用invalidate方法,此方法会取消,之后无法恢复

    }
}

/**
 *  点击播放/暂停按钮
 *
 *  @param sender 播放/暂停按钮
 */
- (IBAction)playClick:(UIButton *)sender {
    if(sender.tag){
        sender.tag=0;
        [sender setImage:[UIImage imageNamed:@"playing_btn_play_n"] forState:UIControlStateNormal];
        [sender setImage:[UIImage imageNamed:@"playing_btn_play_h"] forState:UIControlStateHighlighted];
        [self pause];
    }else{
        sender.tag=1;
        [sender setImage:[UIImage imageNamed:@"playing_btn_pause_n"] forState:UIControlStateNormal];
        [sender setImage:[UIImage imageNamed:@"playing_btn_pause_h"] forState:UIControlStateHighlighted];
        [self play];
    }
}

/**
 *  更新播放进度
 */
-(void)updateProgress{
    float progress= self.audioPlayer.currentTime /self.audioPlayer.duration;
    [self.playProgress setProgress:progress animated:true];
}

/**
 *  一旦输出改变则执行此方法
 *
 *  @param notification 输出改变通知对象
 */
-(void)routeChange:(NSNotification *)notification{
    NSDictionary *dic=notification.userInfo;
    int changeReason= [dic[AVAudioSessionRouteChangeReasonKey] intValue];
    //等于AVAudioSessionRouteChangeReasonOldDeviceUnavailable表示旧输出不可用
    if (changeReason==AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
        AVAudioSessionRouteDescription *routeDescription=dic[AVAudioSessionRouteChangePreviousRouteKey];
        AVAudioSessionPortDescription *portDescription= [routeDescription.outputs firstObject];
        //原设备为耳机则暂停
        if ([portDescription.portType isEqualToString:@"Headphones"]) {
            [self pause];
        }
    }

//    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
//        NSLog(@"%@:%@",key,obj);
//    }];
}

-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionRouteChangeNotification object:nil];
}

#pragma mark - 播放器代理方法
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    NSLog(@"音乐播放完成...");
    //根据实际情况播放完成可以将会话关闭,其他音频应用继续播放
    [[AVAudioSession sharedInstance]setActive:NO error:nil];
}

@end

在上边包车型客车代码中还贯彻了拔出耳机暂停音乐广播的效率,那也是二个相比宽泛的功用。在iOS7及以往的版本中能够透过公告获得输出改换的布告,然后得到通报对象后依据userInfo取得是何种改动类型,进而根据意况对音乐举办暂停操作。

本文由68399皇家赌场发布于最新解决方案,转载请注明出处:iOS开发系列,实现视频的录制

关键词: 68399皇家赌场 日记本 iOS 视频 音频

上一篇:YYModel源码分析,YYModel源码学习

下一篇:没有了

最火资讯