如何在ios中显示和播放拍摄的照片和视频,Audios

时间:2015-09-24 08:51:14

标签: ios objective-c

嗨,我是Ios的初学者,在我的项目中,我为用户提供了从相机捕获照片和视频以及Audios的设施,我将他们的“路径”存储在数组列表中,我将它们显示在一个表列表中,以便一切都好吗

但是这里我的主要要求是当我点击表格列行时,如果有图像文件则必须显示或者如果有视频则必须播放音频也必须像播放视频一样播放我已经写了一些代码这里的照片和视频播放得很好,但音频文件给我的问题我做错了什么?

我的代码: -

 #import "ViewController2.h"
#import <MobileCoreServices/UTCoreTypes.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>


@interface ViewController2 ()
{
    NSMutableArray * arr_mediaType;
    UIImagePickerController *imagePicker;
    UIImage *snap;
    NSData *data1;
    NSMutableArray * arr_media;

    MPMoviePlayerController * moviePlayer;
    UIImageView *dot;
    AVAudioRecorder * _audioRecorder;
    AVAudioPlayer * player;
}
@end

@implementation ViewController2

@synthesize maintablelist;

- (void)viewDidLoad {

    arr_mediaType = [[NSMutableArray alloc]init];
    arr_media = [[NSMutableArray alloc]init];

    maintablelist.delegate = self;
    maintablelist.dataSource = self;

    [super viewDidLoad];
}

- (IBAction)takePicture:(id)sender {

    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeImage,      nil];

    [self presentViewController:imagePicker animated:NO completion:nil];

}

- (IBAction)takeVideo:(id)sender {

    NSString *model = [[UIDevice currentDevice] model];

    if ([model isEqualToString:@"iPhone Simulator"] || [model isEqualToString:@"iPad Simulator"])
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Angry!!!" message:@"No Camera found!" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
    else
    {
        imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.videoMaximumDuration = 10;
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie,      nil];
        [self presentViewController:imagePicker animated:NO completion:nil];
    }
}

- (IBAction)takeAudio:(id)sender {

    NSArray *dirPaths;
    NSString *docsDir;

    dirPaths = NSSearchPathForDirectoriesInDomains(
                                                   NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = dirPaths[0];
    NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString];  // to get unique name

    NSString *soundfile = [NSString stringWithFormat:@"sound%@.m4a",fileName];

    NSString *soundFilePath = [docsDir
                               stringByAppendingPathComponent:soundfile];

    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];


    NSLog(@"FilePath:%@",soundFileURL);

    NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];

    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

    NSError *error = nil;

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
                        error:nil];

    _audioRecorder = [[AVAudioRecorder alloc]
                      initWithURL:soundFileURL
                      settings:recordSetting
                      error:&error];

    if (error)
    {
        NSLog(@"error: %@", [error localizedDescription]);
    }
    else {
        NSLog(@"ok");
        [arr_media addObject:soundFilePath];
        [_audioRecorder record];
        [maintablelist reloadData];
    }
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];


    if ([mediaType isEqualToString:@"public.image"]){

        [mediaType  isEqual: @"Photos"];

        [arr_mediaType addObject:@"Photos"];

        snap = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString];
        NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"Pic-%@.png", fileName]];

        NSData *data = UIImageJPEGRepresentation(snap, 1.0);
        [data writeToFile:filePath atomically:YES];

        [picker dismissViewControllerAnimated:YES completion:nil];

        NSLog(@"So finally path is%@",filePath);

        [arr_media addObject:filePath];

        [maintablelist reloadData];

    }

    else {

        [mediaType  isEqual: @"Videos"];
        [arr_mediaType addObject:@"Video"];

        NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];

        NSLog(@"videoURL --->>> %@",videoURL);

        NSData *videoData = [NSData dataWithContentsOfURL:videoURL];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString];

        NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"video%@.mov", fileName]];

        BOOL success = [videoData writeToFile:filePath atomically:NO];

        [arr_media addObject:filePath];

        NSLog(@"videoURLPath --->>> %@",filePath);

        [picker dismissViewControllerAnimated:YES completion:nil];

        [maintablelist reloadData];

    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return arr_mediaType.count;

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *cells=@"cell";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:nil];

    if (cell==nil) {
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cells];
    }

    cell.textLabel.text = [arr_media objectAtIndex:indexPath.row];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([[arr_mediaType objectAtIndex:indexPath.row] isEqualToString:@"Photos"]) {

        [moviePlayer.view removeFromSuperview];
        dot =[[UIImageView alloc] initWithFrame:CGRectMake(40,320,240,128)];
        dot.image = [UIImage imageNamed:[arr_media objectAtIndex:indexPath.row]];
        [self.view addSubview:dot];
    }
    else if([[arr_mediaType objectAtIndex:indexPath.row] isEqualToString:@"Videos"])
    {
        [dot removeFromSuperview];

        NSURL*theurl=[NSURL fileURLWithPath:[arr_media objectAtIndex:indexPath.row]];

        moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:theurl];
        [moviePlayer.view setFrame:CGRectMake(40, 320, 240, 128)];
        [moviePlayer prepareToPlay];
        [moviePlayer setShouldAutoplay:NO];
        [self.view addSubview:moviePlayer.view];
    }
    else
    {
        NSString *filePath = [arr_media objectAtIndex:indexPath.row];
        NSData *soundData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
        player = [[AVAudioPlayer alloc] initWithData:soundData error:nil];
        [player setDelegate:self];
        [player play];
    }
}

