【IOS开发】多媒体操作

1、录音功能

1)引入两个类库

2)

  
  
  
  
  1. //引入头文件  
  2. #import <AVFoundation/AVFoundation.h>  
  3. #import <CoreAudio/CoreAudioTypes.h>  
  4.   
  5. //在.h文件声明变量  
  6. AVAudioRecorder *audioRecorder;  
  7.   
  8. //在.m文件  
  9. AVAudioSession *audioSession = [AVAudioSession sharedInstance];  
  10. [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];  
  11. [audioSession setActive:YES error:nil];  
  12. //此变量音频会话用来设置录音模式  
  13. /****  
  14. AVAudioSessionCategorySoloAmbient  
  15. 这个类别非常像AVAudioSessionCategoryAmbient类别,除了会停止其他程序的音频回放,比如iPod程序。当设备被设置为静音模式,你的音频回放将会停止。  
  16.   
  17. AVAudioSessionCategoryRecord  
  18. 这会停止其他应用的声音(比如iPod)并让你的应用也不能初始化音频回放(比如AVAudioPlayer)。在这种模式下,你只能进行录音。使用这个类别,调用AVAudioPlayer的prepareToPlay会返回YES,但是调用play方法将返回NO。主UI界面会照常工作。这时,即使你的设备屏幕被用户锁定了,应用的录音仍会继续。  
  19.   
  20. AVAudioSessionCategoryPlayback  
  21. 这个类别会静止其他应用的音频回放(比如iPod应用的音频回放)。你可以使用AVAudioPlayer的prepareToPlay和play方法,在你的应用中播放声音。主UI界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放都会继续。  
  22.   
  23. AVAudioSessionCategoryPlayAndRecord  
  24. 这个类别允许你的应用中同时进行声音的播放和录制。当你的声音录制或播放开始后,其他应用的声音播放将会停止。主UI界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放和录制都会继续。  
  25.   
  26. AVAudioSessionCategoryAudioProcessing  
  27. 这个类别用于应用中进行音频处理的情形,而不是音频回放或录制。设置了这种模式,你在应用中就不能播放和录制任何声音。调用AVAPlayer的prepareToPlay和play方法都将返回NO。其他应用的音频回放,比如iPod,也会在此模式下停止。  
  28.   
  29. AVAudioSessionCategoryAmbient  
  30. 这个类别不会停止其他应用的声音,相反,它允许你的音频播放于其他应用的声音之上,比如iPod。你的应用的主UI县城会工作正常。调用AVAPlayer的prepareToPlay和play方法都将返回YES。当用户锁屏时,你的应用将停止所有正在回放的音频。仅当你的应用是唯一播放该音频文件的应用时,静音模式将停止你程序的音频回放。如果正当iPod播放一手歌时,你开始播放音频,将设备设为静音模式并不能停止你的音频回放。  
  31. ****/  
  32. //创建音频文件的保存路径  
  33. NSFileManager *fileManager = [NSFileManager defaultManager];  
  34.     NSString *recordGroupPath = [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"/Documents/record"]];  
  35.     groupPath = [recordGroupPath retain];  
  36.     if (![fileManager fileExistsAtPath:recordGroupPath]) {  
  37.         NSLog(@"没有此路径");  
  38.         [fileManager createDirectoryAtPath:recordGroupPath withIntermediateDirectories:YES attributes:nil error:nil];  
  39.     }  
  40.   
  41. //根据当前时间给音频文件起名字,后缀名是caf  
  42.     NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
  43.     [dateFormatter setDateFormat:@"HHmmss"];  
  44.     NSString *recordName = [NSString stringWithFormat:@"%@.caf", [dateFormatter stringFromDate:[NSDate date]]];  
  45.     NSString *recordPath = [recordGroupPath stringByAppendingFormat:@"/%@", recordName];  
  46.     NSURL *recordURL = [[NSURL alloc] initWithString:recordPath];  
  47.     //一些设置  
  48.     NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];  
  49.     [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];  
  50.     [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];  
  51.     [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];  
  52.     [recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];  
  53.     [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];  
  54.     [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];  
  55.     NSLog(@"recodrdURL = %@, recordSetting = %@",recordURL,recordSetting);  
  56. //创建实例,参数recordURL是刚刚创建的音频文件的路径     
  57.  audioRecorder = [[AVAudioRecorder alloc] initWithURL:recordURL settings:recordSetting error:nil];  
  58.     [recordURL release], recordURL = nil;  
  59.     [recordSetting release], recordSetting = nil;  
  60.     if ([audioRecorder prepareToRecord]) {  
  61.         [audioRecorder record];  
  62.     }  
  63.   
  64. //结束录音  
  65. [audioRecorder stop];  
  66.   
  67. //播放录音  
  68. //继承代理AVAudioPlayerDelegate  
  69. //.h文件声明  
  70. AVAudioPlayer *audioPlayer;  
  71. //.m文件  
  72. NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:recordPath];  
  73.     NSLog(@"fileURL = %@", fileURL);  
  74.     audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];  
  75.     [audioPlayer setDelegate:self];  
  76.     NSLog(@"持续时间:%f", audioPlayer.duration);  
  77.     if ([audioPlayer prepareToPlay]) {  
  78.         [audioPlayer play];  
  79.     }  
  80.     [fileURL release], fileURL = nil;  
  81.   
  82. /* audioPlayerDidFinishPlaying:successfully: is called when a sound has finished playing. This method is NOT called if the player is stopped due to an interruption. */  
  83. - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag  
  84. {  
  85.   NSLog(@"播放完毕!");  
  86. }  

