在iOS平台下播放直播流,须要用到解码编码等听起来很牛X的技术,本身也发现AppStore中有不少网络电台应用,但不知道人家是怎么实现的。通过在网上搜索、询问好友后,终于找到了一个很好的第三方解决方案,即百度媒体云。php
好了闲话少说,进入正题:
网络
进入SDK下载界面,下载iOS开发包session
http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/video/sdk架构
注:我下载的包见下图,可是发现有些问题,具体啥问题在这不详细说了,若是你运行Demo也碰见这个问题的话,那就接着往下看app
2.添加媒体云包、相关框架到项目中(建立个新项目,按照下面的步骤来少走些弯路)框架
1)开发者须要使用百度帐号登陆百度开发者中心注册成为百度开发者并建立工程,方可获取应用ID、对应的API key(即:ak)及 Secret Key(即:sk)等信息。由于须要播放直播流,因此须要开启视频服务才能使用(见下图)ide
2)媒体云包分为真机包和模拟器包,这个要看本身的状况进行添加,个人是真机运行(发现百度这个Demo,在真机上运行时木有问题的)。添加相关的框架:ui
OpenAL.framework编码
OpenGLES.frameworkatom
libbz2.1.0.dylib
libz.dylib
AudioToolbox.framework
Security.framework
MobileCoreServices.framework
CFNetwork.framework
SystemConfiguration.framework
AVFoundation.framework
MediaPlayer.framework
3)获取上面申请应用的API key(即:ak)及 Secret Key(即:sk)以备用 SDK 认证时必须传入ak及sk(只需前 16 位)参数。 即右上方API key SecretKey 详见下图:
4)配置工程
注:因为当前的 CyberPlayerController 只支持 armv7 架构,因此在导入相关静态库前,您须要在 Xcode 中配置您的 targets。选择 Build Settings->Architectures->Valid Architectures, 将该选项的 Debug/Release 键都置为 armv7(即去掉 armv7s 的支持)。 Build Active Architecture Only 设置为 NO。Xcode 中的 project不须要进行任何操做。详见下图:
完成以上步骤,Build下,添加上上面已经准备好的API key(即:ak)及 Secret Key(即:sk),到了这里大部分任务已经完成了。下面开始敲代码了,下面的代码是我实现的一个RadioPlayer单例:
RadioPlayer.h文件
#import <Foundation/Foundation.h> @interface RadioPlayer : NSObject { } @property (nonatomic,assign) BOOL isPlayed;//是否已经播放状态值 + (RadioPlayer *) sharedInstance;//单例 - (void) setRadioUrlString:(NSString *) urlString;//设置播放地址 - (void) play;//开始播放 - (void) stop;//中止播放 @end
RadioPlayer.m文件
#import "RadioPlayer.h" #import <AVFoundation/AVFoundation.h> #import "CyberPlayerController.h" CyberPlayerController *cbPlayerController;//播放器控制器 @implementation RadioPlayer static RadioPlayer *sharedInstance = nil ; + (RadioPlayer *) sharedInstance { static dispatch_once_t onceToken;// 锁 dispatch_once (& onceToken, ^ {// 最多调用一次 sharedInstance = [[self alloc] init]; }); return sharedInstance; } // 当第一次使用这个单例时,会调用这个init方法。 - (id) init { self = [super init]; if (self) { //后台播放设置 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; //初始化播放器 NSString *msAK = @"本身的msAK; NSString *msSK = @"本身的msSk; [[CyberPlayerController class] setBAEAPIKey:msAK SecretKey:msSK]; cbPlayerController = [[CyberPlayerController alloc] init]; } return self; } //设置播放地址 - (void) setRadioUrlString:(NSString *) urlString{ NSURL *url = [NSURL URLWithString:urlString]; if (!url) { url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; } [cbPlayerController setContentURL:url]; } //开始播放 - (void) play { switch (cbPlayerController.playbackState) { case CBPMoviePlaybackStateStopped: case CBPMoviePlaybackStateInterrupted: //初始化完成后直接播放视频,不须要调用play方法 cbPlayerController.shouldAutoplay = YES; //初始化视频文件 [cbPlayerController prepareToPlay]; sharedInstance.isPlayed = YES; break; default: [cbPlayerController prepareToPlay]; sharedInstance.isPlayed = YES; break; } } //中止播放 - (void) stop { [cbPlayerController stop]; sharedInstance.isPlayed = NO; } @end
播放音频
RadioPlayer *radioPlayer = [RadioPlayer sharedInstance]; [radioPlayer setRadioUrlString:@"mmsh://124.128.18.76/jiaotong"];//注意 mms 改成 mmsh [radioPlayer play];//播放 //[radioPlayer stop];//中止