AVAudioPlayer не будет воспроизводить существующий файл во второй раз - PullRequest
0 голосов
/ 17 января 2012

Я много искал, пытаясь это выяснить - мне кажется, что код в порядке, но функциональность этого не отражает.

У меня есть представленное представление (это представление Audio Recorder). Вы можете нажать «запись», и она прекрасно записывается в файл (данные существуют в файле). Затем я могу воспроизвести файл с помощью кнопки воспроизведения (AVAudioPlayer указывает на этот файл).

Однако, когда я закрываю / закрываю это представление и возвращаюсь к нему - файл не будет воспроизводиться при нажатии Play, даже если он должен быть точно таким же кодом, поскольку местоположение файла не изменилось.

UPDATE:

Кажется, что [audioPlayer play] возвращает no Я также изучил данные. Кажется, что когда представление появляется снова и загружает эти данные, оно загружает его неправильно (NSdata в Nslog отображает в основном 0) - даже если файл существует и в нем есть данные (я могу видеть и слышать его после переноса на мой Mac).

Это заставляет меня заподозрить, что либо я загружаю данные неправильно, либо avaudioplayer по какой-то причине не прочитает данные ...

Пожалуйста, посмотрите на код ниже:

(NSString *) removeCharsFrom: (NSString *) remover {

    remover = [remover stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    remover = [remover stringByReplacingOccurrencesOfString:@" " withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"\\" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@":" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@";" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"(" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@")" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"£" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"$" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"&" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"'" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"{" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"}" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"[" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"]" withString:@"_"];
    remover = [remover stringByReplacingOccurrencesOfString:@"""" withString:@"_"];

    return remover;
}


- (NSString *) audioPathForResource: (NSString *) audio {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *saveDirectory = [paths objectAtIndex:0];
    NSString *newFolder = [saveDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@/Audio",catName]];

    if (![[NSFileManager defaultManager] fileExistsAtPath:newFolder]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:newFolder withIntermediateDirectories:YES attributes:nil error:nil];
    }

    NSString *saveFileName = [NSString stringWithFormat:@"%@.caf",audio];
    NSString *newFilePath = [newFolder stringByAppendingPathComponent:saveFileName];


    return [newFilePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

}


- (IBAction)cancelTapped:(id)sender {

    [self dismissModalViewControllerAnimated:YES];

}

- (IBAction)saveTapped:(id)sender {


    [self.parentViewController performSelector:@selector(changeAddAudioIcon)];

    [self dismissModalViewControllerAnimated:YES];

}


- (IBAction)trashTapped:(id)sender {

    UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle: @"Delete"
                               message: @"Would you like to delete the audio file? Warning: This cannot be undone."
                              delegate: self
                     cancelButtonTitle: @"Cancel"
                     otherButtonTitles: @"Delete", nil];
    [alert show];
    [alert release];

}

- (IBAction)pauseTapped:(id)sender {

    pauseBtn.enabled = NO;
    playBtn.enabled = YES;
    recordBtn.enabled = YES;
    trashBtn.enabled = YES;

    if (audioRecorder.recording)
    {
        [audioRecorder stop];
    } else if (audioPlayer.playing) {
        [audioPlayer stop];
    }


}

- (IBAction)recordTapped:(id)sender {

    if (!audioRecorder.recording)
    {
        playBtn.enabled = NO;
        pauseBtn.enabled = YES;
        trashBtn.enabled = NO;
        [audioRecorder record];
    }
}

- (IBAction)playTapped:(id)sender {


        pauseBtn.enabled = YES;
        recordBtn.enabled = NO;
        trashBtn.enabled = YES;

        NSError *error;

        NSLog(@"%@",filepathstring);


        NSURL *soundFileURL = [NSURL fileURLWithPath:filepathstring];

            audioPlayer = [[AVAudioPlayer alloc] 
                           initWithContentsOfURL:soundFileURL                                   
                           error:&error];


        audioPlayer.delegate = self;

        if (error)
            NSLog(@"Error: %@", 
                  [error localizedDescription]);
        else
            [audioPlayer play];


}



- (void)alertView: (UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {


    switch (buttonIndex) {
        case 0:

            return;
            break; 
        case 1:
        {   
            NSError *error = nil;
            [[NSFileManager defaultManager] removeItemAtPath:filepathstring error:&error];
            trashBtn.enabled = NO;
        }

            break;

        default:
            break;
    }

}

-(void)audioPlayerDidFinishPlaying:
(AVAudioPlayer *)player successfully:(BOOL)flag
{
    recordBtn.enabled = YES;
    pauseBtn.enabled = NO;
    playBtn.enabled = YES;

    if(player != audioPlayer) {
        [player release];
    }

}
-(void)audioPlayerDecodeErrorDidOccur:
(AVAudioPlayer *)player 
                                error:(NSError *)error
{
    NSLog(@"Decode Error occurred");
}
-(void)audioRecorderDidFinishRecording:
(AVAudioRecorder *)recorder 
                          successfully:(BOOL)flag
{

    NSLog(@"Recording success:%@",flag ? @"YES" : @"NO");

    trashBtn.enabled = YES;
    pauseBtn.enabled = NO;
    playBtn.enabled = YES;

}
-(void)audioRecorderEncodeErrorDidOccur:
(AVAudioRecorder *)recorder 
                                  error:(NSError *)error
{
    NSLog(@"Encode Error occurred");
}




#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.





}

- (void) viewWillAppear:(BOOL)animated {



    catName = [NSString stringWithFormat:@"%@",[self removeCharsFrom:catName]];
    testName = [NSString stringWithFormat:@"%@",[self removeCharsFrom:testName]];
    filepathstring = [[self audioPathForResource:testName] retain];
    NSLog(@"At start = %@",filepathstring);

    if ([[NSFileManager defaultManager] fileExistsAtPath:filepathstring]) {
        playBtn.enabled = YES;
        trashBtn.enabled = YES;
        recordBtn.enabled = YES;
    }
    else
    {
        playBtn.enabled = NO;
        trashBtn.enabled = NO;
    }

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];


    NSURL *soundFileURL = [NSURL fileURLWithPath:filepathstring];

    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;

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

    audioRecorder.delegate = self;

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

    } else {
        [audioRecorder prepareToRecord];
    }

}

- (void)viewDidUnload
{
    [self setCancelBtn:nil];
    [self setSaveBtn:nil];
    [self setTimeLabel:nil];
    [self setDescriptionLabel:nil];
    [self setToolsBar:nil];
    [self setTrashBtn:nil];
    [self setPauseBtn:nil];
    [self setRecordBtn:nil];
    [self setPlayBtn:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    } else {
        return UIInterfaceOrientationIsPortrait(interfaceOrientation);
    }
}

- (void)dealloc {
    [cancelBtn release];
    [saveBtn release];
    [timeLabel release];
    [descriptionLabel release];
    [toolsBar release];
    [trashBtn release];
    [pauseBtn release];
    [recordBtn release];
    [playBtn release];
    [audioPlayer release];
    [audioRecorder release];
    [super dealloc];
}

1 Ответ

0 голосов
/ 18 января 2012

Вот ответ:

NSData *data = [NSData dataWithContentsOfMappedFile:[NSString stringWithFormat:@"%@",filepathstring]];


  AVAudioPlayer *ap = [[AVAudioPlayer alloc] 
                   initWithData:data error:&error];

Кажется, что он просто не будет работать с filepathstring, но в строке NSString он работал нормально.Теперь очевидно!

...