可以给录音界面加一个计时器,见效果图

之前见过这种效果觉得很神奇,这怎么做的呢,后来发现这只是一种字体!太坑爹了!

在.h文件

  
  
  
  
  1. NSTimer *timer;  
  2. UILabel *timeLabel;  
  3. NSDate *beginDate;  

.m文件

  
  
  
  
  1. beginDate = [[NSDate date] retain];  
  2.     timer = [NSTimer scheduledTimerWithTimeInterval:(1.0) target:self selector:@selector(onTimer) userInfo:nil repeats:YES];  
  3.     timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 320 - 200, 100)];  
  4.     [timeLabel setFont:[UIFont fontWithName:@"DBLCDTempBlack" size:24]];  
  5.     [timeLabel setBackgroundColor:[UIColor clearColor]];  
  6.     [timeLabel setTextAlignment:UITextAlignmentCenter];  
  7.     [timeLabel setTextColor:[UIColor whiteColor]];  
  8.     [timeLabel setText:@"00:00:00"];  
  9.     [self.view addSubview:timeLabel];  
  10.   
  11. //NSTimer调用方法  
  12. - (void)onTimer  
  13. {  
  14.     NSDate *nowDate = [NSDate date];  
  15.     NSCalendar *chineseClendar = [[NSCalendar alloc ] initWithCalendarIdentifier:NSGregorianCalendar];  
  16.     NSUInteger unitFlags =  NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;  
  17.     NSDateComponents *dateComponent = [chineseClendar components:unitFlags fromDate:beginDate toDate:nowDate options:0];  
  18.     NSLog(@"%d:%d:%d", dateComponent.hour, dateComponent.minute, dateComponent.second);  
  19.     timeLabel.text = [NSString stringWithFormat:@"%0.2d:%0.2d:%0.2d", dateComponent.hour, dateComponent.minute, dateComponent.second];  
  20.     [chineseClendar release], chineseClendar = nil;  
  21. }  

在使用了NSTimer之后会发现dealloc方法不回被调用了,可以在- (void)viewDidDisappear:(BOOL)animated方法中释放内存。

 

2、拍照和录像

这两者放一块是因为两者都用到同一个类UIImagePickerController,操作非常类似

//继承代理UIImagePickerControllerDelegate

//.h文件声明

  
  
  
  
  1. UIImagePickerController *photoPicker; 
  2.  UIImagePickerController *videoPicker; 

//.m文件

//拍照事件触发

  
  
  
  
  1. UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;  
  2.     if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])  
  3.     {  
  4.         sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  5.     }  
  6.     photoPicker = [[UIImagePickerController alloc] init];  
  7.     photoPicker.delegate = self;  
  8. //    photoPicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;  
  9.   
  10. //有人说在iPad中用UIImagePickerController要用UIPopOverController,最先我也用了,后来我发现不用设置photoPicer的cameraCaptureMode属性,其实可以不用UIPopOverController,这样可以使拍照界面全屏,比用UIPopOverController效果好多了!  
  11.     photoPicker.allowsEditing = YES;  
  12.     photoPicker.sourceType = sourceType;  
  13.     [self presentViewController:photoPicker animated:YES completion:nil];  

