iOS 多媒体


iOS 多媒体

内容概述

  • 为多媒体开发做准备
  • 使用AVAudioPlayer类播放音乐
  • 使用AVAudioPlayerDelegate处理播放中断及续播
  • 使用AVAudioRecorder实现录音
  • 使用AVAudioRecorderDelegate代理处理录音的中断和续录
  • 使用MPMoviePlayerController类播放视频
  • 捕获视频缩略图
  • 使用MPMediaPickerController类选择系统音乐
  • 使用UIImagePickerController进行拍照和录像

21.1 为多媒体开发做准备

iOS中的多媒体技术使的设备访问系统的音频、视频成为可能,iOS SDK 为多媒体开发提供了多个开发框架,他们是AVFoundation.framework、CoreMedia.framework、MediaPlayer.framework、MobileCoreServices.framework和AssetsLibrary.framework。这些框架中MediaPlayer.framework用来实现音视频的播放,AVFoundation.framework框架用来实现音视频的录制,AssetsLibrary.framework框架用来访问系统的多媒体文件等等。

在使用这些框架时,首先要将其添加到项目中来,实现步骤如下:

  1. 创建一个项目。
  2. 选择项目名称右边的"Target",在右边的"Build Phases"中,选择"Link Binary With Libraries"中,点击"+"号添加他们。
  3. 如下图21.1所示。

图21.1 为项目添加框架

21.2 使用AVAudioPlayer类播放音乐

播放音乐是iOS多媒体中的最基本功能,我们可以使用AVAudioPlayer类来播放音乐。该类在AVFoundation.framework框架中,所以在使用之前需要导入该框架。使用AVAudioPlayer类播放音乐需要知道播放音乐的url路径,所以需要创建NSURL对象。

下面我们创建一个可以播放音乐的项目,该项目在界面上添加两个按钮,分别用来播放和停止音乐,添加一个进度滑块UISlider来控制播放音量。实现步骤如下所示:

  1. 创建一个项目,在界面上添加两个按钮和一个UISlider。
  2. 在头文件中导入播放器头文件,并添加UISlider属性、AVAudioPlayer属性和播放和停止播放方法。
#import <UIKit/UIKit.h>

// 导入头文件

#import <AVFoundation/AVFoundation.h>

@interface AmakerViewController : UIViewController{

}

// 播放方法

- (IBAction)play:(id)sender;

// 停止播放方法

- (IBAction)stop:(id)sender;

// 音量控制滑块

@property (strong, nonatomic) IBOutlet UISlider *mySlider;

// 音乐播放器类

@property(strong,nonatomic) AVAudioPlayer *myPlayer;

@end
  1. 在.m中的viewDidLoad方法中,获得播放音乐文件的NSURL路径,并根据它实例化AVAudioPlayer。
- (void)viewDidLoad

{

    [super viewDidLoad];

   // 音乐路径

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"test" ofType:@"mp3"]];

    // 实例化音乐播放器

    myPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

}
  1. 分别实现播放方法和停止播放方法,调用AVAudioPlayer的play方法来播放音乐,调用AVAudioPlayer的stop方法来停止播放音乐。通过改变AVAudioPlayer的volume属性来控制音量。
// 播放方法实现

- (IBAction)play:(id)sender {

    if (myPlayer!=nil) {

        [myPlayer play];

    }

}

// 停止播放方法实现

- (IBAction)stop:(id)sender {

    if (myPlayer!=nil) {

        [myPlayer stop];

    }

}

// 改变音量

- (IBAction)change:(id)sender {

    if (myPlayer!=nil) {

        myPlayer.volume = mySlider.value;

    }

}
  1. 程序运行结果如下所示。

图21.2 使用AVAudioPlayer类播放音乐

另外,为了程序更加流畅,我们可以将播放音乐的代码放到另外一个线程中去执行,代码如下所示。

// 播放方法实现

