Can not play .m4a file in safari that is recorded in iOS application - avaudiorecorder

I am having application in which i need to record audio and than upload it on the server and mail the link of the file to the user.
Now when I try to open the mail in mac or windows it works fine and i can hear the audio. But when i try to open the link in iPhone or iPad it won't play in it.
While i had a demo application made for the project and when i try the same thing, it worked.
Please help me out.
Thank you in advance.
NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
if ([txt_RecordingName.text isEqualToString:#"Untitled"])
{
strFileName = [NSString stringWithFormat:#"Recording %d.m4a",[appDelegate.db getMaxId]];
soundFilePath = [docsDir stringByAppendingPathComponent:strFileName];
}
else
{
strFileName = [NSString stringWithFormat:#"%#.m4a",txt_RecordingName.text];
soundFilePath = [docsDir stringByAppendingPathComponent:strFileName];
}
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[NSNumber numberWithFloat:16000.0], AVSampleRateKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
nil];
newURL = [NSURL fileURLWithPath:soundFilePath];
audioRecorder = [[AVAudioRecorder alloc]
initWithURL:newURL
settings:recordSettings
error:nil];
audioRecorder.delegate = self;
[audioRecorder prepareToRecord];
if (!audioRecorder.recording)
{
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
[session setActive:YES error:nil];
[audioRecorder record];
counter = 0;
[btnPauseRecord setEnabled:TRUE];
}
recordingTime = -1;
[self showRecordingTime];
[lbl_Recording setHidden:NO];
[lbl_PressToStop setText:#"Press to pause"];
[lbl_PressToStop setHidden:NO];
[lbl_ListenToRecording setHidden:YES];
[lbl_RecordingAgain setHidden:YES];
[btn_ListenToRecording setHidden:YES];
[btn_RecordAgain setHidden:YES];
txt_RecordingName.text = strFileName;
}
else
{
[audioRecorder stop];
audioRecorder = nil;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:NO error:nil];
isRecording = FALSE;
[btnPauseRecord setEnabled:FALSE];
[txt_RecordingName setEnabled:TRUE];
isPaused = TRUE;
[lbl_Recording setHidden:YES];
[lbl_Save setHidden:NO];
[btn_Save setHidden:NO];
[lbl_ListenToRecording setHidden:NO];
lbl_ListenToRecording.text = #"Listen to Recording";
[lbl_RecordingAgain setHidden:NO];
[btn_ListenToRecording setHidden:NO];
[btn_RecordAgain setHidden:NO];
lbl_PressToStop.text = #"Press to resume";
[lblPauseRecord setHidden:YES];
[btnPauseRecord setHidden:YES];
}

Related

How to record audio in objective c for iphone app in .amr format?

I have used following code to record audio. It works perfectly for .caf format.
dirPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex: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];
But for .amr if i change extension to .amr as per below it is not working for me to record audio.
NSString *soundFilePath = [docsDir
stringByAppendingPathComponent:#"sound.amr"];
can any body guide me how to record and save audio in .amr format?
try below Code, might be useful to you..
AppDelegate *del = (AppDelegate*)[[UIApplication sharedApplication]delegate];
//set path & name for Recording Audio
NSString *dataPath=[del.path_Folder_Document copy];
NSString *filePath = [NSString stringWithFormat:#"%#/Images_Audio/%#.3gp", dataPath,[ARR_Img_File_Name_Moment objectAtIndex:pos]];
NSLog(#"Audio File Path =%#",filePath);
NSURL *tmpFileUrl = [NSURL fileURLWithPath:filePath];
//set Record Setting
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[NSNumber numberWithFloat:8000.0], AVSampleRateKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
nil];
NSError *error = nil;
//Prepare Recorder to Start Recording Audio
recorder = [[AVAudioRecorder alloc] initWithURL:tmpFileUrl settings:recordSettings error:&error];
recorder.delegate = self;
[recorder prepareToRecord];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
[session setActive:YES error:nil];
//Start Recording Audio ..
if ([[NSFileManager defaultManager] isWritableFileAtPath:filePath]) {
NSLog(#"Writable Pathforimage_Audio 1st>> %#", filePath);
}else
{
NSLog(#"Not Writable");
}
[recorder record];
NSLog(#"its recording audio...");

Recording voice is not working

In my app, I want to record voice and send via email. I am recording voice and once I click the attach button, it throws me the following error. It seems voice is not recorded.
Here is my code snippet
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *pathComponents = [NSArray arrayWithObjects:
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],
#"MyAudioMemo.m4a",
nil];
NSURL *outputFileURL = [NSURL fileURLWithPathComponents:pathComponents];
NSLog(#"%#",outputFileURL);
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
// Define the recorder setting
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
// Initiate and prepare the recorder
recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:NULL];
recorder.delegate = self;
recorder.meteringEnabled = YES;
[recorder prepareToRecord];
}
- (IBAction)microButton:(id)sender {
if(counter%2==0)
{
if (!recorder.recording) {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
// Start recording
[recorder record];
}
counter=counter+1;
}
else{
[recorder stop];
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setActive:NO error:nil];
counter=counter+1;
}
}
- (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder successfully:(BOOL)flag{
NSLog(#"audioPlayerDidFinishPlaying");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: #"Done" message: #"Voice recorded successfully!"delegate: nil cancelButtonTitle:#"OK"otherButtonTitles:nil];
[alert show];
}
- (IBAction)attachBtn:(id)sender {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *URL = [documentsDirectory stringByAppendingPathComponent:#"MyAudioMemo.m4a"];
NSString* someText = #"Voice";
NSURL *urlToShare = [NSURL fileURLWithPath:URL isDirectory:NO];
NSArray* dataToShare = #[someText, urlToShare];
UIActivityViewController* activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:dataToShare
applicationActivities:nil];
activityViewController.excludedActivityTypes = #[UIActivityTypePrint,UIActivityTypeCopyToPasteboard,UIActivityTypeAssignToContact];
activityViewController.popoverPresentationController.barButtonItem = (UIBarButtonItem *)sender;
activityViewController.completionHandler = ^(NSString *activityType, BOOL completed) {
//if (completed) {
[self dismissViewControllerAnimated:YES completion:nil];
//}
};
[self presentViewController:activityViewController animated:YES completion:nil];
}
Assuming this is on an iPad, when you present the UIActivityViewController, it will be shown in a popover. You need to do what the message states, set either the sourceView or the barButtonItem.
activityViewController.popoverPresentationController.barButtonItem = sender;
That assumes sender is a UIBarButtonItem. If it's a UIButton or other view, use:
activityViewController.popoverPresentationController.sourceView = sender;

Recording Audio And Video at same Time in ios

I have to start recorder first which will record the audio during that i need to record video from camera as well.
Code for audio Recording
NSArray *pathComponents = [NSArray arrayWithObjects:
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],
#"MyAudioMemo.m4a",
nil];
NSURL *outputFileURL = [NSURL fileURLWithPathComponents:pathComponents];
// Setup audio session
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
// Define the recorder setting
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
// Initiate and prepare the recorder
recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:nil];
recorder.delegate = self;
recorder.meteringEnabled = YES;
[recorder prepareToRecord];
[recorder record];
code for video recording
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[picker dismissViewControllerAnimated:YES completion:^
{
if(_isVideo)
{
NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
_imageData = [NSData dataWithContentsOfURL:videoURL];
[picker dismissViewControllerAnimated:YES completion:nil];
[ self saveVideo];
}
}];
}
-(void)saveVideo
{
if(_isVideo)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSDateFormatter *formatter;
NSString *dateString;
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:#"dd-MM-yyyy HH:mm:ss"];
dateString = [formatter stringFromDate:[NSDate date]];
NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:#"/%#/%#/%#.mp4",_folderName,#"Videos",dateString]];
NSError * error = nil;
NSString *pathVideoThumb = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:#"/%#/%#/%#",_folderName,#"VideoThumb",dateString]];
[_imageData writeToFile:path options:NSDataWritingAtomic error:&error];
if (error != nil)
{
NSLog(#"Error: %#", error);
return;
}
[self generateThumbImage:pathVideoThumb dataPath:path];
dispatch_async(dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView:self.view animated:YES];
_isVideo=NO;
videoCount++;
[videoLabel setText:[NSString stringWithFormat:#"%d %#",videoCount,#"VIDEOS"]];
[videoView setBackgroundColor:[UIColor clearColor]];
});
});
}
}
But when i play the recorded Video it does not contain any sound. The recorded audio is working fine ,I understand that the problem is with the audio session ,Please guide me how should i use audio session to handle this.
Thanks

