07-音效的播放 远程控制事件

一、简单介绍

简单来说,音频可以分为2种


(1)音效

又称“短音频”,通常在程序中的播放时长为1~2秒

在应用程序中起到点缀效果,提升整体用户体验


(2)音乐

  比如游戏中的“背景音乐”,一般播放时间较长

框架:播放音频需要用到AVFoundation.framework框架


二、音效的播放
1.获得音效文件的路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];

2.加载音效文件,得到对应的音效ID
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);

3.播放音效
AudioServicesPlaySystemSound(soundID);

注意:音效文件只需要加载1次

4.音效播放常见函数总结

加载音效文件

  AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)


释放音效资源

  AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)


播放音效

  AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)


播放音效带点震动

  AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)




三、AVAudioPlayer 音乐的播放
一、简单说明

(1)音乐播放用到一个叫做AVAudioPlayer的类

(2)AVAudioPlayer常用方法

  加载音乐文件 - (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
                        - (id)initWithData:(NSData *)data error:(NSError **)outError;
准备播放(缓冲,提高播放的流畅性)  - (BOOL)prepareToPlay;
播放(异步播放) - (BOOL)play;

暂停 - (void)pause;

停止   - (void)stop;

是否正在播放  @property(readonly, getter=isPlaying) BOOL playing;

时长      @property(readonly) NSTimeInterval duration;

当前的播放位  @property NSTimeInterval currentTime;

播放次数(-1代表无限循环播放,其他代表播放numberOfLoops+1次 
@property NSInteger numberOfLoops;

音量      @property float volume;

是否允许更改速率@property BOOL enableRate;

播放速率(1是正常速率,0.5是一般速率,2是双倍速率)  @property float rate;

有多少个声道 @property(readonly) NSUInteger numberOfChannels;


如果要播放多个音乐文件可以封装一个播放音乐的工具类:

-------------------------------------------------------- 实现代码--------------------------------------------------
导入头文件
#import <AVFoundation/AVFoundation.h>

/** 播放本地音乐 */
/** 创建全局对象  创建播放器(注意:一个AVAudioPlayer只能播放一个url) */
NSURL *url = [[ NSBundle mainBundle ] URLForResource : @" 遇见 .mp3" withExtension : nil ];
_player = [[ AVAudioPlayer alloc ] initWithContentsOfURL :url error : nil ];
  /** 缓冲 */
[ _player prepareToPlay ];

/** 播放 */
[ _player play ];

/** 暂停 */
[_player pause];

/** 停止/
// 注意:如果点击了 stop, 那么一定要让播放器重新创建,否则会出现一些莫名其面的问题
[ _player stop ];
_player=Nil;

-------------------------------------------------------- 设置代理--------------------------------------------------
/**播放/暂停*/
BOOL isPlayer = _player . playing ;
    if (isPlayer) {
        [ _player pause ];
    }
   
else
    {
       
/** 暂停 */
        [
_player play ];
    }



四、AVPlayer流媒体播放音乐
/** 流媒体 */
NSURL *url = [[ NSBundle mainBundle ] URLForResource : @" 遇见 .mp3" withExtension : nil ];
_avPlayer = [[AVPlayer alloc] initWithURL:url];

/**播放/暂停 */
- ( IBAction )AVPlayer:( UIButton *)sender{
  
   
_isPlayer = ! _isPlayer ;
   
   
if ( _isPlayer ) {
        [
_avPlayer play ];
    }
   
else
    {
        [
_avPlayer pause ];
    }
   
}

  、远程控制事件  

------------------------------------------------------- 启用远程控制事件----------------------------------------------
//1. 启用远程控制事件
- (
void )startRemoteCtrl
{
   
// 启用远程控制事件 3 个条件
   
//1. 启用远程事件接收 ( 可以写到视图将要显示时的方法里 )
    [[
UIApplication sharedApplication ] beginReceivingRemoteControlEvents ];
   
// 停止接收远程事件
   
//[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
   
   
//2. 成为第一响应者 ( 可以写到视图将要显示时的方法里 )
    [
self becomeFirstResponder ];
   
// 不是第一响应者
   
//[self resignFirstResponder];
   
   
//3. 应用程序必须是当前音频的控制者,也就是在 iOS 7 中通知栏中当前音频播放程序必须是我们自己开发程序
   
   
// 创建播放对象
   
NSURL *url = [[ NSBundle mainBundle ] URLForResource : @" 遇见 .mp3" withExtension : nil ];
   
_player = [[ AVPlayer alloc ] initWithURL :url];
    [
_player play ];
   
   
// 将音频会话设置为支持后台
   
//info.plist中添加UIBackgroundModes并且添加一个元素值为audio
    [[
AVAudioSession sharedInstance ] setCategory : AVAudioSessionCategoryPlayback error : nil ];

}

//2. 在视图控制器中添加远程控制事件并音频播放进行控制
- (
void )remoteControlReceivedWithEvent:( UIEvent *)event
{
   
if (event. type == UIEventTypeRemoteControl )
    {
       
switch (event. subtype ) {
           
case UIEventSubtypeRemoteControlPlay :
            [
_player play ];
           
break ;
        
       
case UIEventSubtypeRemoteControlTogglePlayPause :
               
if ( _isPlay ) {
                    [
_player pause ];
                }
else {
                    [
_player play ];
                }
               
_isPlay =! _isPlay ;
           
break ;
           
       
case UIEventSubtypeRemoteControlNextTrack :
           
NSLog ( @" 下一首 " );
           
break ;
           
       
case UIEventSubtypeRemoteControlPreviousTrack :
            
NSLog ( @" 上一首 " );
           
break ;
               
           
default :
               
break ;
        }
    }
}

//3. 设置锁屏情况下显示的数据
- (
void )configInfo {
   
   
// 创建专辑图
   
MPMediaItemArtwork *artWork = [[ MPMediaItemArtwork alloc ] initWithImage :[ UIImage imageNamed : @"pig" ]];
   
   
NSDictionary *dic = @{
                         
MPMediaItemPropertyAlbumTitle : @" 第一夫人 " ,
                         
MPMediaItemPropertyArtist : @" 张杰 " ,
                         
MPMediaItemPropertyArtwork :artWork
                         
} ;
   
   
    [[
MPNowPlayingInfoCenter defaultCenter ] setNowPlayingInfo :dic];
   
}

------------------------------------------------------ UIEventSubtype--------------------------------------------------

typedef NS_ENUM(NSInteger, UIEventSubtype) {
    // 不包含任何子事件类型
    UIEventSubtypeNone                              = 0,
    
    // 摇晃事件(从iOS3.0开始支持此事件)
    UIEventSubtypeMotionShake                       = 1,
    
    //远程控制子事件类型(从iOS4.0开始支持远程控制事件)
    //播放事件【操作:停止状态下,按耳机线控中间按钮一下】
    UIEventSubtypeRemoteControlPlay                 = 100,
    //暂停事件
    UIEventSubtypeRemoteControlPause                = 101,
    //停止事件
    UIEventSubtypeRemoteControlStop                 = 102,
    //播放或暂停切换【操作:播放或暂停状态下,按耳机线控中间按钮一下】
    UIEventSubtypeRemoteControlTogglePlayPause      = 103,
    //下一曲【操作:按耳机线控中间按钮两下】
    UIEventSubtypeRemoteControlNextTrack            = 104,
    //上一曲【操作:按耳机线控中间按钮三下】
    UIEventSubtypeRemoteControlPreviousTrack        = 105,
    //快退开始【操作:按耳机线控中间按钮三下不要松开】
    UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
    //快退停止【操作:按耳机线控中间按钮三下到了快退的位置松开】
    UIEventSubtypeRemoteControlEndSeekingBackward   = 107,
    //快进开始【操作:按耳机线控中间按钮两下不要松开】
    UIEventSubtypeRemoteControlBeginSeekingForward  = 108,
    //快进停止【操作:按耳机线控中间按钮两下到了快进的位置松开】
    UIEventSubtypeRemoteControlEndSeekingForward    = 109,
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值