2012-08-28 19 views
10

मैं AVAudioRecorder का उपयोग कर डिवाइस पर ऑडियो रिकॉर्ड करने की कोशिश कर रहा हूं। वह फ़ाइल किसी वेब सर्वर पर प्रेषित होती है और मैं उस परिणामस्वरूप फ़ाइल को वेब ब्राउज़र में खेलना चाहता हूं ..AVAudioRecorder रिकॉर्ड एएसी/एम 4 ए

मैंने डिवाइस पर सेटिंग्स के विभिन्न संयोजनों को आजमाया है ... फ़ाइल को सही एएसी प्रारूप में एन्कोड करने के लिए कुछ भी नहीं लगता है ।

क्विकटाइम कहता है कि यह नहीं जानता कि यह फ़ाइल कैसे खेलें।

नमूना कोड

private void InitializeRecordingSession() { 
     string fileName = string.Format("{0}.m4a", Guid.NewGuid()); 
     string tmpdir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/audio"; 
      if (!Directory.Exists(tmpdir)) 
       Directory.CreateDirectory(tmpdir); 
      audioFilePath = Path.Combine(tmpdir, fileName); 

      Console.WriteLine("Audio File Path: " + audioFilePath); 

      var url = NSUrl.FromFilename(audioFilePath); 
      var settings = new AVAudioRecorderSettings() { 
       AudioFormat = AudioFormatType.MPEG4AAC, 
       SampleRate = 44100, 
       NumberChannels = 1, 
       AudioQuality = AVAudioQuality.High,  
      }; 

      recorder = AVAudioRecorder.ToUrl(url, settings, out error); 

      //Set Recorder to Prepare To Record 
      recorder.PrepareToRecord(); 
    } 

संपादित -by लाइन

recorder = AVAudioRecorder.ToUrl(url, settings, out error); 

सब कुछ पहले काम में इस कोड डाल।

NSError error;  
AVAudioSession audioSession = AVAudioSession.SharedInstance(); 
audioSession.SetCategory(AVAudioSession.CategoryRecord, out error); 
audioSession.SetActive(true, out error); 
+0

। – justinkoh

उत्तर

6

आईओएस एसडीके स्पष्ट रूप से बेवकूफ है। स्वरूप आईडी कुंजी को kAudioFormatMPEG4AAC पर सेट करना वास्तव में फ़ाइल को एन्कोड करने के लिए पर्याप्त नहीं है; क्विकटाइम में यह खेलेंगे लेकिन इसकी संपत्तियों में आप केवल AAC देखेंगे और कोई और विवरण नहीं देंगे। m4a पर आउटपुट फ़ाइल एक्सटेंशन को बदलने से चाल चलने में मदद मिलनी चाहिए और इसे सही एन्कोडिंग लागू करना चाहिए।

+0

मुझे पूरा यकीन है कि मैंने कोशिश की और यह काम नहीं किया। लेकिन मैं इसे फिर से कोशिश करूंगा। –

+0

यह अभी भी काम नहीं कर रहा है "यह एक फ़ाइल नहीं है जो क्विकटाइम समझती है" –

+0

मुझे डर है कि यह विधि मेरे लिए भी काम नहीं करती है। – justinkoh

30

हार्डवेयर-त्वरित एन्कोडर्स के लिए, किसी भी समय केवल एक सत्र सक्रिय हो सकता है। इसका मतलब है कि, एएसी के लिए, यह सिम्युलेटर (जहां एक सॉफ्टवेयर एन्कोडर का उपयोग किया जाता है) में काम करेगा, लेकिन डिवाइस पर असफल हो सकता है (जहां एक हार्डवेयर एन्कोडर का उपयोग किया जाता है) जब तक कि आपका ऐप AVAudioSession सक्रिय नहीं करता है।

मैं भी एएसी एन्कोडेड प्रारूप में ऑडियो रिकॉर्ड करने के लिए AVAudioRecorder का उपयोग करने का प्रयास कर रहा था, विशेष रूप से .m4a फ़ाइल में। मेरे पास ऐसा करने का एक जानवर था। मैं कोर ऑडियो फ़ाइल (.caf) के अंदर एएसी को रिकॉर्ड करने के लिए कोड प्राप्त करने में सक्षम था, लेकिन मुझे AVAudioRecorder को .m4a को ठीक से प्रारूपित करने के लिए नहीं मिला। मैं निचले स्तर के ऑडियो यूनिट्स एपीआई का उपयोग करके अपने आवेदन में रिकॉर्डिंग कोड को फिर से लिखने वाला था, लेकिन इसके बजाय मैंने इसे बैक बर्नर पर रखा और साझा ऑडियो सत्र को संभालने के लिए कोड में जोड़ा। एक बार यह स्थापित हो जाने के बाद, मैं वापस गया और एक .m4a के रूप में सहेजने की कोशिश की और यह अभी काम किया।

[recorder stop]; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation; 
[session setActive:NO withFlags:flags error:nil]; 

फिर 'tmpFileUrl' पर फ़ाइल कृपया आप के रूप में इस्तेमाल किया जा सकता:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSURL *tmpFileUrl = [NSURL fileURLWithPath:[docsDir stringByAppendingPathComponent:@"tmp.m4a"]]; 
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
         [NSNumber numberWithFloat:16000.0], AVSampleRateKey, 
         [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, 
         nil]; 
NSError *error = nil; 
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:tmpFileUrl settings:recordSettings error:&error]; 
[recorder prepareToRecord]; 

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryRecord error:nil]; 
[session setActive:YES error:nil]; 

[recorder record]; 

फिर रिकॉर्डिंग मैं प्रयोग किया जाता समाप्त करने के लिए:

यहाँ कुछ उदाहरण कोड है।

+1

यह अनगिनत बार उठाया जाना चाहिए! – mahboudz

+0

कमाल का जवाब। धन्यवाद यह मुझे बहुत समय बचाया! –

3

संकेत AVAudioSession के बारे में संकेत बहुत उपयोगी हैं!

setActive:withFlags:error: के बाद से, iOS 6.0 में पदावनत हो गई है ऑडियो सत्र को रोकने के लिए कोड के लिए समायोजित किया जाना चाहिए: अगर आप इस का हल के रूप में मैं एक ही समस्या का सामना करना पड़ा मिल गया है मैं सोच रहा हूँ

AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation; 
[session setActive:NO withOptions:flags error:nil]; 
संबंधित मुद्दे