一.音乐播放类概念

iOS 下能支持歌曲和声音播放的的类有几个:

  1. SystemSound
  2. AVFoundtion库中的AVAudioPlayer #重要

  3. MediMPMusicPlayerController

常用音频控件 
3. MPMediaPickerController 本地音乐库选择器 
5. MPVolumeView 播放进度条

这里有一个PPT在解释几种概念:

https://ccrma.stanford.edu/~jsanchez/NSSpain.pdf 
这教程中同时用不同机制播放例子: 
https://github.com/jsanchezsierra/AudioLab

声音可视化的设计

如果想要程序中输出声音,波形,频谱以及其它特效, 
一定要看一下这一篇教程:

iPodVisualizer

http://www.raywenderlich.com/36475/how-to-make-a-music-visualizer-in-ios

它是种用AVAudioPlayer 的averagePowerForChannel 这样接口来输出波形文件。 
MPMusicPlayerController没有发现支持这一功能 

aurioTouch

另外Apple官方给出一个输出例子:aurioTouch 录音数据的波形,其中带普通波形文件,以及经过FFT运算得到频谱数据。可以参考。

源码在此:https://developer.apple.com/library/prerelease/ios/samplecode/aurioTouch/Introduction/Intro.html

以及更新版(苹果已经移走这个版本) 
https://github.com/caseytcaprice/aurioTouch2

根据 
https://github.com/irtemed88/PitchDetector

PitchDetector

画得更加完美的波形文件: 
https://github.com/irtemed88/PitchDetector

SpeakHere

Apple官方给的例子,显示录音实时波开: 
https://developer.apple.com/library/ios/samplecode/SpeakHere/Introduction/Intro.html

AvTouch

更简单的声音转波形的例子 
https://developer.apple.com/library/ios/samplecode/avTouch/Introduction/Intro.html

选择系统歌曲文件

音乐App的歌曲来源有三种,一个是本地沙盒自带歌曲,另一个网络歌曲,

选择系统音乐库

第三个就系统音乐库带的歌曲,

它可以由 MPMediaPickerController 类来调用

- (IBAction)addPressed:(id)sender {
MPMediaType mediaType = MPMediaTypeMusic;
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes:mediaType];
picker.delegate = self;
[picker setAllowsPickingMultipleItems:YES];
picker.prompt = NSLocalizedString(@"Select items to play", @"Select items to play");
[self presentViewController:picker animated:YES completion:nil];
}

它通过MPMediaPickerControllerDelegate接口返回一个 
MPMediaItemCollection 选择的歌曲列列表,只需对MPMediaPickerController调用如下接口即可进行播放,以及上一首,下一首

[self.player setQueueWithItemCollection:self.collection];

如果是AVAudioPlayer来播放需要做得更多一点。即可把MPMediaItemCollection里歌曲URL取出来,直接传给AVAudioPlayer即可,这个URL格式类似于

ipod-library://item/item.m4a?id=1529654720874100371

- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) collection {

    MPMediaItem *item = [[collection items] objectAtIndex:0];
NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL]; // Play the item using AVPlayer
self.avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[self.avAudioPlayer play];
}

列表播放

MMMediaPlayer是自动支持,播放下一首,上一首可用如下方法:

上一首:

- (IBAction)rewindPressed:(id)sender {
if ([self.player indexOfNowPlayingItem] == 0) {
[self.player skipToBeginning];
} else {
[self.player endSeeking];
[self.player skipToPreviousItem];
}
}

下一首:

- (IBAction)fastForwardPressed:(id)sender {
NSUInteger nowPlayingIndex = [self.player indexOfNowPlayingItem];
[self.player endSeeking];
[self.player skipToNextItem];
if ([self.player nowPlayingItem] == nil) {
if ([self.collection count] > nowPlayingIndex+1) {
// added more songs while playing
[self.player setQueueWithItemCollection:self.collection];
MPMediaItem *item = [[self.collection items] objectAtIndex:nowPlayingIndex+1];
[self.player setNowPlayingItem:item];
[self.player play];
}
else {
// no more songs
[self.player stop];
NSMutableArray *items = [NSMutableArray arrayWithArray:[self.toolbar items]];
[items replaceObjectAtIndex:3 withObject:self.play];
[self.toolbar setItems:items];
}
}
}

暂停和恢复播放:

- (IBAction)playPausePressed:(id)sender {
[self.pause setTintColor:[UIColor blackColor]];
MPMusicPlaybackState playbackState = [self.player playbackState];
NSMutableArray *items = [NSMutableArray arrayWithArray:[self.toolbar items]];
if (playbackState == MPMusicPlaybackStateStopped || playbackState == MPMusicPlaybackStatePaused) {
[self.player play];
[items replaceObjectAtIndex:3 withObject:self.pause];
} else if (playbackState == MPMusicPlaybackStatePlaying) {
[self.player pause];
[items replaceObjectAtIndex:3 withObject:self.play];
}
[self.toolbar setItems:items animated:NO];
}

AVAudioPlayer 有播放结束的调用,因此在的上一首播完,重设一下一首歌即可

音乐后台播放

如果需要后台播放音乐,需要在应有的info.plist声明 
否则会被系统强行干掉。

网络音频播放

AVAudioPlayer 不直接支持网络音频播放,可以先下载数据到一个NSData ,然后进行播放。

NSData *mydata=[[NSDataalloc]initWithContentsOfURL:[NSURLURLWithString:command]];

    AVAudioPlayer *player=[[AVAudioPlayeralloc]initWithData:mydata error:nil];

    [player prepareToPlay];

    [player play];

但这种对于流媒体就无能为例了。因此可以使用更新的AVPlayer,它能直接播放(但是底层接口较少)

