0

私が作っているアプリにはいくつかのビューがあり、各ビューには記録、停止、再生ボタンがあります。アイデアは、ユーザーがビューごとに異なるサウンド ファイルに録音できるということです。

各ビューでサウンドを録音および再生できますが、ビューから離れてから戻ると、サウンドが消えます。

以下に非常に多くのコードを含めて申し訳ありませんが、それは私が理解する必要があるものです.

デリゲート.h

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>
#import <AVFoundation/AVFoundation.h>

@interface humptyDumptyAppDelegate : UIResponder <UIApplicationDelegate>

{
    NSArray *dirPaths;
    NSString *docsDir;
    NSString *soundFilePathPage1;                               
    NSString *soundFilePathPage2;
    NSString *soundFilePathPage3;
    NSString *soundFilePathPage4;
    NSString *soundFilePathPage5;
    NSString *soundFilePathPage6;

}

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) AVAudioRecorder *audioRecorder;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

//example getter and setter functions
- (NSArray*) getDirPaths;
- (void) setDirPaths:(NSArray*)myDirPath;
- (NSString*) getDocsDir;
- (NSString*) soundFilePathForPageNumber:(int)pageNumber;

@end

デリゲート.m

#import "humptyDumptyAppDelegate.h"

@implementation humptyDumptyAppDelegate

@synthesize window = _window;
@synthesize audioPlayer;
@synthesize audioRecorder;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];

    soundFilePathPage1 = [docsDir
                          stringByAppendingPathComponent:@"audiopage1.caf"];
    soundFilePathPage2 = [docsDir
                          stringByAppendingPathComponent:@"page2.caf"];
    soundFilePathPage3 = [docsDir
                          stringByAppendingPathComponent:@"page3.caf"];
    soundFilePathPage4 = [docsDir
                          stringByAppendingPathComponent:@"page4.caf"];
    soundFilePathPage5 = [docsDir
                          stringByAppendingPathComponent:@"page5.caf"];
    soundFilePathPage6 = [docsDir
                          stringByAppendingPathComponent:@"page6.caf"];
    return YES;

}
//getter function
- (NSArray*) getDirPaths{    
    return dirPaths;
}
//setter function
- (void) setDirPaths:(NSArray*)myDirPath{
    dirPaths = myDirPath;
}
// get docs directory
-(NSString*) getDocsDir{
    return docsDir;
}
// get sound file for page, passing the page number as an argument
-(NSString*) soundFilePathForPageNumber:(int)pageNumber{
    switch (pageNumber) {
        case 1:
            return soundFilePathPage1;
            break;
        case 2:
            return soundFilePathPage2;
            break;
        case 3:
            return soundFilePathPage3;
            break;
        case 4:
            return soundFilePathPage4;
            break;
        case 5:
            return soundFilePathPage5;
            break;
        case 6:
            return soundFilePathPage6;
            break;
    }
    return nil;
}

page1.m

//this is called in viewDidLoad
-(void) prepareForAudioRecording
{
    btnPlay.enabled = NO;
    btnStop.enabled = NO;

    int page = 1;
    NSString *audioFilePath = [appDelegate soundFilePathForPageNumber:page]; 
    NSURL *soundFileURL = [NSURL fileURLWithPath:audioFilePath];
    NSError *error;
    NSDictionary *recordSettings = [NSDictionary 
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16], 
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2], 
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0], 
                                    AVSampleRateKey,
                                    nil];
    appDelegate.audioRecorder = [[AVAudioRecorder alloc]
                     initWithURL:soundFileURL
                     settings:recordSettings
                     error:&error];

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

    } else {
        [appDelegate.audioRecorder prepareToRecord];
    }
}

- (IBAction)recordAudio:(id)sender {
    if (!appDelegate.audioRecorder.recording)
    {
        btnPlay.enabled = NO;
        btnStop.enabled = YES;
        [appDelegate.audioRecorder record];

    }
}

- (IBAction)stopAudio:(id)sender {
    btnStop.enabled = NO;
    btnPlay.enabled = YES;
    btnRecord.enabled = YES;


    if (appDelegate.audioRecorder.recording)
    {
        [appDelegate.audioRecorder stop];
        [self audioRecorderDidFinishRecording:appDelegate.audioRecorder successfully:YES];
    } else if (appDelegate.audioPlayer.playing) {
        [appDelegate.audioPlayer stop];

    }
}

-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
    if (flag == YES){
        NSLog(@"finished recording");
        [appDelegate.audioPlayer.data writeToFile:[appDelegate soundFilePathForPageNumber:1] atomically:YES];
    }
}

私が言ったように、含まれているコードの量は申し訳ありませんが、どこに問題があるのか​​ わかりません。writeToFileメソッド内でメソッドを呼び出していaudioRecorderDidFinishRecording:ます。これが正しいかどうかはわかりませんが、これが問題の根本ではないと感じています。

助けてください!!

4

2 に答える 2

1

このコードは音声ファイルに保存します

ファイルをドキュメントディレクトリにコピーするのはどうですか

BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@" sound.caf"];
    success = [fileManager fileExistsAtPath:writableDBPath];

    if (!success){
        // The writable database does not exist, so copy the default to the appropriate location.
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sound.caf"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];

        NSError *attributesError;
        NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:writableDBPath error:&attributesError];

        NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
        long long fileSize = [fileSizeNumber longLongValue];
        NSLog(@"file size: %lld",fileSize);

        if (!success) {
            NSLog(@"Failed to create writable database file with message: %@", [error localizedDescription]);
        }

    }
于 2012-06-01T16:14:33.350 に答える
0

問題は、私のページの 1 つで、保存されたオーディオを自動的に上書きしてprepareForAudioRecordingいたことが判明しました。viewDidAppearそれを動かしviewDidLoadてトリックをしました

于 2012-06-02T17:59:51.097 に答える