新浦京81707con > 注册购买 > AVPlayer的那些坑,iOS学习45之多媒体操作

原标题:AVPlayer的那些坑,iOS学习45之多媒体操作

浏览次数:194 时间:2020-04-15

此番重视是计算和记录下摄像播放碰到的坑,录制播放采取的是AVPlayer这一个控件,语法大约如下:

1. 音频

 NSURL * url = [NSURL fileURLWithPath:@"视频地址"]; AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url]; self.player = [AVPlayer playerWithPlayerItem:playerItem]; [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil]; self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone; self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player]; self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect; self.playerLayer.frame = self.view.bounds; [self.view.layer addSublayer:self.playerLayer];

 1> 音频达成简述

  iOS 里面共有二种特地完结播放音频的点子:

  •  System Sound Services(系统声音服务)

  •  OpenAL(跨平台的开源的旋律管理接口卡塔尔

  •  奥迪o Queue Services(播放和录像音频服务)

  •  AV奥迪oPlayer(高端音频播放器)

平淡无奇,这里要监听AVPlayerItem的status属性:

 2> System Sound 瑟维斯s(系统声音服务)

  ① System Sound Services 是最尾部也是最简单易行的声息播放服务,通过调用 AudioServicesPlaySystemSound 那些函数就足以播放一些轻易易行的音频文件

  ② 局限性:

   1.  声音长度要自愧不如30秒

   2.  格式:IMA4

   3.  不可能说了算播放的进度

   4.  调用方法后旋即播放声音

   5.  从未有过循环播放和立体声音播放

  ③ 实例代码

    CFBundleRef mainBundle;

    SystemSoundID soundFileObject;

    mainBundle = CFBundleGetMainBundle ();

    CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (mainBundle, CFSTR ("蔡琴 - 爱断情伤"), CFSTR ("wav"), NULL);

    AudioServicesCreateSystemSoundID (soundFileURLRef, &soundFileObject);

    AudioServicesPlaySystemSound(soundFileObject);
 * *AVPlayerItem的三种状态 *AVPlayerItemStatusUnknown, *AVPlayerItemStatusReadyToPlay, *AVPlayerItemStatusFailed */

 3> OpenAL

  ① 简介

   OpenAL 是一套跨平台的开源的点子管理接口

   最切合开垦娱乐的音频

   OpenAL 包罗多个 实体:Listener(听者State of Qatar、Source(音源卡塔尔国、 Buffer(缓存)

   奥迪(Audi卡塔尔(قطر‎o Queue Services 重要用以达成录像音频,为了简化音频文件的拍卖,经常还须要使用到 奥迪(Audi卡塔尔oFileServices

  ② 开辟步骤

   1.获取device

   2.将context关联到device

   3.将数据归入buffer

   4.将buffer链接到三个source

   5.播放source

  OpenAL资料网站:
           

  相对底层的 API参照他事他说加以考查:

只假使AVPlayerStatusFailed表达摄像加载战败,那个时候可以因而self.player.error.description属性来找寻切实可行的缘由。 难点一:当status变为AVPlayerStatusReadyToPlay后,大家调用play方法真的就可以确认保证摄像平常播放吗?

 4> AVAudioPlayer简介

  大家得以把 AV奥迪oPlayer 看作是叁个高等的播放器,它补助周围的音频格式,如下:

  • AAC

  • AMR(AdaptiveMulti-Rate, aformatforspeech)

  • ALAC(AppleLossless)

  • iLBC(internetLowBitrateCodec, anotherformatforspeech)

  • IMA4(IMA/ADPCM)

  • linearPCM(uncompressed)

  • MP3(MPEG-1audiolayer3)

众目昭彰,AVPlayer扶助的摄像、音频格式特别广阔,抛开那一个无法符合规律编解码的情景,在好几情形下其或然正是一定要荒谬播放。AVPlayer在进展播报时,会预先解码一些剧情,而那个时候一旦我们的App使用CPU过多,I/O读写过多时,有超级大或然变成录制播放声/画差异台,那一点特别在One plus4上面表现特别鲜明,顾客举报iOS9.3.2的种类上也很领悟。而只借使发出在AVPlayer初阶消除码录制的时候,有超级大可能引致录制直接非常小概播放,那个时候,大家再调用play大概seekToTime:方法都力不能支正常播放。提议不用在CPU或许I/O很频仍的状态下接纳AVPlayer,举例刚登陆App加载各样数码的情景下,能够等App预热今后再使用。

 5> AVAudioPlayer优势

  • 支撑越多的格式

  • 能够播放大肆长度的音频文件

  • 支撑循环播放

  • 能够一并广播七个音频文件

  • 支配播放进程以至从点子的任性一点开播

标题二:当rate属性的值大于0后,真的就在播音摄像了呢?

 6> AV奥迪(Audi卡塔尔国oPlayer开采步骤

  • 步骤一:AV奥迪oPlayer 蕴含在 AVFoundation 框架中,所以开采的时候首起始入音频的框架 AVFoundation.framework

  引进头文件

#import <AVFoundation/AVFoundation.h>
  • 手续二: AV奥迪(Audi卡塔尔(قطر‎oPlayer 的伊始化的时候需求给叁个广播文件

  AVAudioPlayer  *avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfU奥迪Q5L:文件路径error:nil];

  • 步骤三:主要性质

  设置初步音量大小 audioPlayer.volume = 1;(0.0 ~ 1.0)

  设置音乐广播次数  audioPlayer.numberOfLoops = -1;(只假如负数都以循环播放卡塔尔(قطر‎

  播放进程 audioPlayer.currentTime = 0;

  • 步骤四:主要艺术

  预播放

[audioPlayer prepareToPlay];

  播放

[audioPlayer play];

  暂停

[audioPlayer pause];

  停止

[audioPlayer stop];
  • 步骤五:代理方法

  协议:AVAudioPlayerDelegate

   播放达成会调用的代理方法

    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;

   播放解码战败

    - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;

本来不是。当产生上边所讲的情况时,笔者打印了现阶段的rate情况,是大于0的,不过页面上显得的情事却依然怎么也绝非。不常候大家假设想要在录像一播放的时候去做一些事务,举个例子设置一下播放器的背景观,假若大家只有是监听那个rate大概无法100%作保有效,而要是大家真正要监听这种状态来讲,有一个取巧的格局:

  7> 轻便代码实例:

// 懒加载
- (AVAudioPlayer *)player
{
    if (_player == nil) {

        NSString *urlString = [[NSBundle mainBundle] pathForResource:@"南征北战 - 骄傲的少年" ofType:@"mp3"];

        NSURL *url = [NSURL fileURLWithPath:urlString];

        _player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

        _player.delegate = self;

        // 设置默认的音量
        _player.volume = 0.5;
    }
    return _player;
}

// 播放按钮响应事件
- (IBAction)play:(id)sender
{
    [self.player play];
}

// 暂停按钮响应事件
- (IBAction)pause:(id)sender
{
    [self.player pause];
}

// 停止按钮响应事件
- (IBAction)stop:(id)sender
{
    [self.player stop];
}

// 音量滑竿响应事件
- (IBAction)changeVolume:(UISlider *)sender
{
    self.player.volume = sender.value;
}

   在我的github上有二个较周密的分秒必争代码,风野趣的同伴能够看看!

 id _timerObserver = [self.player addBoundaryTimeObserverForTimes:@[[NSValue valueWithCMTime:CMTimeMake]] queue:dispatch_get_main_queue() usingBlock:^{ //do something }];

 8> 音频的后台播放

  • 先是要改过配置文件,在 Info.plist 文件中,增添 UIBackGroundModes ,能够加上包蕴 奥迪o 在后台播放音频和录制里的动静,location 保持近期顾客的岗位新闻, voip 使用互联网电话。增多以上字段是为着布告系统框架,在应用程序步向后台时候乞求在后台继续播放一段时间,具体播放多长期,根据UIBackGroundTask 去申请一段时间。还足以选拔当地布告,预先设定 local notification 来让应用程序在后台运转。

图片 1

  • 后台播放音频设置   

    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    
  • 让app帮忙选择远程序调整制事件  

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

除此以外要是无需监听播放进程的时候能够调上面包车型地铁办法:

2. 视频

[self.player removeTimeObserver:_timerObserver];

 1> AVPlayer

  iOS 里面录制播放用到的是 AVPlayer(饱含在AVFoundation框架内)与 AV奥迪(Audi卡塔尔oPlayer 有一点相像,可是 AVPlayer 的意义进一层刚劲,它能够用来播音音频也能够用来播放录像。而且在广播音频方面 AVPlayer 能够间接播放网络节奏。

难题三:AVPlayer前后台播放

 2> 录像播放完成步骤

  • 手续一:导入援救录像播放的框架AVFoundation.framework

  引入头文件代码

#import <AVFoundation/AVFoundation.h>
  • 步骤二:获取播放的地址

    NSString *playString = @"";

    // 播放地址 NSU奔驰G级L *playURL = [NSURL URLWithString:playString];

  • 手续三:依据播放的 U景逸SUVL 成立 AVPlayerItem 对象

   AVPlayerItem 可以收获录制的音讯,当前播发时间,总时间等

AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:playURL];

  AVPlayerItem 的要害性质

   状态 status

    AVPlayerStatusUnknown,(代表录制播放现身了不敢问津的主题材料)

    AVPlayerStatusReadyToPlay,(代表录像可以播放,能够调用 play方法)

    AVPlayerStatusFailed(代表录制相当小概实行播放了)

   loadedTimeRange:代表曾经缓存的进程,监听此属性能够在 UI 中更新缓存进程,也是很有用的贰天性情

  • 步骤四:根据 AVPlayerItem 初始化 AVPlayer 对象

    @interface ViewController ()

    @property(nonatomic, strong)AVPlayer *player;
    

    @end

    self.player = [[AVPlayer alloc] initWithPlayerItem:item];

  • 步骤五:把 AVPlayerLayer 增添到供给播放页面包车型客车Layer 层

    // 设置播放页面
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];
    // 设置播放页面的大小
    layer.frame = CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 300);
    // 设置背景颜色
    layer.backgroundColor = [UIColor cyanColor].CGColor;
    // 设置播放窗口和当前视图之间的比例显示内容
    layer.videoGravity = AVLayerVideoGravityResizeAspect;
    // 添加播放视图到view上
    [self.view.layer addSublayer:layer];
    
  • 步骤六:AVPlayerLayer 播放

    // 播放 [self.player play];

  • 手续七:在钦定的光阴播放

    [self.player seekTo提姆e:CMTimeMakeWithSeconds(progress, //设置每分钟多少帧 self.player.currentTime.timescale卡塔尔国 completionHandler:^(BOOL finished卡塔尔(قطر‎ {

       }];
    

    // 设置音量 self.player.volume = 1.0f;

    // 当前播放时间
    

    self.player.currentTime

  • 手续八:播放完毕的照拂

    //当播放完毕时,能够挂号通告,依照要求,做出分歧的响应 AVPlayerItemDidPlayToEndTimeNotification

   可以经过设置观察者来成功增长播放完毕文告

-(void)addNotification{
    //给AVPlayerItem添加播放完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:)name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}

-(void)playbackFinished:(NSNotification *)notification{
    NSLog(@"视频播放完成.");
}

 通过上述的两个步骤已经足以完成录像在 iOS 客户端的播报;

 AVPlayerltem 财富管理对象,成效是:切换录制播放,使用时切换不相同的 Item 就能够. 而非创立新的 AVPlayer.

 AVPlayerItem 的一对重点性质能够使大家定制录像的开支

实例代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *playString = @"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4";
    NSURL *url = [NSURL URLWithString:playString];
    // 本地视频
//    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1457622279563.mp4" ofType:nil]];

    // 设置播放的项目
    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url];

    // 初始化player对象
    self.player = [[AVPlayer alloc] initWithPlayerItem:item];

    // 设置播放页面
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];
    // 设置播放页面的大小
    layer.frame = CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 300);
    // 设置背景颜色
    layer.backgroundColor = [UIColor cyanColor].CGColor;
    // 设置播放窗口和当前视图之间的比例显示内容
    layer.videoGravity = AVLayerVideoGravityResizeAspect;
    // 添加播放视图到view上
    [self.view.layer addSublayer:layer];

    // 设置播放进度的默认值
    self.progressSlider.value = 0;
    // 设置播放音量的默认值
    self.player.volume = 1.0f;

    [self addNotification];
}

#pragma mark - 开始播放按钮的响应方法
- (IBAction)startPlayer:(UIButton *)sender
{
    [self.player play];
}
#pragma mark - 暂停播放按钮的响应方法
- (IBAction)puasePlayer:(UIButton *)sender
{
    [self.player pause];
}
#pragma mark - 改变进度按钮的响应方法
- (IBAction)changeProgress:(UISlider *)sender
{
    self.sumPlayOperation = _player.currentItem.duration.value / _player.currentItem.duration.timescale;

// CMTimeMake(a, b) a表示当前时间,b表示每秒钟有多少帧
    [_player seekToTime:CMTimeMakeWithSeconds(sender.value * self.sumPlayOperation, _player.currentTime.timescale) completionHandler:^(BOOL finished) {
        [self.player play];
    }];
}

- (void)addNotification{
    //给AVPlayerItem添加播放完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:)name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
}

- (void)playbackFinished:(NSNotification *)notification{
    NSLog(@"视频播放完成.");
}

 

当大家切换成后台后,那时候AVPlayer常常会自动行车制动器踏板,当然即使设置了后台播放音频的话,是能够在后台继续播放音响的,正如苹果本身的WWDC那几个App相符。那些效果在本身的另一篇随笔iOS AVPlayer之后台接二连三播放录制中国化学工业进出口总集团解了那几个主题素材。

标题四:音频通道的并吞引起的一点办法也没有播放录像难点

本文由新浦京81707con发布于注册购买,转载请注明出处:AVPlayer的那些坑,iOS学习45之多媒体操作

关键词: 新浦京81707con 手机开发 ios iOS开发 AVPlayer

上一篇:视频截图

下一篇:没有了