iOS音频播放的几种方式_场所设备_音频应用论坛 - Powered by AUIOAPP

音频应用论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
热搜: 音频应用

[相机手机对讲机] iOS音频播放的几种方式

[复制链接]
ip7tznoggg 发表于 2006-4-26 14:43:00

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
iOS音频播放的几种方式
2 r1 h! V; l$ R
; g  H: U7 f3 l2 K5 G" m& V" Q6 X一、使用AVAudioPlayer播放音乐% C& l* q4 k! D
1.Background Modes* t& c! f' A: I. v! [. w" R. ~
打开后台模式的音乐播放,或者在info.plist文件中添加Required Background Modes键,其值是App plays audio or streams audio/video using AirPlay" z) v, s' \9 l

6 o9 E* D; d# [  ]3 A: x
0 \0 T% s7 U1 y- F1 |; U; x- v% K
' M( _% l  j1 R5 h" o, @2.添加后台播放代码& X  \+ w1 |" i
AVAudioSession *session = [AVAudioSession sharedInstance];
+ \3 x6 R2 l9 O' \$ n[session setActive:YES error:nil];- F$ ]& [$ f' Z; M+ }% u
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
8 v1 G- o; ~" ^# D
# a/ Y2 m! B7 ^  z5 R- ~3.播放指定的音频文件
" v! C" R% ?, K- ^+ g* f6 @// 1.获取要播放音频文件的URL. S) T* H( y3 h5 q0 z
    NSURL *fileURL = [[NSBundle mainBundle]URLForResource:@"王力宏-流泪手心" withExtension:@".mp3"];: l8 U  K8 D+ Y% l. G( Q6 H# @# x
    // 2.创建 AVAudioPlayer 对象1 {6 t# N. ~% \' s% L# H( X, g
    self.audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:fileURL error:nil];
% N; q6 H7 s+ C5 t    // 3.打印歌曲信息
; D; n2 q8 m0 z3 W    NSString *msg = [NSString stringWithFormat:@"音频文件声道数:%ld\n 音频文件持续时间:%g",self.audioPlayer.numberOfChannels,self.audioPlayer.duration];
4 ^6 w! ?* E) n) m! z, [    NSLog(@"%@",msg);: n  R. i' X3 ]( E' y7 o8 n
    // 4.设置循环播放
! v# s* R& Q6 M    self.audioPlayer.numberOfLoops = -1;* O! o$ e( O. i& j' k; x; ]$ T
    self.audioPlayer.delegate = self;
3 ^: O+ X2 U$ L2 Q6 x$ K    // 5.开始播放  Y! s1 ]2 Y1 w* V; a) v* f# g
    [self.audioplayer play];
7 M, p3 k7 E4 Z2 A; m4 T" |3 Y4 O( [* z  e

2 X2 H; [9 F2 M8 o% P/ s/ X二、使用System Sound Services播放音频
+ Y# W) y* [; D$ b: G8 D; U. b8 \9 j9 c+ V: d/ z4 e- s3 x
利用System Sound Services只能播放一些很小的提示或警告音频,它存在诸多限制,例如:声音长度不能超过30秒,不能控制进度,格式支持少等。
/ C; q* b# o9 W1 u* _
3 d' Q4 R, y  `1.注册音频文件3 J* @6 u2 w2 V  J8 [
调用 AudioServicesCreateSystemSoundID(CFURLRef inFileURL,SystemSoundID *outSystemSoundID) 该函数的第一个参数代表音频文件的URL(可通过NSURL转换成CFURLRef),第二个参数代表注册音频文件的SystemSoundID。3 E7 {2 e, Q) r' T
2.在音频播放完执行某些操作7 u  }- c# T7 O$ |
调用AudioServicesAddSystemSoundCompletion()函数为制定SystemSoundID注册Callback函数。( X" Z/ q' L) a
3.播放音频
$ q7 _$ T! T1 M: }1 e% g调用AudioServicePlaySystemSound函数或者AudioServicePlayAlertSound(调用系统振动功能)。! Z4 R, v; m) |
4.实战
  |9 }2 |/ F3 Q0 A0 l9 d4 R#import "FKViewController.h"
