iPhoneのシステムオーディオをm4aファイルに直接録音するxCodeを探しています。具体的には、デバイスで再生しているオーディオファイルとマイクからの入力を同時に録音したいと思います。他のオーディオイベントを拾うリスクがあることを理解しており、録音を一時停止または停止したいと思います(たとえば、テキストを受信し、チャイムが鳴ります。...録音を停止したいと思います)。
2 に答える
AVAudioRecorderを使用できます
以下のコードはtechotopia.comから取得しました
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface RecordViewController : UIViewController
<AVAudioRecorderDelegate, AVAudioPlayerDelegate>
@property (strong, nonatomic) AVAudioRecorder *audioRecorder;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
@property (strong, nonatomic) IBOutlet UIButton *recordButton;
@property (strong, nonatomic) IBOutlet UIButton *playButton;
@property (strong, nonatomic) IBOutlet UIButton *stopButton;
- (IBAction)recordAudio:(id)sender;
- (IBAction)playAudio:(id)sender;
- (IBAction)stop:(id)sender;
@end
AVAudioRecorder インスタンスの作成
- (void)viewDidLoad {
[super viewDidLoad];
_playButton.enabled = NO;
_stopButton.enabled = NO;
NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
NSString *soundFilePath = [docsDir
stringByAppendingPathComponent:@"sound.caf"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
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];
if (error)
{
NSLog(@"error: %@", [error localizedDescription]);
} else {
[_audioRecorder prepareToRecord];
}
}
アクション メソッドの実装 - (IBAction)recordAudio:(id)sender { if (!_audioRecorder.recording) { _playButton.enabled = NO; _stopButton.enabled = YES; [_audioRecorder レコード]; } }
- (IBAction)playAudio:(id)sender {
if (!_audioRecorder.recording)
{
_stopButton.enabled = YES;
_recordButton.enabled = NO;
NSError *error;
_audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:_audioRecorder.url
error:&error];
_audioPlayer.delegate = self;
if (error)
NSLog(@"Error: %@",
[error localizedDescription]);
else
[_audioPlayer play];
}
}
- (IBAction)stop:(id)sender {
_stopButton.enabled = NO;
_playButton.enabled = YES;
_recordButton.enabled = YES;
if (_audioRecorder.recording)
{
[_audioRecorder stop];
} else if (_audioPlayer.playing) {
[_audioPlayer stop];
}
}
デリゲート メソッドの実装
-(void)audioPlayerDidFinishPlaying:
(AVAudioPlayer *)player successfully:(BOOL)flag
{
_recordButton.enabled = YES;
_stopButton.enabled = NO;
}
-(void)audioPlayerDecodeErrorDidOccur:
(AVAudioPlayer *)player
error:(NSError *)error
{
NSLog(@"Decode Error occurred");
}
-(void)audioRecorderDidFinishRecording:
(AVAudioRecorder *)recorder
successfully:(BOOL)flag
{
}
-(void)audioRecorderEncodeErrorDidOccur:
(AVAudioRecorder *)recorder
error:(NSError *)error
{
NSLog(@"Encode Error occurred");
}
詳細はこちら
マイクとストリーミング オーディオの両方から同時にオーディオを録音しようとしたことはありませんが、前の回答は .m4a ではなく .caf ファイルに録音するものであり、AVAudioSession をセットアップしていないことに気付きました。以前に回答した同様の質問へのリンクを提供すると思いました:
AVAudioSession を設定すると、他のアプリケーション (電話アプリなど) がマイクとスピーカーの制御を取得し、アプリを一時停止できるようになることに注意してください。I use a Record session にリンクしたコードでは、両方のアクティビティを可能にするために、おそらく Playback と Record セッションを使用することをお勧めします。また、Apple からのこのドキュメントで説明されている通知を処理して、アプリが中断されたとき、または制御が返されたときに何が起こるかを処理できます。
これが完全な答えではないことは承知していますが、お役に立てば幸いです。