- (IBAction)play:(id)sender {

    if (myPlayer!=nil) {

        // 启动另外一个线程来播放,是程序更加流畅

        dispatch\_async(dispatch\_get\_global\_queue(DISPATCH\_QUEUE\_PRIORITY\_DEFAULT, 0), ^{

             [myPlayer play];

        });

    }

}

21.3 使用AVAudioPlayerDelegate处理播放中断及续播

当我们在播放音乐时,突然打来的电话会中断我们的音乐,我们可以使用AVAudioPlayer的代理类AVAudioPlayerDelegate来处理中断并继续播放。下面我们来看如何实现这一功能。

  1. 创建一个项目,在界面上添加两个按钮和一个UISlider。
  2. 在头文件中导入播放器头文件,并添加UISlider属性、AVAudioPlayer属性和播放和停止播放方法,是实现AVAudioPlayerDelegate协议。
#import <UIKit/UIKit.h>

// 导入框架

#import <AVFoundation/AVFoundation.h>

// 实现播放器代理协议

@interface AmakerViewController : UIViewController <AVAudioPlayerDelegate>{

}

// 播放方法

- (IBAction)play:(id)sender;

// 停止播放方法

- (IBAction)stop:(id)sender;

// 音量控制滑块

@property (strong, nonatomic) IBOutlet UISlider *mySlider;

// 播放器

@property(retain,nonatomic) AVAudioPlayer *myPlayer;

@end
  1. 在.m中的viewDidLoad方法中,获得播放音乐文件的NSURL路径,并根据它实例化AVAudioPlayer。并为AVAudioPlayer指定代理。
- (void)viewDidLoad

{

    [super viewDidLoad];

    // 音乐路径

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"test" ofType:@"mp3"]];

    // 实例化播放器

    myPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

    // 指定代理

    myPlayer.delegate = self;

}
  1. 分别实现播放方法和停止播放方法,调用AVAudioPlayer的play方法来播放音乐,调用AVAudioPlayer的stop方法来停止播放音乐。通过改变AVAudioPlayer的volume属性来控制音量。
// 播放方法

- (IBAction)play:(id)sender {

    if (myPlayer!=nil) {

        // 在另外一个线程中播放音乐

        dispatch\_async(dispatch\_get\_global\_queue(DISPATCH\_QUEUE\_PRIORITY\_DEFAULT, 0), ^{

            [myPlayer play];

        });

    }

}

// 停止播放方法

- (IBAction)stop:(id)sender {

    if (myPlayer!=nil) {

        [myPlayer stop];

    }

}

// 调节音量方法

- (IBAction)change:(id)sender {

    if (myPlayer!=nil) {

        myPlayer.volume = mySlider.value;

    }

}
  1. 实现代理中的中断和唤醒方法,在唤醒方法中继续播放音乐。
// 音乐被中断

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player{

    NSLog(@"audioPlayerBeginInterruption...");

}

// 继续播放

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags{

    if (flags == AVAudioSessionInterruptionFlags\_ShouldResume &amp;&amp; player != nil){

        [player play];

    }

}
  1. 程序运行结果如下所示。

21.3 通过使用AVAudioPlayerDelegate实现音乐的中断和续播

21.4 使用AVAudioRecorder实现录音

要实现录音程序需要使用AVFoundation.framework框架中的AVAudioRecorder类,为此需要导入AVFoundation.framework框架。录音程序需要设置录音程序存放的路径,和录音的属性,例如,音质、波特率、声道等属性,这些属性可以通过NSDictionary来封装。下面我们来创建一个可以实现录音并播放录音的程序,步骤如下:

  1. 创建一个项目,并导入AVFoundation.framework框架。
  2. 在界面上添加三个按钮,分别用来实现录音、停止录音和播放功能。
  3. 在.h文件中导入AVFoundation.h头文件,并添加AVAudioPlayer属性和AVAudioRecorder和录音、停止录音和播放事件方法。