@end

2 个答案:

答案 0 :(得分:0)

您的问题是您没有保存捕获的图像/照片,只是尝试使用路径。请查看Apple Documentation如何使用它。您可以将它们保存在项目的Documents目录中,保存文件名和路径,然后使用这些路径进行渲染/播放。

作为旁注,在您的实现中,在[picker dismissViewControllerAnimated:YES completion:nil]之后执行的代码行很少。我建议在这里使用完成块并在图像选择器视图解除完成后加载表视图。这可以避免运行时崩溃。

编辑:关于OP请求

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) 
    {
       NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
       NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @“image1.png”];


        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
        NSData *imageData = UIImageJPEGRepresentation(image, 1);
       [imageData writeToFile: filePath atomically:YES];

      [picker dismissViewControllerAnimated:YES completion:^{
        // Save your model data and reload table here 
       }];

    }
}

答案 1 :(得分:0)

在这里,我修改了你的代码。首先,不需要不同的阵列来存储图像和视频。您可以从一个访问它。 Simillarly,不需要在两个不同的阵列中存储媒体类型。你可以通过一个数组来完成它。

此外,要将图像和视频保存到文档目录,您需要将这些文件写入特定路径。然后,您就可以访问它们了。

#import "ViewController.h"
#import <MobileCoreServices/UTCoreTypes.h>
#import <MediaPlayer/MediaPlayer.h>

@interface ViewController ()
{
    NSMutableArray * arr_mediaType;
    UIImagePickerController *imagePicker;
    UIImage *snap;
    NSData *data1;
    NSMutableArray * arr_media;

    MPMoviePlayerController * moviePlayer;
    UIImageView *dot;
}

@end

@implementation ViewController

@synthesize tbl;

- (void)viewDidLoad {

    arr_mediaType = [[NSMutableArray alloc]init];
    arr_media = [[NSMutableArray alloc]init];

    tbl.delegate = self;
    tbl.dataSource = self;

    [super viewDidLoad];
}

- (IBAction)takePicture:(id)sender {



    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeImage,      nil];

    [self presentViewController:imagePicker animated:NO completion:nil];

}

- (IBAction)takeVideo:(id)sender {


    NSString *model = [[UIDevice currentDevice] model];

    if ([model isEqualToString:@"iPhone Simulator"] || [model isEqualToString:@"iPad Simulator"])
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Angry!!!" message:@"No Camera found!" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
    else
    {
        imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.videoMaximumDuration = 10;
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie,      nil];
        [self presentViewController:imagePicker animated:NO completion:nil];
    }
}

