আমি কীভাবে আইভিএজে অভিডিওরেকর্ডারের সাথে অডিও রেকর্ড করব?


148

এখন যে আইফোন 3.0 এসডিকে সর্বজনীন, আমি মনে করি আপনারা যারা ইতিমধ্যে 3.0 এসডিকে নিয়ে খেলছেন তাদের জন্য আমি এই প্রশ্নটি জিজ্ঞাসা করতে পারি। আমি আমার অ্যাপ্লিকেশনটিতে অডিও রেকর্ড করতে চাই, তবে আমি AVAudioRecord ব্যবহার করতে চাই না এবং রেকর্ডিংয়ের পুরানো উপায়টি উদাহরণের মতো স্পিকারহির শোয়ের মতো নয়। আইফোন ডেভ সেন্টারে কীভাবে সেরাভাবে করা যায় তার কোনও উদাহরণ নেই এবং কেবলমাত্র ক্লাসগুলির রেফারেন্স। আমি আইফোন বিকাশে একজন নবাগত, তাই আমার শুরু করার জন্য আমি একটি সাধারণ নমুনার সন্ধান করছি। আগাম ধন্যবাদ.

উত্তর:


207

আসলে, এর কোনও উদাহরণ নেই। এখানে আমার কাজের কোড। ব্যবহারকারী ন্যাবারটিতে একটি বোতাম টিপে রেকর্ডিং ট্রিগার করে। রেকর্ডিংয়ে সিডি মানের (44100 নমুনা), স্টেরিও (2 চ্যানেল) লিনিয়ার পিসিএম ব্যবহার করা হয়েছে। সাবধানতা: আপনি যদি অন্য কোনও ফর্ম্যাট ব্যবহার করতে চান, বিশেষত একটি এনকোডযুক্ত, আপনি কীভাবে AVAudioRecord সেটিংস সেট করতে হবে তা নিশ্চিত করুন (অডিও প্রকারের ডকুমেন্টেশন সাবধানে পড়ুন), অন্যথায় আপনি কখনই এটি সঠিকভাবে আরম্ভ করতে সক্ষম হবেন না। আরেকটা জিনিস. কোডটিতে আমি মিটারিং ডেটা কীভাবে পরিচালনা করব তা দেখানো হচ্ছে না তবে আপনি এটি সহজেই বের করতে পারেন। পরিশেষে, নোট করুন যে AVAudioRecorder পদ্ধতি মোছার রেকর্ডিং এই লেখাটি আপনার অ্যাপ্লিকেশনটিকে ক্র্যাশ করে। এই কারণেই আমি ফাইল ম্যানেজারের মাধ্যমে রেকর্ড করা ফাইলটি সরিয়ে দিচ্ছি। রেকর্ডিং হয়ে গেলে, কেভিসির সাহায্যে রেকর্ড করা অডিওটি বর্তমানে সম্পাদিত অবজেক্টে এনএসডিটা হিসাবে সংরক্ষণ করি।

#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]


- (void) startRecording{

UIBarButtonItem *stopButton = [[UIBarButtonItem alloc] initWithTitle:@"Stop" style:UIBarButtonItemStyleBordered  target:self action:@selector(stopRecording)];
self.navigationItem.rightBarButtonItem = stopButton;
[stopButton release];

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err = nil;
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
}
[audioSession setActive:YES error:&err];
err = nil;
if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
}

recordSetting = [[NSMutableDictionary alloc] init];

[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];



// Create a new dated file
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *caldate = [now description];
recorderFilePath = [[NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, caldate] retain];

NSURL *url = [NSURL fileURLWithPath:recorderFilePath];
err = nil;
recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
if(!recorder){
    NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle: @"Warning"
                               message: [err localizedDescription]
                              delegate: nil
                     cancelButtonTitle:@"OK"
                     otherButtonTitles:nil];
    [alert show];
    [alert release];
    return;
}

//prepare to record
[recorder setDelegate:self];
[recorder prepareToRecord];
recorder.meteringEnabled = YES;

BOOL audioHWAvailable = audioSession.inputIsAvailable;
if (! audioHWAvailable) {
    UIAlertView *cantRecordAlert =
    [[UIAlertView alloc] initWithTitle: @"Warning"
                               message: @"Audio input hardware not available"
                              delegate: nil
                     cancelButtonTitle:@"OK"
                     otherButtonTitles:nil];
    [cantRecordAlert show];
    [cantRecordAlert release]; 
    return;
}