#import <UIKit/UIKit.h>

// 导入框架

#import <AVFoundation/AVFoundation.h>

// 设置代理

@interface AmakerViewController : UIViewController{

}

// 播放器属性

@property(nonatomic,strong)AVAudioPlayer *player;

// 录音器属性

@property(nonatomic,strong)AVAudioRecorder *recorder;

// 录音方法

- (IBAction)record:(id)sender;

// 播放方法

- (IBAction)play:(id)sender;

// 停止播放方法

- (IBAction)stop:(id)sender;

@end
  1. 在.m的viewDidLoad方法中设置录音文件的保存路径和录音属性,并实例化AVAudioRecorder和AVAudioPlayer。
- (void)viewDidLoad

{

    [super viewDidLoad];

    // 设置录制文件的访问路径

    NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);

    NSString  *docPath = [dirPath objectAtIndex:0];

    NSString *filePath = [docPath stringByAppendingPathComponent:@"test1.wav"];

    // 根据该路径创建NSURL对象

    NSURL *soundFileURL = [NSURL fileURLWithPath:filePath];

    // 设置录音属性

    // 包括:音质、波特率、声道数量等

    NSDictionary *recordSettings = [NSDictionary

                                    dictionaryWithObjectsAndKeys:

                                    [NSNumber numberWithInt:AVAudioQualityMin],

                                    AVEncoderAudioQualityKey,

                                    [NSNumber numberWithInt:16],

                                    AVEncoderBitRateKey,

                                    [NSNumber numberWithInt: 2],

                                    AVNumberOfChannelsKey,

                                    [NSNumber numberWithFloat:44100.0],

                                    AVSampleRateKey,

                                    nil];

    NSError *error = nil;

    // 创建播放器实例

    player = [[AVAudioPlayer alloc]initWithContentsOfURL:soundFileURL error:nil];

    // 创建录音器实例

    recorder = [[AVAudioRecorder alloc]

                     initWithURL:soundFileURL

                     settings:recordSettings

                     error:&amp;error];

    // 判断是否有错误

    if (error)

    {

        NSLog(@"Error: %@", [error localizedDescription]);

    } else {

        // 准备录音

        [recorder prepareToRecord];

    }

}
  1. AVAudioRecorder的record方法进行录音,调用stop方法停止录音。调用AVAudioPlayer的play播放录音。
// 录音

- (IBAction)record:(id)sender {

    if (!recorder.isRecording) {

        [recorder record];

    }

}

// 播放

- (IBAction)play:(id)sender {

    player.volume = 1;

    [player play];

}

// 停止录音

- (IBAction)stop:(id)sender {

    [recorder stop];

}
  1. 程序运行结果如下图所示。

21.4 使用AVAudioRecorder进行录音

21.5 使用AVAudioRecorderDelegate代理处理录音的中断和续录

和播放音乐相同,录音也可能被突然打来的电话的其他任务打断,这种情况下可以通过AVAudioRecorder的代理AVAudioRecorderDelegate来实现录音的中断和继续录音。下面的程序完成了检测录音中断的功能。实现步骤如下:

  1. 创建一个项目,并导入AVFoundation.framework框架。
  2. 在界面上添加三个按钮,分别用来实现录音、停止录音和播放功能。
  3. 在.h文件中导入AVFoundation.h头文件,并添加AVAudioPlayer属性和AVAudioRecorder和录音、停止录音和播放事件方法,并实现AVAudioRecorderDelegate协议。
#import <UIKit/UIKit.h>

// 导入框架

#import <AVFoundation/AVFoundation.h>

// 设置代理

@interface AmakerViewController : UIViewController<AVAudioRecorderDelegate>{

}

// 播放器属性

@property(nonatomic,strong)AVAudioPlayer *player;

// 录音器属性

@property(nonatomic,strong)AVAudioRecorder *recorder;

// 录音方法

- (IBAction)record:(id)sender;

// 播放方法