( o- U% x6 L$ \- }& q. Pstatic void completionCallback(SystemSoundID mySSID)0 ?1 u. F+ |" m  o5 G% L+ b
{* J8 X: |2 h6 K. v' l" k
    // Play again after sound play completion
7 r! U; b% L9 z  V* L- _5 f    AudioServicesPlaySystemSound(mySSID);0 L: s# U1 P1 N
}
/ l, ~0 J6 `& L@implementation ViewController
$ s4 h5 Z6 L& r& ~9 W5 V// 音频文件的ID
6 ]3 R6 `# T8 uSystemSoundID ditaVoice;
% U- v& r# M! R- (void)viewDidLoad
/ f  Q8 M( N" S; d{" G- f* K! ^6 o0 \( Z8 Y& }/ L# p3 \
    [super viewDidLoad];
+ i+ R& h4 n/ @: a    // 1. 定义要播放的音频文件的URL
7 j+ c, \: I. i1 ?    NSURL *voiceURL = [[NSBundle mainBundle]URLForResource:@"CleanDidFinish" withExtension:@"aiff"];
8 M3 z# [, v3 e( O    // 2. 注册音频文件(第一个参数是音频文件的URL 第二个参数是音频文件的SystemSoundID)
3 g8 s: {  w# m- H9 ?% @, O5 }    AudioServicesCreateSystemSoundID((__bridge CFURLRef)(voiceURL),&ditaVoice);8 n& l. u1 h4 E7 d5 e1 @
    // 3. 为crash播放完成绑定回调函数, o/ a% d1 ^5 D8 X6 A) i: L" ?, O* A
    AudioServicesAddSystemSoundCompletion(ditaVoice,NULL,NULL,(void*)completionCallback,NULL);
  O8 S+ R& l$ B7 ~6 d& V" ~    // 4. 播放 ditaVoice 注册的音频 并控制手机震动
  o7 {; r: c, c    AudioServicesPlayAlertSound(ditaVoice);
" f+ r# Y  T2 k8 m1 R! u% R7 Z( M0 M    //    AudioServicesPlaySystemSound(ditaVoice);! G% ^$ H% p2 r0 h
    //    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); // 控制手机振动
' q& z$ m* p  U# c8 D4 r6 b}+ N% U. r* c4 W* y0 Z
使用System Sound Services需要AudioToolbox框架的支持,需要导入其主头文件:#import<AudioToolbox/AudioToolbox.h>
; U  s' D5 u. u; C% ~0 P三、使用MPMusicPlayerController控制本机音乐播放
& m; Z! k6 R! H7 M3 p2 R; H! H) O6 v  K/ b: a
对控制内置音乐库播放状态以及媒体信息的获取进行了封装,主要用于公司手环端蓝牙发送指令控制手机音乐播放以及在手环荧幕上显示歌曲名称。
' N. Y: p( d3 Y0 G; E下面介绍一下用法: ) a/ K6 y# f1 y" k) w; l
1. 包含我封装的头文件 #import "BackgroundMusic.h" ' e& G5 H% L2 h+ f
2. 遵守协议:achieveMusicInfoDelegate
$ b8 X, U/ ]) ~, L& T; J3. 初始化:
+ V0 q$ K  {# y* m; Y    @property (nonatomic,strong) BackgroundMusic *musicController;- F3 X2 h) ]* {5 ]1 j& ^
    self.musicController = [[BackgroundMusic alloc]init];3 |, Y/ |" A8 T) h
    self.musicController.delegate = self; // 设置当前控制器为代理+ x; A; D# g& V+ m. H
4. 监听媒体曲目的改变:
- g# Y2 e! C! d2 n8 P0 I( ~$ l    // 在 - (void)viewDidLoad 方法中调用以下方面
8 |, D& o2 i4 J) j- w; s    [self.musicController monitorMediaItem];' y6 ~! q9 e, U: O
    // 实现代理方法