// start recording
[recorder recordForDuration:(NSTimeInterval) 10];

}

- (void) stopRecording{

[recorder stop];

NSURL *url = [NSURL fileURLWithPath: recorderFilePath];
NSError *err = nil;
NSData *audioData = [NSData dataWithContentsOfFile:[url path] options: 0 error:&err];
if(!audioData)
    NSLog(@"audio data: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
[editedObject setValue:[NSData dataWithContentsOfURL:url] forKey:editedFieldKey];   

//[recorder deleteRecording];


NSFileManager *fm = [NSFileManager defaultManager];

err = nil;
[fm removeItemAtPath:[url path] error:&err];
if(err)
    NSLog(@"File Manager: %@ %d %@", [err domain], [err code], [[err userInfo] description]);



UIBarButtonItem *startButton = [[UIBarButtonItem alloc] initWithTitle:@"Record" style:UIBarButtonItemStyleBordered  target:self action:@selector(startRecording)];
self.navigationItem.rightBarButtonItem = startButton;
[startButton release];

}

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
{

NSLog (@"audioRecorderDidFinishRecording:successfully:");
// your actions here

}

আমি মনে করি আমি আপনার কোডটি কাজ করার কাছাকাছি এসেছি তবে আমি প্রতিনিধিদের সাথে লড়াই করছি। আমি অবজেক্টিভ সি-তে বেশ নতুন এবং এখনও এর মতো কিছু করার জন্য ডেলিগেটের সঠিক উপায়ে আমার মাথা বাড়েনি। আমার প্রতিনিধিটি এনএসবজেক্ট <অ্যাভিডিওডিওকর্ডার> বাস্তবায়নের চেষ্টা করছে, তবে আমি মনে করি না আমি এটি সঠিকভাবে করছি am প্রতিনিধি কোডটি পোস্ট করা কি খুব বেশি সমস্যা হবে? ধন্যবাদ।
জিম জিম্মারম্যান

আমি অবশেষে এটি আমার প্রতিনিধি শ্রেণি @ প্রোটোকল এভিএডিয়ো রেকর্ডার @ ইফিশনাল - (শূন্য) অডিওরেকর্ডারবেগিন ইনট্রোপশন: (এভিএডিওআকারর্ডার *) রেকর্ডারে যুক্ত করে এটি কাজ করে চলেছি; - (শূন্য) অডিওরেকর্ডারডিডফিনিশ রেকর্ডিং: (AVAudioRecorder *) রেকর্ডার সাফল্যের সাথে: (BOOL) পতাকা; - (অকার্যকর) অডিওরেকর্ডার এনকোডেররডিডোডাকুর: (AVAudioRecorder *) রেকর্ডার ত্রুটি: (এনএসইরর *) ত্রুটি; - (অকার্যকর) অডিওরেকর্ডারঅন্তর্কতা: (AVAudioRecorder *) রেকর্ডার; এটি কাজ করে মনে হচ্ছে, তবে আমি জানি না এটি সর্বোত্তম অনুশীলন কিনা। এখন আমার এটি স্থানীয় ডেটা স্টোর অবিরত রাখা এবং অন্যান্য জিনিসগুলির মধ্যে এটি আবার চালানো দরকার।
জিম জিম্মারম্যান

জিম ঠিক না আপনার রেকর্ডার নিয়ামক শিরোনামে আপনি এমন কিছু করতে চাইবেন ... # আমদানি <AVFoundation / AVFoundation.h> @ আন্তঃফেস রেকর্ডারভিউ কনকন্ট্রোলার: ইউআইভিউকন্ট্রোলার <অ্যাভিএইডিয়ো রেকর্ডারডেলিগেট> d
অদ্ভুত

8
কিছু প্রশ্ন: স্টপ রেকর্ডিংয়ে এডিটডজেক্ট এবং এডিটেডফিল্ডকি। আমাকে কিছু বাতি দিতে পারেন?
র‌্যাপটার

1
@ অলি, তারা কার্যত একই রকম। আমি আমার আসল কোডটি মানিয়ে নিয়েছি যেখানে আমি বর্তমান তারিখটি ব্যবহার করছি না, তাই আমি ইতিমধ্যে আমার কোডটিতে রেকর্ডিংডেটের মতো একটি বিবৃতি পেয়েছিলাম = [এনএসডেটের তারিখ উইথটাইমআইন্টারওয়ালসিন্স নও: লাস্ট ইভেন্ট]। কোড স্নিপেটে আপনি যা দেখেছেন আমি কেবল এটিতে পরিবর্তন করেছি, তবে, অলসতার কারণে আমি বিবৃতিটি নতুন করে
লিখিনি

85

যদিও এটি একটি উত্তরযুক্ত প্রশ্ন (এবং পুরানো ধরণের) আমি অন্যের জন্য আমার সম্পূর্ণ কার্যকরী কোড পোস্ট করার সিদ্ধান্ত নিয়েছি যা ভাল কাজ (বাক্সের বাইরে) বাজানো এবং রেকর্ডিংয়ের উদাহরণ খুঁজে পাওয়া শক্ত করে - যেমন এনকোডযুক্ত, পিসিএম, স্পিকারের মাধ্যমে প্লে সহ এখানে ফাইল লিখুন:

AudioPlayerViewController.h:

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

@interface AudioPlayerViewController : UIViewController {
AVAudioPlayer *audioPlayer;
AVAudioRecorder *audioRecorder;
int recordEncoding;
enum
{
    ENC_AAC = 1,
    ENC_ALAC = 2,
    ENC_IMA4 = 3,
    ENC_ILBC = 4,
    ENC_ULAW = 5,
    ENC_PCM = 6,
} encodingTypes;
}

-(IBAction) startRecording;
-(IBAction) stopRecording;
-(IBAction) playRecording;
-(IBAction) stopPlaying;

@end

AudioPlayerViewController.m:

#import "AudioPlayerViewController.h"

@implementation AudioPlayerViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    recordEncoding = ENC_AAC;
}