- (IBAction)play:(id)sender;

// 停止播放方法

- (IBAction)stop:(id)sender;

@end
  1. 在.m的viewDidLoad方法中设置录音文件的保存路径和录音属性,并实例化AVAudioRecorder和AVAudioPlayer。
- (void)viewDidLoad

{

    [super viewDidLoad];

    // 设置录制文件的访问路径

    NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);

    NSString  *docPath = [dirPath objectAtIndex:0];

    NSString *filePath = [docPath stringByAppendingPathComponent:@"test1.wav"];

    // 根据该路径创建NSURL对象

    NSURL *soundFileURL = [NSURL fileURLWithPath:filePath];

    // 设置录音属性

    // 包括:音质、波特率、声道数量等

    NSDictionary *recordSettings = [NSDictionary

                                    dictionaryWithObjectsAndKeys:

                                    [NSNumber numberWithInt:AVAudioQualityMin],

                                    AVEncoderAudioQualityKey,

                                    [NSNumber numberWithInt:16],

                                    AVEncoderBitRateKey,

                                    [NSNumber numberWithInt: 2],

                                    AVNumberOfChannelsKey,

                                    [NSNumber numberWithFloat:44100.0],

                                    AVSampleRateKey,

                                    nil];

    NSError *error = nil;

    // 创建播放器实例

    player = [[AVAudioPlayer alloc]initWithContentsOfURL:soundFileURL error:nil];

    // 创建录音器实例

    recorder = [[AVAudioRecorder alloc]

                     initWithURL:soundFileURL

                     settings:recordSettings

                     error:&amp;error];

    // 判断是否有错误

    if (error)

    {

        NSLog(@"Error: %@", [error localizedDescription]);

    } else {

        // 准备录音

        [recorder prepareToRecord];

    }

}
  1. AVAudioRecorder的record方法进行录音,调用stop方法停止录音。调用AVAudioPlayer的play播放录音。
// 录音

- (IBAction)record:(id)sender {

    if (!recorder.isRecording) {

        [recorder record];

    }

}

// 播放

- (IBAction)play:(id)sender {

    player.volume = 1;

    [player play];

}

// 停止录音

- (IBAction)stop:(id)sender {

    [recorder stop];

}
  1. 实现AVAudioRecorderDelegate的检测录音中断的方法。
// 代理方法,检测录音是否被中断

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder{

    NSLog(@"audioRecorderBeginInterruption...");

}

// 代理方法,检测录音是否中断结束

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder1 withOptions:(NSUInteger)flags{

    if (recorder!=nil&amp;&amp;flags==AVAudioSessionInterruptionFlags\_ShouldResume) {

        [recorder1 record];

    }

}
  1. 程序运行结果如下图所示。

21.5 使用AVAudioRecorderDelegate检测录音中断

21.6 使用MPMoviePlayerController类播放视频

可以使用MediaPlayer.framework框架中的MPMoviePlayerController类来播放视频。播放视频时需要知道播放视频的URL路径,并设置播放时的一些属性,例如,是否自动播放、是否全屏播放等参数。我们可以将MPMoviePlayerController的view添加到当前view,也可以使用MPMoviePlayerViewController来实现播放视频。下面通过一个案例来演示如何播放视频,实现步骤如下所示。

  1. 创建一个项目,并添加MediaPlayer.framework框架到系统中在xib文件中添加一个按钮。
  2. 在.h头文件中,导入MediaPlayer.h头文件。添加MPMoviePlayerController属性和一个播放事件方法,并实现MPMediaPickerControllerDelegate协议。
#import <UIKit/UIKit.h>

// 导入视频播放器头文件

#import <MediaPlayer/MediaPlayer.h>

// 实现MPMediaPickerControllerDelegate协议

@interface AmakerViewController : UIViewController<MPMediaPickerControllerDelegate>{

}

// 播放器属性

@property(nonatomic,strong) MPMoviePlayerController *mp;