-(IBAction)takeAudio
{
        NSArray *dirPaths;
        NSString *docsDir;

        dirPaths = NSSearchPathForDirectoriesInDomains(
                                                       NSDocumentDirectory, NSUserDomainMask, YES);
        docsDir = dirPaths[0];
        NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString];  // to get unique name

        NSString *soundfile = [NSString stringWithFormat:@"sound%@.m4a",fileName];

        NSString *soundFilePath = [docsDir
                                   stringByAppendingPathComponent:soundfile];

        NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];


        NSLog(@"FilePath:%@",soundFileURL);

        NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];

    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

        NSError *error = nil;

        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
                            error:nil];

        _audioRecorder = [[AVAudioRecorder alloc]
                          initWithURL:soundFileURL
                          settings:recordSettings
                          error:&error];

        if (error)
        {
            NSLog(@"error: %@", [error localizedDescription]);
        } else {
            [arr_media addObject:soundFilePath];
            [_audioRecorder record];
        }
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];


    if ([mediaType isEqualToString:@"public.image"]){

        [mediaType  isEqual: @"Photos"];

        [arr_mediaType addObject:@"Photos"];

        snap = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString];
        NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"Pic-%@.png", fileName]];

        NSData *data = UIImageJPEGRepresentation(snap, 1.0);
        [data writeToFile:filePath atomically:YES];



        [picker dismissViewControllerAnimated:YES completion:nil];



        //UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath];

//        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//        
//        NSString *Dir = [paths objectAtIndex:0];

//        NSString *fileName = [NSString stringWithFormat:@"Pic-%lf.png", [[NSDate date] timeIntervalSince1970]];
//        
//        //this path if you want save reference path in sqlite
//        NSString *pngPath = [NSString stringWithFormat:@"%@/%@",Dir,fileName];
//        
      NSLog(@"So finally path is%@",filePath);

        [arr_media addObject:filePath];

        [tbl reloadData];


    }

    else {

       [mediaType  isEqual: @"Videos"];
    [arr_mediaType addObject:@"Video"];

    NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];

    NSLog(@"videoURL --->>> %@",videoURL);

    NSData *videoData = [NSData dataWithContentsOfURL:videoURL];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString];

    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"video%@.mov", fileName]];

    BOOL success = [videoData writeToFile:filePath atomically:NO];

    [arr_media addObject:filePath];

    NSLog(@"videoURLPath --->>> %@",filePath);

    [picker dismissViewControllerAnimated:YES completion:nil];

    [tbl reloadData];

    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return arr_mediaType.count;

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *cells=@"cell";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:nil];

    if (cell==nil) {
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cells];
    }


        cell.textLabel.text = [arr_media objectAtIndex:indexPath.row];


    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([[arr_mediaType objectAtIndex:indexPath.row] isEqualToString:@"Photos"]) {

        [moviePlayer.view removeFromSuperview];
        dot =[[UIImageView alloc] initWithFrame:CGRectMake(40,320,240,128)];
        dot.image = [UIImage imageNamed:[arr_media objectAtIndex:indexPath.row]];
        [self.view addSubview:dot];
    }
    else if([[arr_mediaType objectAtIndex:indexPath.row] isEqualToString:@"Videos"])
    {
        [dot removeFromSuperview];
        //        NSString*thePath=[[NSBundle mainBundle] pathForResource:[arr_media objectAtIndex:indexPath.row] ofType:@"MOV"];
    NSURL*theurl=[NSURL fileURLWithPath:[arr_media objectAtIndex:indexPath.row]];

        moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:theurl];
        [moviePlayer.view setFrame:CGRectMake(40, 320, 240, 128)];
        [moviePlayer prepareToPlay];
        [moviePlayer setShouldAutoplay:NO];
        [self.view addSubview:moviePlayer.view];
    }
    else
    {
        NSString *filePath = [arr_media objectAtIndex:indexPath.row];
        NSData *soundData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
        player = [[AVAudioPlayer alloc] initWithData:soundData error:nil];
        [player setDelegate:self];
        [player play];
    }

@end