-(IBAction) startRecording
{
NSLog(@"startRecording");
[audioRecorder release];
audioRecorder = nil;

// Init audio with record capability
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];

NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] initWithCapacity:10];
if(recordEncoding == ENC_PCM)
{
    [recordSettings setObject:[NSNumber numberWithInt: kAudioFormatLinearPCM] forKey: AVFormatIDKey];
    [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey];
    [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
    [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
    [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];   
}
else
{
    NSNumber *formatObject;

    switch (recordEncoding) {
        case (ENC_AAC): 
            formatObject = [NSNumber numberWithInt: kAudioFormatMPEG4AAC];
            break;
        case (ENC_ALAC):
            formatObject = [NSNumber numberWithInt: kAudioFormatAppleLossless];
            break;
        case (ENC_IMA4):
            formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4];
            break;
        case (ENC_ILBC):
            formatObject = [NSNumber numberWithInt: kAudioFormatiLBC];
            break;
        case (ENC_ULAW):
            formatObject = [NSNumber numberWithInt: kAudioFormatULaw];
            break;
        default:
            formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4];
    }

    [recordSettings setObject:formatObject forKey: AVFormatIDKey];
    [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey];
    [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
    [recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey];
    [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityHigh] forKey: AVEncoderAudioQualityKey];
}

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]];


NSError *error = nil;
audioRecorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error];

if ([audioRecorder prepareToRecord] == YES){
    [audioRecorder record];
}else {
    int errorCode = CFSwapInt32HostToBig ([error code]); 
    NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode); 

}
NSLog(@"recording");
}

-(IBAction) stopRecording
{
NSLog(@"stopRecording");
[audioRecorder stop];
NSLog(@"stopped");
}

-(IBAction) playRecording
{
NSLog(@"playRecording");
// Init audio with playback capability
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]];
NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
audioPlayer.numberOfLoops = 0;
[audioPlayer play];
NSLog(@"playing");
}

-(IBAction) stopPlaying
{
NSLog(@"stopPlaying");
[audioPlayer stop];
NSLog(@"stopped");
}

- (void)dealloc
{
[audioPlayer release];
[audioRecorder release];
[super dealloc];
}

@end

আশা করি এটি আপনার কয়েকজনকে সহায়তা করবে।


হ্যালো, আমি যখন আইফোন সিমুলেটারে শায়বিসি দ্বারা সরবরাহিত দ্বিতীয় কোডটি তৈরি এবং চালিত করি তখন আমি কোনও ফলাফল পাই না তবে কনসোলে এটি দেখায় যে এটি কাজ করছে। আইফোন সিমুলেটরটি কি আমার ল্যাপটপের স্পিকার এবং মাইক্রোফোন ব্যবহার করে বা এটি নিঃশব্দ এবং আমাকে ডিভাইসে অ্যাপটি তৈরি করতে হবে?

