ios 音频

ios中 主要有两种音频类型,短音(如短信铃声,音效等 播放时长在30s内),长音(如歌曲等)

音效框架:AudioToolbox.framework

音乐框架:AVFoundation.framework


注意:在使用NSTimer 的时候 记得不使用的时候一定要调用 invalidate ,如果不调用 invalidate ,timer会一只在runloop中运行 最后将导致 当前控制器无法释放资源。


注意:如果要想在播放音乐时app进入后台后仍然能够继续运行(播放音乐)需要做如下几步操作:

    1,在Appdelegate.m中实现如下方法内容

   2,在 Capabilities 中设置 后台模式 选中 音乐播放  Background fetch

//程序失去焦点的时候调用(不能跟用户进行交互了)

- (void)applicationWillResignActive:(UIApplication *)application

{

    AVAudioSession *audioSession=[AVAudioSessionsharedInstance];

    [audioSession setCategory:AVAudioSessionCategoryPlaybackerror:nil];

    [audioSession setActive:YESerror:nil];

}


播放音效 底层由c语言实现

#pragma mark - 播放音效

- (void)playSound

{

    NSString *audioFile = [[NSBundlemainBundle]pathForResource:@"Default.mp3"ofType:nil];

    NSURL    *fileUrl   = [NSURLfileURLWithPath:audioFile];

    //1.获得系统声音ID

    SystemSoundID soundID=0;

    /**

     * inFileUrl:音频文件url

     * outSystemSoundID:声音id(此函数会将音效文件加入到系统音频服务中并返回一个长整形ID

     */

    AudioServicesCreateSystemSoundID((__bridgeCFURLRef)(fileUrl), &soundID);

    //如果需要在播放完之后执行某些操作,可以调用如下方法注册一个播放完成回调函数

    AudioServicesAddSystemSoundCompletion(soundID,NULL,NULL,soundCompleteCallback,NULL);

    

    //2.播放音频

    AudioServicesPlaySystemSound(soundID);//播放音效

//    AudioServicesPlayAlertSound(soundID);//播放音效并震动只会震动一次

    

}


/**

 *  播放完成回调函数

 *

 *  @param soundID    系统声音ID

 *  @param clientData 回调时传递的数据

 */

void soundCompleteCallback(SystemSoundID soundID,void * clientData)

{

    NSLog(@"音效播放完噢!");

    NSLog(@"%u,  %@", (unsignedint)soundID, clientData);

    

}


=============================分割线================================

播放音乐

#import <AudioToolbox/AudioToolbox.h>//播放音效

#import <AVFoundation/AVFoundation.h>//播放音乐

@interface AudioVC ()<AVAudioPlayerDelegate>


//播放音乐

@property (nonatomic,strong)AVAudioPlayer      *audioPlayer;

@property (nonatomic,strong)UIProgressView     *progressMusic;

@property (nonatomic,strong)UIButtonK          *btnMusic;//播放/暂停按钮(如果tag0认为是暂停状态,1是播放状态)

@property (nonatomic,strong)NSTimer            *timer;

@end


- (void)viewWillDisappear:(BOOL)animated

{

    [superviewWillDisappear:animated];

    [self.timerinvalidate];//杀掉定时器否则本控制器无法释放

    

}

#pragma mark - 播放音乐

- (void)playMusic

{

    /*

     1.初始化AVAudioPlayer对象,此时通常指定本地文件路径。

     2.设置播放器属性,例如重复次数、音量大小等。

     3.调用play方法播放。

     */

    

    if (self.btnMusic.tag ==0)//此时为暂停

    {

        //播放

        self.btnMusic.tag =1;

        [self.btnMusicsetTitle:@"stop"forState:UIControlStateNormal];

        

        if (![self.audioPlayerisPlaying])//如果当前没有播放

        {

            [self.audioPlayerplay];//播放音乐

            [selfStartTimer];

        }

        

    }

    else//此时为播放

    {

        //暂停

        self.btnMusic.tag =0;

        [self.btnMusicsetTitle:@"ing"forState:UIControlStateNormal];

        

        if ([self.audioPlayerisPlaying])//如果当前正在播放

        {

            [self.audioPlayerpause];//暂停音乐

            [self.timerinvalidate];

            self.timer =nil;

            

        }

    }

    

}


/**

 *  创建播放器懒加载

 *

 *  @return 音频播放器

 */

-(AVAudioPlayer *)audioPlayer

{

    if (_audioPlayer ==nil)

    {

        NSString *urlStr = [[NSBundlemainBundle]pathForResource:@"直到世界的尽头.mp3"ofType:nil];

        NSURL    *url    = [NSURLfileURLWithPath:urlStr];

        NSError  *error  =nil;

        

        //初始化播放器,注意这里的Url参数只能是文件路径,不支持HTTP Url

        _audioPlayer = [[AVAudioPlayeralloc]initWithContentsOfURL:urlerror:&error];

        //设置播放器属性

        _audioPlayer.numberOfLoops =0;//设置为0不循环

        _audioPlayer.delegate =self;

        [_audioPlayerprepareToPlay];//加载音频文件到缓存

        if(error)

        {

            NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);

            returnnil;

            

        }

    }

    return_audioPlayer;

    

}


//懒加载

-(NSTimer *)StartTimer

{

    

    if (!_timer)

    {

        _timer=[NSTimerscheduledTimerWithTimeInterval:0.1

                                                target:self

                                              selector:@selector(updateProgress)

                                              userInfo:nilrepeats:true];

    }

    return_timer;

    

}


- (void)updateProgress

{

    float progress=self.audioPlayer.currentTime /self.audioPlayer.duration;

    [self.progressMusicsetProgress:progressanimated:true];

    

}


#pragma mark - 播放器代理方法

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

{

    NSLog(@"音乐播放完成...");

    

}

=============================分割线================================

这里只是实现了最简单的功能,如需详细了解可以参考其他大神的文章,给出一下链接

http://msching.github.io/

http://www.cnblogs.com/kenshincui/p/4186022.html#audioSession


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值