2

私はこの問題に直面しています:

iPhoneのマイクを使用してオーディオを録音し、サーバーにアップロードします。recordたとえば、40秒で、41秒後に関数を呼び出します(uploadタイマー)。これで、サーバーにアップロードされた記録ファイルは、関数以降、完全なファイルではありません

audioRecorderDidFinishRecording:  successfully:  

関数を呼び出す前に呼び出されませんupload。関数が呼び出された後にのみ呼び出されます。関数uploadをいつ呼び出しても、upload10秒後または100秒後に呼び出されます。

アップロード機能では、ASIHTTPRequestとASIFormDataRequestを使用してファイルをアップロードします。

なぜこれが起こっているのか誰かが親切に教えてもらえますか?ありがとう。

編集#1: メソッドが呼び出されuploadない場合、メソッドはaudioRecorderDidFinishRecording: successfully:呼び出されません。かなり奇妙です!

編集#2:

関連する方法:

(void) upload
{


NSString *urlString = @"<SOME_LINK>";
NSURL *url=[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];  
ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];

NSData *fileData=[NSData dataWithContentsOfURL:recordedTmpFile];
[request setData:fileData withFileName:[fileName copy] andContentType:@"audio/x-caf" forKey:@"userfile"];
[request setPostValue:[appDelegate getRandomXML] forKey:@"random"];
[request setRequestMethod:@"POST"];
[request setDelegate:self];



[request setShouldContinueWhenAppEntersBackground:YES];
[request startSynchronous];

}




- (void) record
{
NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleLossless] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"hh:mm:ss"];
NSString *dateString=[formatter stringFromDate:[NSDate date]];

fileName=[@"recordTest" stringByAppendingFormat:@"%@.alac", dateString];

[formatter release];


NSString *documentDirectory=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSString *mediaPath=[documentDirectory stringByAppendingPathComponent:[fileName copy]];

NSString *mediaPathFinal=[NSString stringWithFormat:@"file://localhost%@",mediaPath];

recordedTmpFile = [NSURL URLWithString:[mediaPathFinal stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error];

recorder.delegate=self;


[recorder recordForDuration:(NSTimeInterval) ([[appDelegate getTimeToRecord] intValue]+1)];

}

- (void) audioRecorderDidFinishRecording:(AVAudioRecorder *) recorder  successfully:(BOOL)flag
{
NSLog(@"DONE");
}

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


- (void) viewWillAppear:(BOOL)animated
{


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

[audioSession setActive:YES error: &error];
[audioSession setDelegate:self];

[self record];
[NSTimer scheduledTimerWithTimeInterval:([[appDelegate getTimeToRecord] intValue]+1) target:self selector:@selector(upload) userInfo:nil repeats:NO];


}
4

1 に答える 1

1

内ではなく、-upload内部でメソッドを呼び出す必要があります。audioRecorderDidFinishRecording:successfully:viewWillAppear:

于 2011-08-21T04:30:45.007 に答える