1
@ ব্যাটালি আইফোন সিমুলেটরটি আপনার সাউন্ড ফাইলগুলি (এমপিথ্রি / ক্যাফ ...) প্লে করবে এবং সমস্যা আছে যদি আপনার ল্যাপটপ মাইকের মাধ্যমে চিতাবাঘের সিস্টেমের পছন্দগুলি অনুসন্ধান করার চেষ্টা করতে পারে তবে আপনার অ্যাপটি পরীক্ষা করার সর্বোত্তম উপায় হ'ল এটি চালানো run রিয়েল আইডিভাইস এবং আপনার লেখার সমস্ত কোডের জন্য এটি একটি ভাল ধারণা যেহেতু ক্র্যাশের কারণে অ্যাপ্লিকেশন স্টোর থেকে অনেকগুলি অ্যাপ্লিকেশন প্রত্যাখ্যান করা হচ্ছে যেহেতু সত্যিকারের আইডিওয়াইসে কখনও পরীক্ষা করা হয়নি, এমন আরও অনেক বৈশিষ্ট্য রয়েছে যা সিমুলেটর দ্বারা সমর্থিত নয় (ব্লুটুথ, ক্যামেরা, সঠিক মাল্টিটুচ, অ্যাকসিলোমিটার, আইএপি, জিপিএস, এটির চেয়ে আরও ভাল পারফরম্যান্স হবে তখন সবচেয়ে বেশি
আইডাভাইস

[রেকর্ডসেটেটিং সেটঅবজেক্ট: ফর্ম্যাটঅবজেক্ট ফর কে: এভিফোর্ম্যাটআইডি]; এই লাইনটি আমাকে চাবি হিসাবে অ্যাভিফোর্ম্যাটআইডি ব্যবহার করতে দেয় না। কি দেয়? যদি আমি এটির অন্য
মানতে

4
সর্বশেষতম অনুসন্ধানসমূহ, কৌডিওফর্ম্যাট এমপিইজি 4 এএসি-র জন্য, আমরা এভিএএনকোডারবিট্রেটকেকে 12800 এ সেট করতে পারি না the লাইনটি মন্তব্য করুন এবং এটি কার্যকর হবে। এএসি-র সঠিক বিট রেটটি কী হওয়া উচিত তা জানার চেষ্টা করবে।
জো কির্ক

11
আমি মনে করি না আপনি এই বান্ডিলটিতে লিখতে পারেন তাই আমি এই জাতীয় নথিতে লিখি: এনএসআরাই * পাথস = এনএসএস সার্চপ্যাথফোর্ড ডিরেক্টরীসইনডোমাইনস (এনএসডোকামেন্টডাইরেক্টরি, এনএসউজারডোমাইনমাস্ক, ইয়েস); এনএসএসস্ট্রিং * বেসপথ = পাথ [0]; এনএসআরএল * ইউআরএল = [এনএসআরএল ফাইল ইউআরএল উইথপথ: [এনএসএস স্ট্রিং উইথফর্ম্যাট: @ "% @ / রেকর্ডটেষ্ট.caf", বেসপথ]];
মার্ক্সি

14

আমি একটি নমুনা প্রকল্প আপলোড করেছি। আপনি একবার দেখতে পারেন।

সাউন্ড রেকর্ড


কেবলমাত্র যদি আপনি ডাউনলোডটি খুঁজে না পান: উপরের ডানদিকে কোণায় 'ডাউনলোড' এ যান এবং তারপরে 'ডাউনলোড
প্যাকেজগুলি

@ ফিলিবো: এখন সেখানে কিছুই খুঁজে পাচ্ছেন না?
ব্যবহারকারী523234

@ ব্যবহারকারী523234: এখানে ডাউনলোড ইউআরএল - github.com/AvinashP/VoiceRecorder/downloads#download_128004
রাজত

2
নমুনা কোডটি 6 মাস আগে গিথুব ইস্যুতে উল্লিখিত হিসাবে সংকলন করে না।
দেওয়েন

আমি কোডটি ঠিক করেছি এবং গিথুব এ চেক ইন করেছি। এটি এখন কাজ করা উচিত।
অবিনাশ

11

এটি সত্যিই সহায়ক। আমার কেবল সমস্যাটি ছিল রেকর্ডিংয়ের পরে তৈরি করা সাউন্ড ফাইলের আকার। আমার ফাইলের আকার হ্রাস করতে হবে তাই আমি সেটিংসে কিছু পরিবর্তন করেছি।

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:16000.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];

