iOS开发之多媒体播放

iOS sdk中提供了很多方便的方法来播放多媒体。本文将利用这些SDK做一个demo,来讲述一下如何使用它们来播放音频文件。

AudioToolbox framework

使用AudioToolbox framework。这个框架可以将比较短的声音注册到 system sound服务上。被注册到system sound服务上的声音称之为 system sounds。它必须满足下面几个条件。

1、 播放的时间不能超过30秒

2、数据必须是 PCM或者IMA4流格式

3、必须被打包成下面三个格式之一:Core Audio Format (.caf), Waveform audio (.wav), 或者 Audio Interchange File (.aiff)

声音文件必须放到设备的本地文件夹下面。通过AudioServicesCreateSystemSoundID方法注册这个声音文件,AudioServicesCreateSystemSoundID需要声音文件的url的CFURLRef对象。看下面注册代码:

#import <AudioToolbox/AudioToolbox.h>@interface MediaPlayerViewController : UIViewController{    IBOutlet UIButton *audioButton;    SystemSoundID shortSound;}

- (id)init{    self = [super initWithNibName:@"MediaPlayerViewController" bundle:nil];    if (self) {        // Get the full path of Sound12.aif        NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Sound12"                                                              ofType:@"aif"];        // If this file is actually in the bundle...        if (soundPath) {            // Create a file URL with this path            NSURL *soundURL = [NSURL fileURLWithPath:soundPath];

            // Register sound file located at that URL as a system sound            OSStatus err = AudioServicesCreateSystemSoundID((CFURLRef)soundURL,                                                             &shortSound);            if (err != kAudioServicesNoError)                NSLog(@"Could not load %@, error code: %d", soundURL, err);        }    }    return self; }

这样就可以使用下面代码播放声音了:

- (IBAction)playShortSound:(id)sender{    AudioServicesPlaySystemSound(shortSound);}

使用下面代码,还加一个震动的效果:

- (IBAction)playShortSound:(id)sender{    AudioServicesPlaySystemSound(shortSound);    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);}

AVFoundation framework

对于压缩过Audio文件,或者超过30秒的音频文件,可以使用AVAudioPlayer类。这个类定义在AVFoundation framework中。

下面我们使用这个类播放一个mp3的音频文件。首先要引入AVFoundation framework,然后MediaPlayerViewController.h中添加下面代码:

#import <AVFoundation/AVFoundation.h>@interface MediaPlayerViewController : UIViewController <AVAudioPlayerDelegate>{    IBOutlet UIButton *audioButton;    SystemSoundID shortSound;    AVAudioPlayer *audioPlayer;

AVAudioPlayer类也是需要知道音频文件的路径,使用下面代码创建一个AVAudioPlayer实例:

- (id)init{    self = [super initWithNibName:@"MediaPlayerViewController" bundle:nil];

    if (self) {

        NSString *musicPath = [[NSBundle mainBundle] pathForResource:@"Music"                                                              ofType:@"mp3"];        if (musicPath) {            NSURL *musicURL = [NSURL fileURLWithPath:musicPath];            audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL                                                                  error:nil];            [audioPlayer setDelegate:self];        }        NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Sound12"                                                              ofType:@"aif"];

我们可以在一个button的点击事件中开始播放这个mp3文件,如:

- (IBAction)playAudioFile:(id)sender{    if ([audioPlayer isPlaying]) {        // Stop playing audio and change text of button        [audioPlayer stop];        [sender setTitle:@"Play Audio File"                forState:UIControlStateNormal];    }    else {        // Start playing audio and change text of button so        // user can tap to stop playback        [audioPlayer play];        [sender setTitle:@"Stop Audio File"                forState:UIControlStateNormal];    }}

这样运行我们的程序,就可以播放音乐了。

这个类对应的AVAudioPlayerDelegate有两个委托方法。一个是 audioPlayerDidFinishPlaying:successfully: 当音频播放完成之后触发。当播放完成之后,可以将播放按钮的文本重新回设置成:Play Audio File

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player                       successfully:(BOOL)flag{    [audioButton setTitle:@"Play Audio File"                 forState:UIControlStateNormal];}

另一个是audioPlayerEndInterruption:,当程序被应用外部打断之后,重新回到应用程序的时候触发。在这里当回到此应用程序的时候,继续播放音乐。

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player{    [audioPlayer play];}

MediaPlayer framework

播放电影文件:

iOS sdk中可以使用MPMoviePlayerController来播放电影文件。但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件。

• H.264 (Baseline Profile Level 3.0)
• MPEG-4 Part 2 video (Simple Profile)

幸运的是你可以先使用iTunes将文件转换成上面两个格式。
MPMoviePlayerController还可以播放互联网上的视频文件。但是建议你先将视频文件下载到本地,然后播放。如果你不这样做,iOS可能会拒绝播放很大的视频文件。

这个类定义在MediaPlayer framework中。在你的应用程序中,先添加这个引用,然后修改MediaPlayerViewController.h文件。

#import <MediaPlayer/MediaPlayer.h>@interface MediaPlayerViewController : UIViewController <AVAudioPlayerDelegate>{    MPMoviePlayerController *moviePlayer;

下面我们使用这个类来播放一个.m4v 格式的视频文件。与前面的类似,需要一个url路径。

- (id)init{    self = [super initWithNibName:@"MediaPlayerViewController" bundle:nil];    if (self) {

        NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"Layers"                                                               ofType:@"m4v"];        if (moviePath) {            NSURL *movieURL = [NSURL fileURLWithPath:moviePath];            moviePlayer = [[MPMoviePlayerController alloc]                                     initWithContentURL:movieURL];        }

MPMoviePlayerController有一个视图来展示播放器控件,我们在viewDidLoad方法中,将这个播放器展示出来。

- (void)viewDidLoad{    [[self view] addSubview:[moviePlayer view]];    float halfHeight = [[self view] bounds].size.height / 2.0;    float width = [[self view] bounds].size.width;    [[moviePlayer view] setFrame:CGRectMake(0, halfHeight, width, halfHeight)];}

还有一个MPMoviePlayerViewController类,用于全屏播放视频文件,用法和MPMoviePlayerController一样。

MPMoviePlayerViewController *playerViewController =    [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];  [viewController presentMoviePlayerViewControllerAnimated:playerViewController];

我们在听音乐的时候,可以用iphone做其他的事情,这个时候需要播放器在后台也能运行,我们只需要在应用程序中做个简单的设置就行了。

1、在Info property list中加一个 Required background modes节点,它是一个数组,将第一项设置成设置App plays audio。

2、在播放mp3的代码中加入下面代码:

    if (musicPath) {        NSURL *musicURL = [NSURL fileURLWithPath:musicPath];        [[AVAudioSession sharedInstance]                    setCategory:AVAudioSessionCategoryPlayback error:nil];        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL                                                             error:nil];        [audioPlayer setDelegate:self];    }

在后台运行的播放音乐的功能在模拟器中看不出来,只有在真机上看效果。

总结:本文通过例子详细讲解了iOS sdk中用于播放音频文件的类,文章后面有本文的代码提供下载。

代码:http://files.cnblogs.com/zhuqil/MediaPlayer.zip

时间: 2024-12-27 19:40:24

iOS开发之多媒体播放的相关文章

iOS开发tips-神奇的UITableView

概述 UITableView是iOS开发中使用频率最高的UI控件,在前面的文章中对于UITableView的具体用法有详细的描述,今天主要看一些UITableView开发中的常见一些坑,这些坑或许不深,但是如果开发中注意不到的话往往比较浪费时间. 神奇的section header 事情的起因是一个网友说要实现一个类似下图界面,但是不管是设置sectionHeaderHeight还是代理方法中实现func tableView(_ tableView: UITableView, heightFor

iOS开发网络篇—文件的上传

iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: YYViewController.m 1 #import "YYViewController.h" 2 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] 4 5 @inter

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImageNamed-Xcode-master 提供快速创建自动注释:VVDocumenter-Xcode-master 2.使用介绍: (1)KSImageNamed-Xcode-master的使用 安装该插件后,会对文件中图片进行智能提示. (2)VVDocumenter-Xcode-master能提供

IOS 开发环境,证书和授权文件等详解

一.成员介绍 1.    Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1)    Developer Certification(开发证书) 安装在电脑上提供权限:开发人员通过设备进行真机测试. 可以生成副本供多台电脑安装: 2)      Distribution Certification(发布证书) 安装在电脑上提供发布iOS程序的权限:开发人员可以制做测试版和发布版的程序. 不可生成副本,仅有配置该证书的电脑才可使用:(副本制做介绍在

iOS开发之保存照片到系统相册(Photo Album)

iOS开发之保存照片到系统相册(Photo Album) 保存照片到系统相册这个功能很多社交类的APP都有的,今天我们简单讲解一下,如何将图片保存到系统相册(Photo Album). 创建UIImageView 创建UIImageView是为了将照片展示出来,我们是要把UIImage保存到系统相册(Photo Album): #define SCREEN [UIScreen mainScreen].bounds.size self.image = [UIImage imageNamed:@"i

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求. 详细信息,请参考:http://www.cnblogs.com/wendingding/p/3813706.html 3)本文示例代码发送的请求均为http请求,已经对info.plist文件进行配置. 如何配置,请参考:

iOS开发中UIPopoverController的使用详解

这篇文章主要介绍了iOS开发中UIPopoverController的使用,代码基于传统的Objective-C,需要的朋友可以参考下 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面 2.使用步骤 要想显示一个UIPopoverController,需要经过下列步骤

iOS开发——多线程OC篇&amp;GCD实用总结

GCD实用总结 图片下载 注:iOS开发中常见GCD的实用也就这些了, 先来看看之前我们经常使用的方式: 1 static NSOperationQueue * queue; 2 3 - (IBAction)someClick:(id)sender { 4 self.indicator.hidden = NO; 5 [self.indicator startAnimating]; 6 queue = [[NSOperationQueue alloc] init]; 7 NSInvocationO

iOS开发——面试篇&amp;OC基本语法总结(面试)

OC基本语法总结(面试) C和OC对比 OC中主要开发在什么平台上的应用程序? 答:可以使用OC开发Mac OS X平台和iOS平台的应用程序 OC中新增关键字大部分是以什么开头? 答:OC中新增关键字大部分是以@开头 OC中新增加了那些数据类型? 答: Block类型 指针类型(Class, id类型) 空类型 特殊类型(SEL, nil) 面向对象特性是什么? 答:继承性,封装性,多态性 import和#include有什么区别? 答:import 的功能和 include一样, 是将右边的