.h ファイルに次のように書きました。
#import <UIKit/UIKit.h>
#import "SCListener.h"
#import <AVFoundation/AVFoundation.h>
@interface TalkingAndSayingViewController : UIViewController<AVAudioPlayerDelegate>
{
IBOutlet UIImageView *bkg;
IBOutlet UILabel *showVoulme;
SCListener *listener;
NSTimer *time;
BOOL listen;
NSString *audioPath;
AVAudioRecorder *recoder;
AVAudioPlayer *player;
int breakCount;
BOOL timeActive;
}
@property(nonatomic,assign)int roleIndex;
@end
.m ファイルに次のように書きました。
- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
audioPath = [[searchPaths objectAtIndex:0] stringByAppendingPathComponent:@"audio.wav"];
[audioPath retain];
listen = YES;
NSMutableDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSString *imgName = [NSString stringWithFormat:@"role%d.png",self.roleIndex];
[bkg setImage:[UIImage imageNamed:imgName]];
recoder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:audioPath] settings:recordSettings error:nil];
[recoder setMeteringEnabled:YES];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:audioPath] error:nil];
[player setNumberOfLoops:0];
AVAudioSession *audioSession = [[AVAudioSession sharedInstance] retain];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: nil];
[audioSession setActive:YES error: nil];
time = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(CheckVolume) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:time forMode:NSDefaultRunLoopMode];
}
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
timeActive = YES;
listen = YES;
NSLog(@"fihish playing, start listen");
}
-(void)CheckVolume
{
Float32 peak = [[SCListener sharedListener] peakPower];
if(timeActive)
{
if(listen)
{
[showVoulme setText:[NSString stringWithFormat:@"%f",peak]];
if(peak>0.3)
{
listen = NO;
[recoder prepareToRecord];
[recoder record];
NSLog(@"start recording");
}
}
else
{
if(peak<0.1)
{
if(breakCount >= 5)
{
NSLog(@"start play");
[recoder stop];
player.delegate = self;
[player prepareToPlay];
[player play];
timeActive = NO;
breakCount = 0;
}
else
breakCount++;
}
else
breakCount = 0;
}
}
}
-(void)viewWillDisappear:(BOOL)animated
{
[recoder stop];
[[SCListener sharedListener] stop];
timeActive = NO;
}
-(void)viewDidAppear:(BOOL)animated
{
timeActive = YES;
[[SCListener sharedListener] listen];
breakCount = 0;
}
最初にいくつかの問題があります:audioPlayerDidFinishPlaying この関数はまったく実行されず、このコードは「再生を開始」するためにのみ実行できますが、実際には音は再生されませんでした。以前はレコーダーを使用して音量を確認していました録音状態ですが、peakPowerForChannel:0 は 0.00001 の静的な値しか返しません。この問題を解決する方法がわかりません。誰か助けてくれるか、自動録音と自動再生のサンプル コードを送ってください。ほんとうにありがとう。ありがとう