ফাইলের আকার 360kb থেকে হ্রাস পেয়ে মাত্র 25 কেবি (2 সেকেন্ড রেকর্ডিং)।


আপনি কি আপনার বাকী কোডটিও পোস্ট করতে পারেন? কারণ আমি মনে করি আমি কিছুটা মিস করছি। আমি অনেকগুলি সেটিংস পরিবর্তন করার চেষ্টা করেছি তবে ফাইলের আকার হ্রাস করতে পারছি না ..
স্বপ্নিল লুকটুক

1
আমি একটি নমুনা প্রকল্প আপলোড করেছি। আপনি একবার দেখতে পারেন। github.com/AvinashP/VoiceRecorder
অবিনাশ

8

আমি এই কোডটি গত 2 ঘন্টা ধরে কাজ করার চেষ্টা করছি এবং যদিও এটি সিমুলেটারটিতে কোনও ত্রুটি দেখায় নি, ডিভাইসে একটি ছিল।

সক্রিয় হয়, আমার ক্ষেত্রে কমপক্ষে ত্রুটিটি ব্যবহৃত ডিরেক্টরি (বান্ডেল) থেকে এসেছিল:

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]];

এটি লিখনযোগ্য বা এই জাতীয় কিছু ছিল না ... রেডিটোরোকার্ড ব্যর্থ হওয়া ব্যতীত কোনও ত্রুটি ছিল না ...

আমি তাই এটি দ্বারা প্রতিস্থাপন:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *recDir = [paths objectAtIndex:0];
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", recDir]]

এটি এখন একটি কবজির মতো কাজ করে।

আশা করি এটি অন্যকে সহায়তা করবে।


1
আপনার রিসোর্স ফোল্ডারে লেখার অনুমতি নেই
সৌরভ

6

@ মাসিমো কাফেরো এবং শ্যাবসি-কে ধন্যবাদ ধন্যবাদ আমি নীচের কাজগুলি অর্জন করতে সক্ষম হয়েছি

আইওএস 8 এ:

অডিও রেকর্ড করুন এবং সংরক্ষণ করুন

সংরক্ষিত রেকর্ডিং খেলুন

1. আপনার প্রকল্পে "AVFoundation.framework" যুক্ত করুন

ইন .h ফাইল

আমদানির বিবৃতি 'AVFoundation / AVFoundation.h' এর নীচে যুক্ত করুন।

3. "AVAudioRecorderDelegate" ডেফাইন

4. রেকর্ড, প্লে বোতাম এবং তাদের ক্রিয়া methids সঙ্গে একটি বিন্যাস তৈরি করুন

ডিফাইন রেকর্ডার এবং প্লেয়ার ইত্যাদি

এখানে সম্পূর্ণ উদাহরণ কোড যা আপনাকে সাহায্য করতে পারে।

ViewController.h

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

@interface ViewController : UIViewController <AVAudioRecorderDelegate>

@property(nonatomic,strong) AVAudioRecorder *recorder;
@property(nonatomic,strong) NSMutableDictionary *recorderSettings;
@property(nonatomic,strong) NSString *recorderFilePath;
@property(nonatomic,strong) AVAudioPlayer *audioPlayer;
@property(nonatomic,strong) NSString *audioFileName;

- (IBAction)startRecording:(id)sender;
- (IBAction)stopRecording:(id)sender;

- (IBAction)startPlaying:(id)sender;
- (IBAction)stopPlaying:(id)sender;

@end

তারপরে কাজটি করুন

ViewController.m

#import "ViewController.h"

#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]

@interface ViewController ()
@end

@implementation ViewController

@synthesize recorder,recorderSettings,recorderFilePath;
@synthesize audioPlayer,audioFileName;