3 R+ J$ r- t2 x    - (void)achieveachieveMusicInfo:(NSString *)songName andPlaybackStatus:(int)playStatus* _- r7 ^$ T5 Y! I5 w: B9 h# v
{1 f( m- u4 O: @- K& v! I
    if (1 == playStatus) {  y! T" \$ F' a
        NSLog(@"正在播放音乐中...");; q& e) A0 o1 J( e) ^
    }else if(0 == playStatus){
: b9 e) q& k/ `        NSLog(@"音乐暂停中...");
7 F8 ~9 m6 n2 D* y    }else{
7 {7 y( Q+ P8 B) `        NSLog(@"播放状态未知...");
4 D' L9 T9 m( [    }1 k1 {/ \3 d. W9 V
    NSLog(@"歌曲信息:%@",songName);0 R8 X5 j' Z: X/ H  M. s# t
}
6 n/ d: ?) C# K+ }- K9 {
$ y7 X, i' }# e/ ^) i3 V$ B9 N: }! u9 A0 M0 t4 V
5.播放控制1 N; E. E: G1 K; I6 R$ H$ q# S7 }2 g
// 控制音乐播放、暂停" y4 F$ k3 B" L4 T( r4 E1 B) g
[self playOrPause];) L0 [1 |; U$ ^
// 下一曲
5 J! T, z/ N8 k- u[self next];
) w& y* O+ v. c: l& G2 n4 R2 [, G: B
/ B* K7 E2 `6 k5 _. i
/ S% K+ H0 E; p% Q& e' Y使用MPMusicPlayerController实例化对象来播放内置音乐库的媒体文件,有以下两种类方法来实例化对象:3 c- }8 E( K4 ^6 k' Y- P; S
MPMusicPlayerController *playController = [MPMusicPlayerController systemMusicPlayer];
& C  E& z* F) A+ r说明:播放内置媒体库项目取代用户目前播放状态(如果是用网易云音乐或QQQ音乐在播放歌曲)
0 n: c  B% m3 t' J  P2 ]% i- Z/ IMPMusicPlayerController *playController = [MPMusicPlayerController applicationMusicPlayer];
- {; c3 H. w- n: j$ j& D1 J3 X说明:播放该应用内的歌曲,不影响本机自带音乐播放器的状态。
) z; U. |3 Z, l* K1 B0 u+ N/ {7 F6 R) V6 v# N3 H2 V
1.判断有没有正在播放的媒体项目
% y% k. V) y' p& A5 V: U, ~  E. x1 }1 \, J
返回NSNotFound表示empty queue or an infinite playlist
* l: H- K: Z7 I! q% S7 ]( M9 @; Y* X
if ([self.playController indexOfNowPlayingItem] == NSNotFound) {# E3 R0 \, @, w& r& J
        return YES;
0 H% F" |' i5 e9 o+ y; u    }else{# G& K! c4 E& a8 v9 @' I: b
        return NO;
, R: p5 }) A) ^+ T+ Z/ w    }' H0 @; f8 h* V! S/ e" o$ {) q

' `4 M9 Q2 K+ J4 v" L# _2.创建媒体队列
; r, ^8 e, V" L/ z! m/ w6 [: r* D, }7 Y6 P* E
根据query创建媒体队列,创建成功后可以条用play来播放(默认播放第 index = 0 首曲目)
9 z! G+ J. y6 {. T( A: i* m! z. J# u6 r7 r
/**
8 }1 j9 O" N+ k% V*  设置媒体播放队列
& R) u) a  G& ?*/  P0 Y! b) {2 Y
- (void)createMediaQuery
6 A5 p: x* r) B" ?$ S{$ I# ^  l6 |; C: r
    // Creates a media query that matches music items and that groups and sorts collections by song name.
1 x' Q$ @3 B/ e( a$ ~) k    self.query = [MPMediaQuery songsQuery];
4 m  D- I$ U% [% @7 A    // Sets a music player’s playback queue based on a media query.% }! X5 ]( a2 s2 d5 c) b
    [self.playController setQueueWithQuery:self.query];/ }3 W: D- u* r2 S8 r: U
}
" ?4 j9 ^4 H" m" a2 R& w
% v- `- H* W4 {6 x; {3.获取正在播放的媒体曲目的信息
+ _( b0 P& W: b7 q2 V/ @# u% U) m. O- I
可以由nowPlayingItem取得一系列正在播放的曲目的详细信息:
6 `5 w% [2 q: d4 i: x) y  U- A" ]/ D5 y; K1 k- j1 I' u
@property (nonatomic, readonly) MPMediaEntityPersistentID
5 T6 p8 [- q9 c2 b9 Q- S% g@property (nonatomic, readonly) MPMediaType mediaType ' k% r$ N- N; R; k# t$ Y; J
@property (nonatomic, readonly) NSString *title 8 M: o  @% |  B6 n- C0 R
@property (nonatomic, readonly) NSString *albumTitle
5 }! x3 G4 E% V/ h4 g) @" ^) |@property (nonatomic, readonly) MPMediaEntityPersistentID 3 f! _3 @5 z( e! V. n3 P+ C
@property (nonatomic, readonly) NSString *artist
( G3 a3 D" u2 Z( ~# t@property (nonatomic, readonly) MPMediaEntityPersistentID 2 `/ m1 c% J. t9 g) r
@property (nonatomic, readonly) NSString *albumArtist 2 c. g; ?! J0 [/ {
2 j' \6 H. q* B0 y
/**& W8 b+ S% a5 ?$ o" q; N
*  获取媒体信息. j: z& Z" H: n3 l! K4 K+ [4 }  V
*/% I1 t+ B, x) g' ~7 E3 C0 R- z* q
- (void)obtainMusicInfo
! @" x! I6 X; j/ e, c{, P. x! {: }. n7 s+ y
    MPMediaItem *currentItem = [self.playController nowPlayingItem];) K3 u, T% L. G* j2 X  W% u
    NSString *artist = [currentItem valueForProperty:MPMediaItemPropertyArtist];  q3 j. j4 ]* u& E$ Y
    NSString *songName = [currentItem valueForProperty:MPMediaItemPropertyTitle];
