2013-07-08 12 views
9

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

अब मैं एंड्रॉइड के साथ संगत फ़ाइलों को बनाने और भेजने के लिए ऐप को संशोधित करने की कोशिश कर रहा हूं। मैं इस के लिए मौजूदा AVAudioRecorder कोड संशोधित:

[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; 
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitRateKey]; 
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; 
[settings setValue:[NSNumber numberWithFloat:48000.0] forKey:AVSampleRateKey]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *dirPath = [paths objectAtIndex:0]; 

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"yyyy-MM-dd HH-mm"]; 

NSString *filename = [NSString stringWithFormat:@"%@.aac", [format stringFromDate:NSDate.date]]; 

इस द्वारा बनाई गई फ़ाइलों पर एक मैक खेलने योग्य हैं, iOS उपकरण है, लेकिन किसी Android डिवाइस पर नहीं। यदि फ़ाइल एक्सटेंशन मैन्युअल रूप से ".m4a" में समाप्त हो गया था, तो फ़ाइल एंड्रॉइड पर चलती है।

(".aac" प्रारूप के साथ लाभ यह है कि एप्लिकेशन के पुराने संस्करण इन फ़ाइलों को प्राप्त करने और उन्हें वापस खेल सकते हैं - मैं पश्च संगतता बनाए रखा गया है।)

तो मैं यह बदलाव किया है:

NSString *filename = [NSString stringWithFormat:@"%@.m4a", [format stringFromDate:NSDate.date]]; 

हालांकि, परिणामस्वरूप फ़ाइल (जिसे AVAudioRecorder से कोई त्रुटि नहीं बनाई गई है) मैक पर और आईओएस डिवाइस पर नहीं खेला जा सकता है। और मैं यह सुनकर इंतजार कर रहा हूं कि यह एंड्रॉइड पर काम करता है या नहीं।

AVAudioPlayer कि फ़ाइल को खोलने की कोशिश करता है, यह आउटपुट:

त्रुटि डोमेन = NSOSStatusErrorDomain कोड = +१६८५३४८६७१ "। आपरेशन पूरी नहीं हो सकी (OSStatus त्रुटि 1685348671.)" कोड +१६८५३४८६७१ -> "dta?": फ़ाइल विकृत है, इसके प्रकार की ऑडियो फ़ाइल का मान्य उदाहरण नहीं है, या ऑडियो फ़ाइल के रूप में पहचाना नहीं गया है।

फ़ाइल को केवल ".aac" रखने के लिए नाम बदलकर इस तथ्य को नहीं बदला जाता है कि इसे मैक या आईओएस पर कुछ भी लोड नहीं किया जा सकता है।

अभी, ऐसा लगता है कि ".aac" फ़ाइल बनाने का सबसे अच्छा समाधान होगा, और फिर एंड्रॉइड एंड ".aac" को ".m4a" से प्रतिस्थापित करें और इसे चलाने का प्रयास करें।

प्रश्न 1: क्या किसी को पता है कि फ़ाइल नाम एक्सटेंशन को बदलने से AVAudioPLayer विफल हो सकता है? बीटीडब्ल्यू, ".m4a" फ़ाइल जो मैंने ऊपर बनाई है, मैक पर मेरे पास जो कुछ भी है, उसके साथ खोला नहीं जा सकता है, इसलिए मैं यह नहीं बता सकता कि समस्या फ़ाइल प्रारूप के साथ है या आईओएस या मैक की अक्षमता इस फ़ाइल प्रकार को पढ़ने के लिए है ।

https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2013-24.m4a https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2010-11.aac

प्रश्न 2::

किसी को भी उत्सुक के लिए, मैं एक ".aac" की एक प्रति और AVAudioRecorder से एक ".m4a" फ़ाइल, यहाँ रखा मैं एक के लिए AVAudioRecorder सेट जबकि चैनल, परिणामस्वरूप फ़ाइल स्टीरियो है। क्यूं कर? (कम से कम यही है कि वीएलसी मेटाडेटा के बारे में क्या कहता है)

प्रश्न 3: क्या वैसे भी हानि रहित एन्कोडिंग के लिए एएसी-एलसी निर्दिष्ट करने के लिए है? या क्या मैं केवल ऐसा कर सकता हूं यदि मैं AVAudioRecorder से निम्न स्तर API पर जाता हूं?

+1

यह सहायक है: http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format –

+0

उस प्रश्न पर स्वीकृत उत्तर पूरी तरह से गलत है। फ़ाइल वास्तविक एएसी फ़ाइल नहीं है। यह सिर्फ एक एम 4 ए में लपेटा गया है। अन्य उत्तरों में से एक सही है। यह उत्तर भी अधिक उपयोगी था: http://stackoverflow.com/a/12698691/86020 – mahboudz

उत्तर

8

प्रश्न 1 का उत्तर यह है कि आपको ऑडियो सत्र सही ढंग से सेट करना होगा, अन्यथा m4a फ़ाइल सही रूप से स्वरूपित नहीं होती है।ऑडियो सत्र कोड है कि अब मैं निर्धारित करते हैं, बस से पहले मैं रिकॉर्डिंग शुरू होता है:

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

मैं के बाद रिकॉर्डिंग ताकि ऑडियो फ़ाइलें वापस खेला जा सकता है समाप्त हो गया है सत्र वापस प्लेबैक के लिए निर्धारित किया है।

प्रश्न 2 वीएलसी में एक समस्या है जो चैनलों की गलत संख्या प्रदर्शित कर रहा था। मैकोज़ फाइंडर की गेट इन्फो विंडो में ऑडियो फ़ाइल, एकल चैनल के रूप में दिखाई देती है।

प्रश्न 3 अनुत्तरित है।

+0

mahboubz बिंदु 1 पर महान कॉल ने मेरी समस्या को पूरी तरह से हल किया! –

3

के लिए बना सकते हैं और ऑडियो रिकॉर्ड ".m4a" फ़ाइल है, जो एंड्रॉयड में और साथ ही आईओएस में खेलने में, मैं कोड निम्न का उपयोग करें:

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]; 


AudioRecorder = [[AVAudioRecorder alloc] initWithURL:fileOutPutUrl settings:recordSetting error:nil]; 
[AudioRecorder setDelegate:self]; 
[AudioRecorder recordForDuration:RecordLimitTime]; // Record Limit if require 
if ([AudioRecorder prepareToRecord]) { 
    [AudioRecorder record]; 
} 

एंड्रॉयड पक्ष में, मैं बदलने के लिए की जरूरत नहीं है एंड्रॉइड में केवल ".mp3" फ़ाइल खेलने के लिए कोड "fileName.m4a" से "fileName.mp3" में एक्सटेंशन को बदलें, और यह आश्चर्यजनक रूप से काम करता है। और आईओएस फ़ाइल = "fileName.m4a" में आसानी से खेलें।

संबंधित मुद्दे