// 播放方法

- (IBAction)play:(id)sender;

@end
  1. 添加一个MP4文件到程序中。
  2. 实现播放方法,获得要播放的视频文件路径,实例化视频播放器,并设置播放器参数。
- (IBAction)play:(id)sender {

    // 获得播放视频文件路径

    NSURL *path = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"syz" ofType:@"mp4"]];

    // 实例化视频播放器

    self.mp = [[MPMoviePlayerController alloc]initWithContentURL:path];

    // 设置控制样式

    self.mp.controlStyle = MPMovieControlStyleDefault;

    // 设置是否自动播放

    self.mp.shouldAutoplay = YES;

    // 添加播放视图到当前视图

    [self.view addSubview:self.mp.view];

    // 设置全屏

    [self.mp setFullscreen:YES animated:YES];

}
  1. 覆盖MPMediaPickerControllerDelegate协议的mediaPickerDidCancel方法,在该方法中删除视频播放视图。
// 播放结束删除视图

- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker{

    [self.mp.view removeFromSuperview];

}
  1. 程序运行结果如下图所示。

21.6 使用MPMoviePlayerController播放视频

21.7 捕获视频缩略图

有时候需要在播放视频时,截获一张缩略图,这可以通过MPMoviePlayerController的方法来实现它。下面程序演示了如何截获一张缩略图,并使用UIImageView显示。实现步骤如下:

  1. 创建一个项目,添加MediaPlayer.framework框架。
  2. 在xib文件中添加一个按钮和一个图片视图。
  3. 在控制器的.h文件中添加播放事件方法,图片视图属性和播放器属性。
#import <UIKit/UIKit.h>

// 导入头文件

#import <MediaPlayer/MediaPlayer.h>

@interface AmakerViewController : UIViewController

// 播放方法

- (IBAction)play:(id)sender;

// 显示缩略图的UIImageView

@property (strong, nonatomic) IBOutlet UIImageView *myImage;

// 播放器属性

@property(nonatomic,strong)MPMoviePlayerController *player;

@end
  1. 在控制器的.m文件中实现播放方法,获得视频文件的路径,实例化MPMoviePlayerController,并向通知中心添加观察者,当请求缩略图发出是调用capture方法,设置播放参数,发出截屏请求。
- (IBAction)play:(id)sender {

    // 视频文件路径

    NSString *path = [[NSBundle mainBundle]pathForResource:@"syz" ofType:@"mp4"];

    NSURL *url = [NSURL fileURLWithPath:path];

    // 实例化MPMoviePlayerController

    self.player = [[MPMoviePlayerController alloc]initWithContentURL:url];

    // 播放

    [self.player play];

    // 向通知中心添加观察者,当请求缩略图发出是调用capture方法

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(capture:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:self.player];

    // 将播放视图添加到当前视图

    [self.view addSubview:self.player.view];

    // 设置为全屏

    [self.player setFullscreen:YES];

    // 截屏时间点

    NSNumber *thirdSecondThumbnail = [NSNumber numberWithFloat:10.0f];

    // 创建数组,只截一张屏

    NSArray *requestedThumbnails =

    [NSArray arrayWithObject:thirdSecondThumbnail];

    // 发出截屏请求

    [self.player requestThumbnailImagesAtTimes:requestedThumbnails timeOption:MPMovieTimeOptionExact];

}
  1. 在capture方法中将截屏图片设置为UIImageView的属性。
// 将截屏图片设置给图片视图

-(void)capture:(NSNotification *)param{

    MPMoviePlayerController *controller = [param object];

    UIImage *thumbnail = [param.userInfo

                          objectForKey:MPMoviePlayerThumbnailImageKey];

    self.myImage.image = thumbnail;

}
  1. 程序运行结果如下所示。

21.7 使用MPMoviePlayerController截图

21.8 使用MPMediaPickerController类选择系统音乐