AVPlayer * _player = [[AVPlayer alloc] initWithURL:[NSURL URLWithString:@"http://stream.jewishmusicstream.com:8000"]];

音乐按键控制

AudioPlayer 可以接收 线控及蓝牙耳机的按键控制, 
前题的要真的有一首的歌曲播放时,才能捕获按键。

这个可以在AppDelegate 中remoteControlReceivedWithEvent来捕获各种按键。

- (void)remoteControlReceivedWithEvent:(UIEvent *)event
{
NSLog(@"remoteControlReceivedWithEvent %d",event.subtype); switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
[self postNotificationWithName:remoteControlPlayButtonTapped];
break;
case UIEventSubtypeRemoteControlPause:
[self postNotificationWithName:remoteControlPauseButtonTapped];
break;
case UIEventSubtypeRemoteControlStop:
[self postNotificationWithName:remoteControlStopButtonTapped];
break;
case UIEventSubtypeRemoteControlNextTrack:
[self postNotificationWithName:remoteControlForwardButtonTapped];
break;
case UIEventSubtypeRemoteControlPreviousTrack:
[self postNotificationWithName:remoteControlBackwardButtonTapped];
break;
default:
[self postNotificationWithName:remoteControlOtherButtonTapped];
break;
}
}

理论上,可以在后台不断播放一段音频(音量设为0)来实现在应用中捕获耳机按键。比如蓝点工坊就用这个方法把蓝牙耳机充当自拍器用。

但是这种用法是过不了App Store 的审核 ,所以只能用Ad hoc发行方法。

具体参考: 
https://github.com/MosheBerman/ios-audio-remote-control

它是在后台不断播放一个网络电台节目来达到目的,实际蓝点工坊测试测放App自带一个声音文件,如caf效果是一样的。

 

iOS 音频开发经验汇总的更多相关文章

  1. iOS视频开发经验

    iOS视频开发经验 手机比PC的优势除了便携外,我认为最重要的就是可以快速方便的创作多媒体作品.照片分享,语音输入,视频录制,地理位置.一个成功的手机APP从产品形态上都有这其中的一项或多项,比如in ...

  2. 一篇对iOS音频比较完善的文章

    转自:http://www.cnblogs.com/iOS-mt/p/4268532.html 感谢作者:梦想通 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也 ...

  3. iOS音频AAC视频H264编码 推流最佳方案

    iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1    功能概况 *  实现音视频的数据的采集 *  实现音视频数据的编码,视频编码成 ...

  4. IOS 音频开发文件大小计算

    音频基础知识 音频文件计算大小 音频转码 标签(空格分隔): 调查 IOS音频 https://developer.apple.com/library/ios/documentation/MusicA ...

  5. iOS音频处理

    ios音频处理 1. iOS底层音频处理技术(带源代码) http://www.cocoachina.com/ios/20111122/3563.html 2.ios 音频入门 http://blog ...

  6. IOS 音频播放

    iOS音频播放 (一):概述 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖 ...

  7. iOS音频播放(一):概述

    (本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...

  8. Appium - iOS 各种问题汇总

    Appium - iOS 各种问题汇总 作者: Max.Bai 时间: 2014/10 Appium - iOS 各种问题汇总  1. Appium 滑动: swipe 有三种方式:  第一种:swi ...

  9. iOS 学习资料汇总

    (适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...

随机推荐

  1. 数据库的事务处理必须满足ACID原则,ACID分别是指什么

    http://blog.csdn.net/dingxingmei/article/details/39270375

  2. oracle 数据库开发面试题,当时笔试的时候一个没做出来,现附原题及答案

    1. ID123567810111215 表名tt,用sql找出ID列中不连续的ID,例如其中没有的4: --创建表及数据 CREATE TABLE tt(ID INTEGER); INSERT IN ...

  3. pod install后出现: [!] `<PBXResourcesBuildPhase UUID=`xxxx`>` attempted to initialize an object with an unknown UUID

    [!] `<PBXResourcesBuildPhase UUID=`xxx`>` attempted to initialize an object with an unknown UU ...

  4. (四 )Knockout - ViewModel 的使用3 - 对象属性变化的实时更新

    ko.observableArray()就可以自动检测属性,其实他只是监控对象,而不是对象中的属性 使用ko.observable()进行处理 DEMO1 实时更新属性 //定义user数据对象 va ...

  5. java的注释

    最近在做java项目开始关注和注意一些java规范,目的只是为了让自己和别人更容易理解自己写的代码和复用. 一个重要的原则就是:问你自己,你如果从来没有见过这段代码,你要快速地知道这段代码是干什么的, ...

  6. phpstorm 2016.1注册码

    phper 享受生产PHP Web开发phpStorm.利用深代码理解,一流的编码的援助,并支持所有主要的工具和框架. 先看看 phpstorm 2016.1 带来那些新变化呢? 1,更好的PHP语言 ...

  7. postgres安装 以及修改postgres 密码

    #postgres安装 apt-get install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3 postgresql-s ...

  8. xPath技术

    在dom4j中如何使用xPath技术 1)导入xPath支持jar包 . jaxen-1.1-beta-6.jar 2)使用xpath方法 List<Node> selectNodes(& ...

  9. recovery编译汉化

    当BoardConfig.mk中定义了recovery的字体且为中文字体时,自动编译为中文版,否则编译为英文版 例如: BOARD_USE_CUSTOM_RECOVERY_FONT := \" ...

  10. 解读 《2014 最流行编程语言》 by Code Eval

    此文已转至http://cn.abnerchou.me/2014/02/23/fa87ae80/ 原文:点我 原文翻译:点我 首先了解下CodeEval是做什么的: A tool for auto e ...