ios - Recording Audio After VIdeo play

I can't record audio after playing a video, if I record before playing the video no problem but then I have to close the application to record again.
I can't record audio after playing a video, if I record before playing the video no problem but then I have to close the application to record again.
Record Audio:
- (IBAction)recordAudio:(id)sender {
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];
}
if (!_audioRecorder.recording)
{
_playButton.enabled = NO;
_stopButton.enabled = YES;
[_audioRecorder record];
}
}
Do this before recording the Audio:
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];

iOS, no recording sound in my iPad, in the simulator works fine

Hi I have a very strange problem in the simulator works perfect but when I charge the app to the iPad it does not work. Any idea?
Here I create all the variables to make it work.
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex: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];
}
}
I have some buttons for record, play and stop. So these are the codes for all of them.
-(void) recordAudio{
if (!audioRecorder.recording){
recordButton.enabled = NO;
playButton.enabled = NO;
saveButton.enabled = NO;
stopButton.enabled = YES;
[audioRecorder record];
}
}
-(void)stop{
recordButton.enabled = YES;
playButton.enabled = YES;
saveButton.enabled = YES;
stopButton.enabled = NO;
if (audioRecorder.recording){
[audioRecorder stop];
}
else if (audioPlayer.playing){
[audioPlayer stop];
}
}
-(void) playAudio{
if (!audioRecorder.recording){
recordButton.enabled = NO;
stopButton.enabled = YES;
saveButton.enabled = NO;
if (audioPlayer)
audioPlayer=nil;
NSError *error;
audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:audioRecorder.url
error:&error];
audioPlayer.delegate = self;
if (error)
NSLog(#"Error: %#", [error localizedDescription]);
else
[audioPlayer play];
}
}
finally I found a solution. To my previous code I add this lines inside the ViewdidLoad.
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];
[audioSession setActive:YES error: &error];
and for the settings I added this:
[NSNumber numberWithInt:kAudioFormatAppleIMA4], AVFormatIDKey
I copy the code from http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1 and the idea of using AVAudioSession came from How to record and play sound in iPhone app?
If you need the complete code is this one.
- (void)viewDidLoad {
[super viewDidLoad];
NSError *error = nil;
AVAudioSession * audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];
[audioSession setActive:YES error: &error];
playButton.enabled = NO;
stopButton.enabled = NO;
saveButton.enabled = NO;
NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
docsDir = [HSAudioController pathToDocumentsFolder];
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:#"sound.caf"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatAppleIMA4], AVFormatIDKey,
[NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey,
[NSNumber numberWithInt:16], AVEncoderBitRateKey,
[NSNumber numberWithInt: 2], AVNumberOfChannelsKey,
[NSNumber numberWithFloat:44100.0], AVSampleRateKey,
nil];
audioRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL
settings:recordSettings
error:&error];
NSLog(#"%#",audioRecorder.url);
if (error)
{
NSLog(#"error: %#", [error localizedDescription]);
} else {
[audioRecorder prepareToRecord];
}
}

Resources