一个音乐播放器应该具备播放本地视频的的功能,可以使用MPMediaPickerController类来从选择系统音乐。并通过其代理MPMediaPickerControllerDelegate来实现音乐的选择。下面通过一个案例来演示如何通过MPMediaPickerController从系统中选择音乐文件。实现步骤如下:

  1. 创建一个项目,并添加MediaPlayer.framework框架。
  2. 在界面上添加一个按钮来选择音乐。
  3. 在控制器的.h文件中设置代理,并添加选择音乐的事件方法。
#import <UIKit/UIKit.h>

// 导入头文件

#import <MediaPlayer/MediaPlayer.h>

// 设置代理

@interface AmakerViewController : UIViewController<MPMediaPickerControllerDelegate>

// 选择方法

- (IBAction)pick:(id)sender;

@end
  1. 在控制器的.m文件中实现选择音乐事件方法,实例化MPMediaPickerController,设置代理和其他参数,并跳转到该控制器。
// 选择音乐方法

- (IBAction)pick:(id)sender {

    // 实例化MPMediaPickerController

    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAny];

    // 设置代理

    mediaPicker.delegate = self;

    // 允许一次选择多个音乐文件

    mediaPicker.allowsPickingMultipleItems = YES;

    mediaPicker.prompt = @"请选择要播放的音乐文件";

    // 显示该视图控制器

    [self presentModalViewController:mediaPicker animated:YES];

}
  1. 覆盖两个代理方法,获得选择的音乐。
// 代理方法,当选择音乐后触发该方法

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

    if (mediaItemCollection.count>0) {

        NSArray *array = mediaItemCollection.items;

        // 遍历该数组

    }

}

// 当前取消选择时触发该方法

- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker{

}

21.9 使用UIImagePickerController进行拍照和录像

UIImagePickerController可以进行拍照和录像,通过设置UIImagePickerController的sourceType属性来控制是拍照还是录像,设置好属性后,我们只是跳转到该控制器即可实现拍照或录像。下面我们首先实现一个拍照程序,在界面上添加一个按钮和一个图片视图。拍照后的图片使用图片视图来显示。程序实现步骤如下所示:

  1. 创建一个项目,添加MobileCoreServices.framework和AssetsLibrary.framework两个框架。
  2. 在界面上添加一个按钮和一个图片视图控件,单击按钮进行拍照,拍照后的照片显示在图片视图中。
  3. 在.h控制器头文件中,实现UIImagePickerControllerDelegate和UINavigationControllerDelegate协议,并添加拍照事件方法和显示照片的图片视图。
#import <UIKit/UIKit.h>

#import <MobileCoreServices/MobileCoreServices.h>

#import <AssetsLibrary/AssetsLibrary.h>

@interface AmakerViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

// 拍照

- (IBAction)take:(id)sender;

// 显示照片

@property (strong, nonatomic) IBOutlet UIImageView *pic;

@end
  1. 在.m的拍照事件方法中实现拍照功能,实例化UIImagePickerController,并设置图片源类型为照相机输入源,设置代理,并跳转到拍照视图控制器。
- (IBAction)take:(id)sender {

    // 实例化UIImagePickerController

    UIImagePickerController *controller =

    [[UIImagePickerController alloc] init];

    // 设置图片源类型为照相机输入源

    controller.sourceType = UIImagePickerControllerSourceTypeCamera;

    // 媒体类型

    NSString *requiredMediaType = (\_\_bridge NSString *)kUTTypeImage;

    // 设置媒体类型

    controller.mediaTypes = [[NSArray alloc]

                             initWithObjects:requiredMediaType, nil];

    // 是否运行编辑

    controller.allowsEditing = YES;

    // 设置代理

    controller.delegate = self;

    // 跳转到该控制器

    [self presentViewController:controller animated:YES completion:nil];

}
  1. 在代理方法中获得照片并显示。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    NSLog(@"info=%@",info);

    // 获得拍照的图片

    UIImage *myImage =

    [info objectForKey:

     UIImagePickerControllerOriginalImage];

    // 设置UIImageView的属性

    self.pic.image = myImage;

    // 取消显示

    [picker dismissViewControllerAnimated:YES completion:nil];

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;{

    NSLog(@"imagePickerControllerDidCancel");

}
  1. 程序运行结果如下所示。