2 B, m' g" R9 n" w; f* z    self.musicInfo = [NSString stringWithFormat:@"%@-%@",artist,songName];
* V3 _. q. x# w# Q/ Y}
1 I) s# F9 q4 s' d
0 X' A: y4 E; X3 X6 R% F4.监听播放媒体项目的通知; ?4 s+ [% e9 M0 @

, D# n8 G) c- l1 r监听此通知可以在播放曲目发生改变时(如:下一曲、上一曲)作出动作。# r- |" l: w8 @7 D4 q$ [' \, `' _$ t
/ _8 ]$ t( t3 y
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
. Q) E+ Q- v( B  D3 F% f$ G" v    [notificationCenter addObserver:self
% E4 [% S- C& a9 {1 f+ H. M                           selector:@selector(updateMusicInfo)" i8 o: q" Q6 P# B7 {
                               name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
" X& F+ P/ u  I! G8 |# C7 q2 z                             object:nil];
0 {$ W# u! R5 S6 |! l    [self.playController beginGeneratingPlaybackNotifications];; }' C6 ^8 @! T! s: ?
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

软硬产品代理咨询服务:声卡:雅马哈UR22C、罗兰声卡、福克斯特、艾肯、阿波罗 、M-audio 、普瑞声纳 、福克斯特、 达思冠系列 音箱:吸顶NS-IW560C、吸顶NS-IW660 、NS-AW350、低音NS-SW050、低音NS-SW100;JBL 吸顶8124、CSS-8006BM;香蕉猴 gibbon系列;普瑞声纳E5XT、E4.5、 E3.5BT 有线话筒:舒尔PGA27、PGA48、MV51、mv88、mv88+、SM27 ;森海E945 、MK4、E835S;舒伯乐top248s;罗德NT1-A、VIDEOMIC、VIDEOMIC GO、VideoMicro、VideoMic NTG 无线领夹麦克风:罗德 wireless go II 一拖一、一拖二;猛犸lark150 耳机:森海HD300 pro、美奇 CR-Buds 、索尼7506、爱科技K240S、K240 MKII、K271 MKII、K52、K72、K92、先锋、飞利浦 1:飞利浦会务通/会议摄像头/全向麦克风/执法仪/录音笔 2:洋铭便携式移动演播室 / 切换台 / 摄控一体摄像机 / 虚拟演播室 / 微金课教室 / 色键器 3:逻兰音视频切换台 / 声卡 / 电子鼓 /电钢琴 /耳机 4:Blackmagic专业摄影机 /调色台 / 切换台/ 广播级转换器 / 监视器 / 采集卡 5:索尼专业摄像机/佳能专业摄像机/松下专业摄像机/ insta360专业摄像机 6:话筒:铁三角/ 舒尔/ 森海塞尔 / AKG / RODE/ BBS 7:音响:YAMAHA/ 声艺 / 皇冠 /JBL / 真力/咪宝/BOSE /美奇 8:声卡:RME/羚羊/IXI /艾肯/PreSonus普瑞声纳/Focusrite福克斯特/YAMAHA/雅马哈/ickb 9:耳机:铁三角/beyerdynamic拜亚动力/AKG爱科技/索尼/RunningMan/美技 10:思锐三脚架 /防潮箱 /米泊三脚架/意美捷三脚架/曼富图三脚架 11:XSW系列,300.500代理商,EWD数字系列代理,6000.9000定制产品,还包销了全国三个型号:XSW1-825,EW100 G4-945,EWD- kk 205

小黑屋|手机版|Archiver|音频应用 (鄂ICP备13005321号-1)

Powered by Audio app

快速回复 返回顶部 返回列表