Почему моя запись не может быть воспроизведена? (iPhone SDK) - PullRequest
0 голосов
/ 19 февраля 2010

Я программирую приложение, которое позволяет мне записывать звуки дверного звонка и воспроизводить их на дверном звонке, который пользователь видит, когда нажимает кнопку.Мое приложение, кажется, записывает и сохраняет файл (файл находится там (в Документах) в соответствии с симулятором iPhone, поскольку я создал каталог в делегате приложения)).Однако воспроизведение не работает.(Кстати, свойство записи возвращает TRUE.)

ОБНОВЛЕНИЕ : Вот почтовый индекс всего проекта .

Может кто-нибудь помочь мневидите что не так?

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.layer.cornerRadius = 8;
    [actionButton setBackgroundImage:[[UIImage imageNamed:@"biggreenbutton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
    NSFileManager *nsf = [NSFileManager defaultManager];
    NSArray *allDocs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [allDocs objectAtIndex:0];
    NSString *savedDBells = [path stringByAppendingPathComponent:@"Custom Doorbells"];
    NSString *nextFile;
    for (NSInteger i = 1; i < 100; i++){
        if (![nsf fileExistsAtPath:[savedDBells stringByAppendingPathComponent:[NSString stringWithFormat:@"d%i%@",i,@".caf"]]]){
            nextFile = [savedDBells stringByAppendingPathComponent:[NSString stringWithFormat:@"d%i%@",i,@".caf"]];
            break;
        }
    }
    NSURL *url = [[NSURL alloc] initFileURLWithPath:nextFile];
    NSDictionary *setup = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
                           [NSNumber numberWithInt:44100.0],AVSampleRateKey,
                           [NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
                           [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                           [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                           [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                           nil];

    NSError *err;
    NSLog(@"%@",url);
    recorder = [[AVAudioRecorder alloc] initWithURL:url settings:setup error:&err];
    [setup release];
    [url release];
    //Gradient code
    /*
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.view.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
    [self.view.layer insertSublayer:gradient atIndex:0];
     */
}

-(IBAction) actionButtonPressed: (id) sender{
    NSLog(@"%@",actionButton.titleLabel.text);
    if ([actionButton.titleLabel.text isEqual:@"Finish Recording"]){
        BOOL test = recorder.recording;
        NSLog(@"Recording property = %i",test);
        [upCounter invalidate];
        [recorder stop];

        [self dismissModalViewControllerAnimated:YES];
    }
    if ([actionButton.titleLabel.text isEqual:@"Begin Recording"]){
        upCounter = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
        [[NSRunLoop mainRunLoop] addTimer:upCounter forMode:NSDefaultRunLoopMode];
        [actionButton setTitle:@"Finish Recording" forState:UIControlStateNormal];
        [actionButton setBackgroundImage:[[UIImage imageNamed:@"bigredbutton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
        NSLog(@"Recorder record = %i",[recorder record]);
    }

}

В другом контроллере вида:

-(IBAction) recordingButtonPressed:(id) sender{
    AVAudioSession *avs = [AVAudioSession sharedInstance];
    //Test for written folder
    /*NSFileManager *fileMan = [NSFileManager defaultManager];
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    */

    if (avs.inputIsAvailable){
        NSString *recordedFile;

        RecordingViewController *recorderVC = [[RecordingViewController alloc] initWithNibName:@"RecordingViewController" bundle:nil];
        recorderVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentModalViewController:recorderVC animated:YES];
        recordedFile = [recorderVC.recorder.url absoluteString]; 
        [recorderVC release];
        self.currentSoundPath = recordedFile;
        NSLog(@"%@",currentSoundPath);

        /*if ([fileMan fileExistsAtPath:recordedFile]){
        UIActionSheet *overwrite = [[UIActionSheet alloc] initWithTitle:@"Overwrite the current doorbell recording?" delegate:self cancelButtonTitle:@"Cancel"  destructiveButtonTitle:@"Overwrite" otherButtonTitles:nil];
        overwrite.delegate = self;
        [overwrite showInView:self.view];
        [overwrite release];
        }*/

        /*NSDictionary *recorderSettingsDict=[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatAppleIMA4],AVFormatIDKey,
                                            [NSNumber numberWithInt:44100.0],AVSampleRateKey,
                                            [NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
                                            [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                                            [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                                            [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                                            nil];
        AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:recordedFile settings:<#(NSDictionary *)settings#> error:<#(NSError **)outError#>];*/
    }
    else{
        UIAlertView *noAudio = [[UIAlertView alloc] initWithTitle:@"No microphone connected" message:@"Please connect a microphone to record a doorbell." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [noAudio show];
        [noAudio release];
    }
}

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Хотя этот код может и не являться проблемой, в моем случае невозможность воспроизвести записанный аудиофайл была вызвана тем, что он не вызвал [audioRecorder stop]. У меня был код на месте, так как ссылка на мой аудиоплеер была равна нулю, когда он добрался до кода, который должен был вызвать остановку, поэтому используйте отладчик, чтобы убедиться, что, когда вы говорите остановке записи, у вас все еще есть ссылка на аудиорекордер.

1 голос
/ 07 марта 2011

Единственное, что бросается в глаза, это то, что вы звоните [NSNumber numberWithInt: 44100.0] вместо numberWithDouble.

...