21.8 使用UIImagePickerController进行拍照

在上一节我们学习了如何使用UIImagePickerController如何进行拍照,下面我们来学习如何使用UIImagePickerController来实现录像功能。实现步骤如下所示:

  1. 创建一个项目,并添加MediaPlayer.framework、MobileCoreServices.framework、CoreMedia.framework和AssetsLibrary.framework框架。
  2. 在xib文件中添加两个按钮,分别来实现录像和播放功能。
  3. 在控制器的.h头文件中添加类库,并实现代理,声明录像和播放事件方法,声明视频播放器属性和当前url路径属性。
#import <UIKit/UIKit.h>

#import <AssetsLibrary/AssetsLibrary.h>

#import <MobileCoreServices/MobileCoreServices.h>

#import <MediaPlayer/MediaPlayer.h>

@interface AmakerViewController : UIViewController<UINavigationControllerDelegate,UIImagePickerControllerDelegate>

// 录像事件方法

- (IBAction)start:(id)sender;

// 播放事件方法

- (IBAction)play:(id)sender;

// 视频播放器属性

@property(nonatomic,strong)MPMoviePlayerController *mPlayer;

// 当前url路径

@property(nonatomic,strong)NSURL *currentURL;

@end
  1. 实现录像事件方法,实例化UIImagePickerController,并设置媒体源类型为录像以及其他参数,然后跳转到该控制器。
- (IBAction)start:(id)sender {

    // 实例化UIImagePickerController

    UIImagePickerController *controller =

    [[UIImagePickerController alloc] init];

    // 设置媒体源类型为录像

    controller.sourceType = UIImagePickerControllerSourceTypeCamera;

    NSString *requiredMediaType = (\_\_bridge NSString *)kUTTypeMovie;

    controller.mediaTypes = [[NSArray alloc]

                             initWithObjects:requiredMediaType, nil];

    // 设置是否允许编辑

    controller.allowsEditing = YES;

    // 设置代理

    controller.delegate = self;

    // 录制质量

    controller.videoQuality = UIImagePickerControllerQualityTypeHigh;

    // 最大录制时间

    controller.videoMaximumDuration = 30.0f;

    // 跳转到该控制器

    [self presentViewController:controller animated:YES completion:nil];

}
  1. 在代理的方法中获得视频保存的url路径。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    NSLog(@"info=%@",info);

    // 获得媒体类型

    NSString     *mediaType = [info objectForKey:

                               UIImagePickerControllerMediaType];

    // 判断媒体类型是否是视频

    if ([mediaType isEqualToString:(\_\_bridge NSString *)kUTTypeMovie]){

        // 获得视频的路径

        NSURL *urlOfVideo =

        [info objectForKey:UIImagePickerControllerMediaURL];

        self.currentURL = urlOfVideo;

    }

    [picker dismissViewControllerAnimated:YES completion:nil];

}
  1. 根据上面的url路径来播放录制的视频。
- (IBAction)play:(id)sender {

    self.mPlayer = [[MPMoviePlayerController alloc]initWithContentURL:self.currentURL];

    // 设置控制样式

    self.mPlayer.controlStyle = MPMovieControlStyleDefault;

    // 设置是否自动播放

    self.mPlayer.shouldAutoplay = YES;

    // 添加播放视图到当前视图

    [self.view addSubview:self.mPlayer.view];

    // 设置全屏

    [self.mPlayer setFullscreen:YES animated:YES];

}
  1. 程序运行结果如下图所示。

21.9 使用UIImagePickerController进行录像