#pragma mark - View Controller Life cycle methods
- (void)viewDidLoad
{
    [super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


#pragma mark - Audio Recording
- (IBAction)startRecording:(id)sender
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *err = nil;
    [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
    if(err)
    {
        NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
        return;
    }
    [audioSession setActive:YES error:&err];
    err = nil;
    if(err)
    {
        NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
        return;
    }
    
    recorderSettings = [[NSMutableDictionary alloc] init];
    [recorderSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
    [recorderSettings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recorderSettings setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
    [recorderSettings setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
    [recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
    
    // Create a new audio file
    audioFileName = @"recordingTestFile";
    recorderFilePath = [NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, audioFileName] ;
    
    NSURL *url = [NSURL fileURLWithPath:recorderFilePath];
    err = nil;
    recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recorderSettings error:&err];
    if(!recorder){
        NSLog(@"recorder: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
        UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle: @"Warning" message: [err localizedDescription] delegate: nil
                         cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        return;
    }
    
    //prepare to record
    [recorder setDelegate:self];
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    
    BOOL audioHWAvailable = audioSession.inputIsAvailable;
    if (! audioHWAvailable) {
        UIAlertView *cantRecordAlert =
        [[UIAlertView alloc] initWithTitle: @"Warning"message: @"Audio input hardware not available"
                                  delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [cantRecordAlert show];
        return;
    }
    
    // start recording
    [recorder recordForDuration:(NSTimeInterval) 60];//Maximum recording time : 60 seconds default
    NSLog(@"Recroding Started");
}

- (IBAction)stopRecording:(id)sender
{
    [recorder stop];
    NSLog(@"Recording Stopped");
}

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


#pragma mark - Audio Playing
- (IBAction)startPlaying:(id)sender
{
    NSLog(@"playRecording");
    
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
    
     NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, audioFileName]];
    NSError *error;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = 0;
    [audioPlayer play];
    NSLog(@"playing");
}
- (IBAction)stopPlaying:(id)sender
{
    [audioPlayer stop];
    NSLog(@"stopped");
}

@end

এখানে চিত্র বর্ণনা লিখুন


2
This is from Multimedia programming guide...

- (IBAction) recordOrStop: (id) sender {
if (recording) {
    [soundRecorder stop];
    recording = NO;
    self.soundRecorder = nil;
    [recordOrStopButton setTitle: @"Record" forState:
     UIControlStateNormal];
    [recordOrStopButton setTitle: @"Record" forState:
     UIControlStateHighlighted];
    [[AVAudioSession sharedInstance] setActive: NO error:nil];
} 
else {
    [[AVAudioSession sharedInstance]
     setCategory: AVAudioSessionCategoryRecord
     error: nil];
    NSDictionary *recordSettings =
    [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
     [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
     [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
     [NSNumber numberWithInt: AVAudioQualityMax],
     AVEncoderAudioQualityKey,
     nil];
    AVAudioRecorder *newRecorder =
    [[AVAudioRecorder alloc] initWithURL: soundFileURL
                                settings: recordSettings
                                   error: nil];
    [recordSettings release];
    self.soundRecorder = newRecorder;
    [newRecorder release];
    soundRecorder.delegate = self;
    [soundRecorder prepareToRecord];
    [soundRecorder record];
    [recordOrStopButton setTitle: @"Stop" forState: UIControlStateNormal];
    [recordOrStopButton setTitle: @"Stop" forState: UIControlStateHighlighted];
    recording = YES;
}
}

2

নীচের লিঙ্কে আপনি এভিএডিয়ো রেকর্ডিংয়ের সাথে রেকর্ডিং সম্পর্কে দরকারী তথ্য পেতে পারেন। "লিংক অডিও" প্রথম অংশের এই লিঙ্কটিতে একটি অ্যাঙ্কর রয়েছে "AVAudioRecorder ক্লাসের সাথে রেকর্ডিং"। এটি আপনাকে উদাহরণের দিকে নিয়ে যায়।

অডিওভিডিও কনসেপ্টুয়াল মাল্টিমিডিয়াপিজি


2

ঠিক আছে সুতরাং আমি যে উত্তর পেয়েছি তা আমাকে সঠিক দিকে সাহায্য করেছে এবং আমি খুব কৃতজ্ঞ। এটি আমাকে আইফোনে কীভাবে রেকর্ড করতে পারে তা নির্ধারণ করতে সহায়তা করেছিল, তবে আমি ভেবেছিলাম আইফোন রেফারেন্স লাইব্রেরি থেকে পাওয়া কিছু সহায়ক কোডও আমি অন্তর্ভুক্ত করব:

AudioandVideoTechnologies

আমি এই কোডটি ব্যবহার করেছি এবং মোটামুটি সহজেই এটিটিউচ উদাহরণে যুক্ত করেছি। উপরের কোড নমুনা এবং রেফারেন্স লাইব্রেরি থেকে নমুনা সহ, আমি এটি বেশ ভাল কাজ করতে সক্ষম হয়েছি।


2

অডিও সেটিং নীচে wav ফর্ম্যাট জন্য

NSDictionary *audioSetting = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithFloat:44100.0],AVSampleRateKey,
                              [NSNumber numberWithInt:2],AVNumberOfChannelsKey,
                              [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                              [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
                              [NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, 
                              [NSNumber numberWithBool:0], AVLinearPCMIsBigEndianKey,
                              [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
                              [NSData data], AVChannelLayoutKey, nil];

রেফ: http://objective-audio.jp/2010/09/avassetreaderavassetwriter.html


ধন্যবাদ ভাই, এটি let recordSettings:[String:AnyObject] = [ AVFormatIDKey:Int(kAudioFormatLinearPCM), AVLinearPCMIsFloatKey:false, AVLinearPCMIsBigEndianKey:0, AVLinearPCMIsNonInterleaved:false, AVSampleRateKey:44100.0, AVNumberOfChannelsKey:2, AVEncoderBitRateKey:12800, AVLinearPCMBitDepthKey:16, AVEncoderAudioQualityKey:AVAudioQuality.Max.rawValue]
সুইফটে

0

শুরু

NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);

NSError *error = nil;
NSString *filename = [NSString stringWithFormat:@"%@.caf",FILENAME];
NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:filename];
NSURL *soundFileURL = [NSURL fileURLWithPath:path];


NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
                                [NSNumber numberWithInt:AVAudioQualityMedium],AVEncoderAudioQualityKey,
                                [NSNumber numberWithInt:AVAudioQualityMedium], AVSampleRateConverterAudioQualityKey,
                                [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
                                [NSNumber numberWithFloat:22050.0],AVSampleRateKey,
                                nil];

AVAudioRecorder *audioRecorder = [[AVAudioRecorder alloc]
                 initWithURL:soundFileURL
                 settings:recordSettings
                 error:&error];


if (!error && [audioRecorder prepareToRecord])
{
    [audioRecorder record];
}

বন্ধ

[audioRecorder stop];
[audioRecorder release];
audioRecorder = nil;

আমি মনে করি
অপ্টিমাল

0
-(void)viewDidLoad {
 // Setup audio session
    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)btnRecordDidClicked:(UIButton *)sender {
        if (player1.playing) {
            [player1 stop];
        }

        if (!recorder.recording) {
            AVAudioSession *session = [AVAudioSession sharedInstance];
            [session setActive:YES error:nil];

            // Start recording
            [recorder record];
            [_recordTapped setTitle:@"Pause" forState:UIControlStateNormal];

        } else {

            // Pause recording
            [recorder pause];
            [_recordTapped setTitle:@"Record" forState:UIControlStateNormal];
        }

        [_stopTapped setEnabled:YES];
        [_playTapped setEnabled:NO];

    }

    - (IBAction)btnPlayDidClicked:(UIButton *)sender {
        if (!recorder.recording){
            player1 = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil];
            [player1 setDelegate:self];
            [player1 play];
        }
    }

    - (IBAction)btnStopDidClicked:(UIButton *)sender {
        [recorder stop];
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        [audioSession setActive:NO error:nil];
    }

    - (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder successfully:(BOOL)flag{
        [_recordTapped setTitle:@"play" forState:UIControlStateNormal];

        [_stopTapped setEnabled:NO];
        [_playTapped setEnabled:YES];

    }

-1

উপরের উত্তর অনুসারে, আমি কিছু পরিবর্তন করেছি এবং আমি সঠিক আউটপুট পেয়েছি।

পদক্ষেপ 1: "inf.plist" এর অধীনে মাইক্রোফোন ব্যবহারের অনুমতিগুলি যোগ করুন ==>

  <key>NSMicrophoneUsageDescription</key>
  <string>${PRODUCT_NAME} Microphone Usage</string>

ধাপ ২:

  1. স্থানীয় ডকুমেন্ট ডিরেক্টরিতে রেকর্ড অডিও ফাইল সংরক্ষণ করুন

  2. প্লে / রেকর্ডিং বন্ধ করুন

  3. সংরক্ষিত অডিও ফাইলের সময়কাল পান

সোর্স কোডটি এখানে। একবার দেখুন এবং এটি ব্যবহার করুন।

ViewController.h

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

@interface ViewController : UIViewController{
AVAudioPlayer *audioPlayer;
AVAudioRecorder *audioRecorder;
}

-(IBAction) startRecording;
-(IBAction) stopRecording;
-(IBAction) playRecording;
-(IBAction) stopPlaying;

@end

ViewController.m

#import "ViewController.h"
@interface ViewController () <AVAudioRecorderDelegate, AVAudioPlayerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

-(IBAction) startRecording{
// Setup audio session
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err = nil;
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
if(err)
{
    NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
    return;
}
[audioSession setActive:YES error:&err];
err = nil;
if(err)
{
    NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
    return;
}
AVAudioSessionRecordPermission permissionStatus = [audioSession recordPermission];
switch (permissionStatus) {
    case AVAudioSessionRecordPermissionUndetermined:{
        [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
            // CALL YOUR METHOD HERE - as this assumes being called only once from user interacting with permission alert!
            if (granted) {
                // Microphone enabled code
                NSLog(@"Mic permission granted.  Call method for granted stuff.");
                [self startRecordingAudioSound];
            }
            else {
                // Microphone disabled code
                NSLog(@"Mic permission indeterminate. Call method for indeterminate stuff.");
                //        UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
            }
        }];
        break;
    }
    case AVAudioSessionRecordPermissionDenied:
        // direct to settings...
        NSLog(@"Mic permission denied. Call method for denied stuff.");

        break;
    case AVAudioSessionRecordPermissionGranted:
        // mic access ok...
        NSLog(@"Mic permission granted.  Call method for granted stuff.");
        [self startRecordingAudioSound];
        break;
    default:
        // this should not happen.. maybe throw an exception.
        break;
}
}

#pragma mark - Audio Recording
- (BOOL)startRecordingAudioSound{
NSError *error = nil;
NSMutableDictionary *recorderSettings = [[NSMutableDictionary alloc] init];
[recorderSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[recorderSettings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recorderSettings setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
[recorderSettings setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];

// Create a new audio file
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath_ = [searchPaths objectAtIndex: 0];
NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[self dateString]];
NSLog(@"the path is %@",pathToSave);

// File URL
NSURL *url = [NSURL fileURLWithPath:pathToSave];//FILEPATH];

//Save recording path to preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setURL:url forKey:@"Test1"];
[prefs synchronize];

audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:recorderSettings error:&error];
if (!audioRecorder)
{
    NSLog(@"Error establishing recorder: %@", error.localizedFailureReason);
    return NO;
}

// Initialize degate, metering, etc.
audioRecorder.delegate = self;
audioRecorder.meteringEnabled = YES;
//self.title = @"0:00";

if (![audioRecorder prepareToRecord])
{
    NSLog(@"Error: Prepare to record failed");
    //[self say:@"Error while preparing recording"];
    return NO;
}

if (![audioRecorder record])
{
    NSLog(@"Error: Record failed");
    //  [self say:@"Error while attempting to record audio"];
    return NO;
}
NSLog(@"Recroding Started");
return YES;
}

#pragma mark - AVAudioRecorderDelegate
- (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder successfully:(BOOL)flag{
NSLog (@"audioRecorderDidFinishRecording:successfully:");
}

#pragma mark - AVAudioPlayerDelegate
- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
NSLog (@"audioPlayerDidFinishPlaying:successfully:");
}

- (NSString *) dateString {
// return a formatted string for a file name
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"ddMMMYY_hhmmssa";
return [[formatter stringFromDate:[NSDate date]]stringByAppendingString:@".aif"];
}

-(IBAction) stopRecording{
NSLog(@"stopRecording");
[audioRecorder stop];
NSLog(@"stopped");
}

-(IBAction) playRecording{
//Load recording path from preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSURL *temporaryRecFile = [prefs URLForKey:@"Test1"];

//Get Duration of Audio File
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:temporaryRecFile options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
NSLog(@"Duration Of Audio: %f", audioDurationSeconds);

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];
audioPlayer.delegate = self;
[audioPlayer setNumberOfLoops:0];
audioPlayer.volume = 1;
[audioPlayer prepareToPlay];
[audioPlayer play];
NSLog(@"playing");
}

-(IBAction) stopPlaying{
NSLog(@"stopPlaying");
[audioPlayer stop];
NSLog(@"stopped");
 }

 @end

ব্যবহার করবেন না -[NSUserDefaults synchronize]। থেকে অ্যাপলের ডকুমেন্টেশন "এই পদ্ধতি অপ্রয়োজনীয় এবং ব্যবহার করা উচিত নয়।"
অ্যাশলে মিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.