//摄像事件触发

  
  
  
  
  1. UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;  
  2.     if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])  
  3.     {  
  4.         sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  5.     }  
  6.     videoPicker = [[UIImagePickerController alloc] init];  
  7.     videoPicker.mediaTypes =[NSArray arrayWithObjects:(NSString*)kUTTypeMovie,  nil];  
  8.     videoPicker.delegate = self;  
  9. //    photoPicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;  
  10.     videoPicker.allowsEditing = YES;  
  11.     videoPicker.sourceType = sourceType;  
  12.     [self presentViewController:videoPicker animated:YES completion:nil];  
  13. //与上边的拍照事件触发的方法对比,多了一个mediaTypes属性设置,这个属性是一个数组,添加pickerController支持的模式,默认支持拍照,但是也可以自己设置,此时你设置成支持什么模式,它就支持什么模式,如果我这样设置    videoPicker.mediaTypes =[NSArray arrayWithObjects:(NSString*)kUTTypeMovie, (NSString *)kUTTypeImage, nil];那此pickerController就支持拍照摄像双模式的转换,非常方便,所以,若不是项目需要,我就把拍照和摄像功能写成一个UIImagePickerController 

 

代理

  
  
  
  
  1. #pragma mark - UIImagePickerController Delegate  
  2.   
  3. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info  
  4. {  
  5.     [picker dismissModalViewControllerAnimated:YES];  
  6.     NSFileManager *fileManager = [NSFileManager defaultManager];  
  7.   
  8. //之前我并没有设置cameraCaptureMode属性,相反,设置了可能回引起程序崩溃,相信有很多人是在此引起程序崩溃后查原因发现有人说要用到UIPopOverController的,因为,我也是这样、、、但是不用设置此属性,系统回自动判断UIImagePickerController的属性的 
  9.     if (picker.cameraCaptureMode == UIImagePickerControllerCameraCaptureModePhoto) {  
  10.         //拍照  
  11.         NSString *imageGroupPath = [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"/Documents/photo"]];  
  12.         if (![fileManager fileExistsAtPath:imageGroupPath]) {  
  13.             NSLog(@"没有此路径");  
  14.             [fileManager createDirectoryAtPath:imageGroupPath withIntermediateDirectories:YES attributes:nil error:nil];  
  15.         }  
  16.   
  17.         UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];  
  18.         NSData *imageData;  
  19.         if (UIImagePNGRepresentation(image) == nil) {  
  20.             imageData = UIImageJPEGRepresentation(image, 1);  
  21.             NSLog(@"jpeg");  
  22.         }else{  
  23.             imageData = UIImagePNGRepresentation(image);  
  24.             NSLog(@"png");  
  25.         }  
  26.                  
  27.         NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
  28.         [dateFormatter setDateFormat:@"yyyyMMddHHmmss"];  
  29.         NSString *imageName = [NSString stringWithFormat:@"%@.png", [dateFormatter stringFromDate:[NSDate date]]];  
  30.         NSString *imagePath = [imageGroupPath stringByAppendingFormat:@"/%@", imageName];  
  31.         if (imageData) {  
  32.             [imageData writeToFile:imagePath atomically:YES];  
  33.             NSLog(@"保存成功!");  
  34.         }else{  
  35.             NSLog(@"数据有误!");  
  36.         }  
  37.   
  38.         [tableview reloadData]; //更新下tableview或进行其他操作 
  39.     }else{  
  40.         //视频  
  41.         NSString *videoGroupPath = [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"/Documents/video"]];  
  42.         if (![fileManager fileExistsAtPath:videoGroupPath]) {  
  43.             NSLog(@"没有此路径");  
  44.             [fileManager createDirectoryAtPath:videoGroupPath withIntermediateDirectories:YES attributes:nil error:nil];  
  45.         }  
  46.         NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];  
  47.         [dateFormatter setDateFormat:@"yyyyMMddHHmmss"];  
  48.         NSString *videoName = [NSString stringWithFormat:@"%@.mov", [dateFormatter stringFromDate:[NSDate date]]];  
  49.         NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];  
  50.         NSString *newFilePath = [videoGroupPath stringByAppendingFormat:@"/%@", videoName];  
  51. //        NSLog(@"newFilePath = %@", newFilePath);  
  52.         NSData *videoData = [NSData dataWithContentsOfURL:videoURL];  
  53.         if (videoData) {  
  54.             [videoData writeToFile:newFilePath atomically:YES];  
  55.             NSLog(@"保存成功!");  
  56.         }else{  
  57.             NSLog(@"数据有误!");  
  58.         }  
  59.   
  60.         [tableview reloadData];  
  61.     }  
  62.     [picker release], picker = nil;  
  63. }  

 

你可能感兴趣的:(ios,多媒体)