ऑडियो इनपुट शेयर किया जा रहा है

ऑडियो इनपुट आम तौर पर, बिल्ट-इन माइक, बाहरी माइक या डिवाइस से जुड़ा ऑडियो इंटरफ़ेस. ऑडियो इनपुट यहां से भी मिल सकता है फ़ोन पर बातचीत शुरू की है.

कभी-कभी दो या दो से ज़्यादा ऐप्लिकेशन, दोनों को "कैप्चर" करने की ज़रूरत हो सकती है एक ही ऑडियो इनपुट. ऐसा हो सकता है कि दर्शक अलग-अलग टास्क कर रहे हों. उदाहरण के लिए, ऑडियो पाने वाले कुछ ऐप्लिकेशन "रिकॉर्डिंग" हो सकते हैं. जैसे कि कोई आवाज़ रिकॉर्ड करने की सुविधा. जबकि दूसरे ऐप्लिकेशन "सुन रहे हों", जैसे कि Google Assistant या कोई सुलभता सेवा, बोलकर दिए जाने वाले निर्देशों का जवाब दे सकता है.

दोनों ही मामलों में, ये ऐप्लिकेशन ऑडियो इनपुट पाना चाहेंगे. इस पूरे पेज में, हम "कैप्चर करें" शब्द का इस्तेमाल करते हैं भले ही ऐप रिकॉर्ड कर रहा है या सिर्फ़ सुन रहा है.

अगर दो या दो से ज़्यादा ऐप्लिकेशन एक साथ ऑडियो कैप्चर करना चाहते हैं, तो कोई समस्या हो सकती है इससे उन सभी को एक ही सोर्स से ऑडियो सिग्नल मिल जाते हैं. इस पेज में बताया गया है कि जानें कि Android सिस्टम, ऑडियो कैप्चर करने वाले कई ऐप्लिकेशन के बीच ऑडियो इनपुट कैसे शेयर करता है.

Android 10 से पहले की परफ़ॉर्मेंस

Android 10 से पहले, इनपुट ऑडियो स्ट्रीम को सिर्फ़ एक ऐप्लिकेशन से समय. अगर कोई ऐप्लिकेशन पहले से ही ऑडियो रिकॉर्ड कर रहा था या सुन रहा था, तो आपका ऐप्लिकेशन AudioRecord ऑब्जेक्ट बनाता है, लेकिन कॉल करने पर एक गड़बड़ी मिलेगी AudioRecord.startRecording() और रिकॉर्डिंग शुरू नहीं हो सकी.

इस नियम का एक अपवाद तब था, जब खास अधिकार वाला ऐप्लिकेशन (जैसे, Google Assistant या सुलभता सेवा) के पास android.permission.CAPTURE_AUDIO_HOTWORD और इस तरह के ऑडियो सोर्स का इस्तेमाल किया HOTWORD. इस मामले में दूसरा ऐप्लिकेशन रिकॉर्ड करना शुरू कर सकता है. जब ऐसा हुआ, तो खास ऐप्लिकेशन को बंद किया गया और नए ऐप्लिकेशन ने इनपुट कैप्चर किया.

Android 9 में एक और बदलाव किया गया है: सिर्फ़ फ़ोरग्राउंड में चल रहे ऐप्लिकेशन (या फ़ोरग्राउंड सेवा की मदद से) ऑडियो इनपुट कैप्चर कर सकते हैं. जब बिना किसी ऐप्लिकेशन को कैप्चर करना शुरू किया गया, जैसे कि फ़ोरग्राउंड सेवा या फ़ोरग्राउंड यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट लगातार दौड़ता रहा, लेकिन आवाज़ बंद हो गई, भले ही सिर्फ़ वही ऐप्लिकेशन कैप्चर कर रहा हो उस समय ऑडियो बेहतर होगा.

Android 10 का व्यवहार

Android 10 से पहले के वर्शन में "पहले आओ, पहले पाओ" की सुविधा काम करती है. जब कोई ऐप्लिकेशन ऑडियो कैप्चर करना शुरू कर देता है, तो कोई भी दूसरा ऐप्लिकेशन जब तक ऑडियो कैप्चर करने वाला ऐप्लिकेशन बंद नहीं हो जाता, तब तक ऑडियो इनपुट इस्तेमाल नहीं किया जाएगा.

Android 10 एक प्रायॉरिटी स्कीम लागू करता है, जो इनपुट ऑडियो स्ट्रीम को स्विच कर सकती है चलने के दौरान ऐप्लिकेशन के बीच में. ज़्यादातर मामलों में, अगर कोई नया ऐप्लिकेशन ऑडियो इनपुट लेता है, कैप्चर किया जा चुका ऐप्लिकेशन काम करता रहता है, लेकिन उसमें कोई आवाज़ नहीं होती. कुछ मामलों में सिस्टम दोनों ऐप्लिकेशन को ऑडियो डिलीवर करना जारी रख सकता है. अलग-अलग शेयर करने की स्थितियों के बारे में नीचे बताया गया है.

यह तरीका, ऑडियो फ़ोकस के अलग-अलग ऐप्लिकेशन के साथ काम करने जैसा है ऑडियो आउटपुट के इस्तेमाल के लिए विरोध करना. हालांकि, ऑडियो फ़ोकस को इनपुट स्विच करने के दौरान, फ़ोकस बढ़ाने और उसे रिलीज़ करने के लिए प्रोग्रामैटिक अनुरोध यहां दी गई स्कीम, लागू की गई प्राथमिकता नीति पर आधारित है जब भी कोई नया ऐप्लिकेशन ऑडियो कैप्चर करना शुरू करेगा, तब अपने-आप अपडेट हो जाएगा.

ऑडियो कैप्चर करने के लिए, Android दो तरह के ऐप्लिकेशन में अंतर करता है:

  • "सामान्य" ऐप्लिकेशन, उपयोगकर्ता ने इंस्टॉल किए हों.
  • "खास अधिकार दिए गए" ऐप्लिकेशन, डिवाइस में पहले से इंस्टॉल होते हैं. इनमें Google Assistant और सभी सुलभता सेवाएं शामिल हैं.

इसके अलावा, ऐप्लिकेशन का इस्तेमाल अलग तरह से किया जाता है अगर इसमें "निजता के प्रति संवेदनशील" का इस्तेमाल किया गया है, ऑडियो सोर्स: CAMCORDER या VOICE_COMMUNICATION.

ऑडियो इनपुट का इस्तेमाल करने और उसे शेयर करने के लिए, प्राथमिकता तय करने के नियम ये हैं:

  • सामान्य ऐप्लिकेशन की तुलना में खास ऐप्लिकेशन को ज़्यादा प्राथमिकता दी जाती है.
  • जिन ऐप्लिकेशन में फ़ोरग्राउंड यूज़र इंटरफ़ेस (यूआई) दिखता है उन्हें बैकग्राउंड में चलने वाले ऐप्लिकेशन के मुकाबले ज़्यादा प्राथमिकता दी जाती है.
  • निजता को बनाए रखने वाले सोर्स से ऑडियो कैप्चर करने वाले ऐप्लिकेशन को, गैर-ज़रूरी ऐप्लिकेशन के मुकाबले ज़्यादा प्राथमिकता दी जाती है.
  • दो सामान्य ऐप्लिकेशन, एक साथ ऑडियो कभी नहीं कैप्चर कर सकते.
  • कुछ स्थितियों में, एक खास ऐप्लिकेशन किसी दूसरे ऐप्लिकेशन के साथ ऑडियो इनपुट शेयर कर सकता है.
  • अगर एक ही प्राथमिकता वाले दो बैकग्राउंड ऐप्लिकेशन ऑडियो कैप्चर कर रहे हैं, तो शुरू किए गए आखिरी ऐप्लिकेशन की प्राथमिकता ज़्यादा होती है.

शेयर करने की स्थितियां

जब दो ऐप्लिकेशन ऑडियो कैप्चर करने की कोशिश करते हैं, शायद उन दोनों को इनपुट सिग्नल मिल सके या उनमें से किसी एक को आवाज़ बंद करें.

इसके चार मुख्य मामले हैं:

  • Assistant + सामान्य ऐप्लिकेशन
  • सुलभता सेवा और सामान्य ऐप्लिकेशन
  • सामान्य तौर पर इस्तेमाल होने वाले दो ऐप्लिकेशन
  • वॉइस कॉल + साधारण ऐप्लिकेशन

Assistant + सामान्य ऐप्लिकेशन

Assistant एक खास ऐप्लिकेशन है, क्योंकि यह पहले से इंस्टॉल होता है. साथ ही, यह ऐप्लिकेशन भूमिका RoleManager.ROLE_ASSISTANT. पहले से इंस्टॉल किए गए, इस भूमिका वाले दूसरे ऐप्लिकेशन के साथ भी ऐसा ही होता है.

Android इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • Assistant को ऑडियो सुनाई देगा (चाहे वह फ़ोरग्राउंड में हो या बैकग्राउंड में) जब तक कि निजता को ध्यान में रखकर बनाए गए ऑडियो सोर्स का इस्तेमाल करने वाला कोई दूसरा ऐप्लिकेशन पहले से कैप्चर न कर रहा हो.

  • ऐप्लिकेशन को तब तक ऑडियो मिलता रहता है, जब तक कि Assistant के पास यूज़र इंटरफ़ेस (यूआई) न हो कॉम्पोनेंट पर क्लिक करें.

ध्यान दें कि दोनों ऐप्लिकेशन को ऑडियो सिर्फ़ तब मिलेगा, जब Assistant बैकग्राउंड में हो और दूसरा ऐप्लिकेशन, निजता के हिसाब से बनाए गए ऑडियो सोर्स से कैप्चर न कर रहा हो.

सुलभता सेवा और सामान्य ऐप्लिकेशन

AccessibilityService एक सख्त घोषणा की ज़रूरत होती है.

Android इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • अगर सेवा का यूज़र इंटरफ़ेस (यूआई) सबसे ऊपर है, तो सेवा और ऐप्लिकेशन, दोनों को ऑडियो इनपुट. इस तरीके से, वॉइस कॉल या वीडियो को कंट्रोल करने जैसी सुविधाएं मिलती हैं को कैप्चर करने के लिए, बोलकर दिए जाने वाले निर्देशों की मदद लें.

  • अगर सेवा ऊपर नहीं है, तो इस केस को नीचे दिए गए सामान्य दो ऐप्लिकेशन वाले केस की तरह माना जाएगा.

सामान्य तौर पर इस्तेमाल होने वाले दो ऐप्लिकेशन

जब दो ऐप्लिकेशन एक साथ वीडियो कैप्चर करते हैं, तब सिर्फ़ एक ऐप्लिकेशन को ऑडियो मिलता है और दूसरे ऐप्लिकेशन में आवाज़ बंद हो जाती है.

Android इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • अगर कोई भी ऐप्लिकेशन निजता के हिसाब से संवेदनशील नहीं है, जिस ऐप्लिकेशन में सबसे ऊपर यूज़र इंटरफ़ेस (यूआई) मौजूद है उसमें ऑडियो रिकॉर्ड होता है. अगर दोनों में से किसी भी ऐप्लिकेशन में यूज़र इंटरफ़ेस (यूआई) नहीं है, तो सबसे हाल ही में कैप्चर करने वाले ऐप्लिकेशन में ऑडियो रिकॉर्ड होता है.
  • अगर कोई ऐप्लिकेशन निजता के हिसाब से संवेदनशील है, तो उसे ऑडियो और अगर किसी ऐप्लिकेशन में सबसे ऊपर यूज़र इंटरफ़ेस (यूआई) मौजूद है या उसने वीडियो रिकॉर्ड करना शुरू कर दिया है, तो भी वह ऐप्लिकेशन साइलेंट मोड पर रहेगा हाल ही में.
  • अगर दोनों ऐप्लिकेशन में निजता को लेकर संवेदनशील है, तो इसका मतलब है कि वह ऐप्लिकेशन जिसने सबसे ज़्यादा हाल ही में ऑडियो आता है और दूसरे में आवाज़ नहीं सुनाई देती.

वॉइस कॉल + साधारण ऐप्लिकेशन

अगर ऑडियो मोड चालू हो जाता है, तो वॉइस कॉल चालू हो जाएगा AudioManager.getMode() है MODE_IN_CALL या MODE_IN_COMMUNICATION.

Android इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:

  • कॉल में हमेशा ऑडियो आता है.
  • ऐप्लिकेशन ऑडियो कैप्चर कर सकता है, अगर वह सुलभता सेवा.
  • अगर ऐप्लिकेशन, खास लोगों के लिए है, तो वह वॉइस कॉल कैप्चर कर सकता है अनुमति वाला ऐप्लिकेशन (पहले से इंस्टॉल किया गया) CAPTURE_AUDIO_OUTPUT.

    वॉइस कॉल के अपलिंक (TX), डाउनलिंक (RX) या दोनों को कैप्चर करने के लिए, ऐप्लिकेशन को ऑडियो के सोर्स बताएं MediaRecorder.AudioSource.VOICE_UPLINK या MediaRecorder.AudioSource.VOICE_DOWNLINK और/या डिवाइस AudioDeviceInfo.TYPE_TELEPHONY.

Android 11 का व्यवहार

Android 11 (एपीआई लेवल 30), Android 10 की प्राथमिकता स्कीम पर नज़र रखता है ऊपर बताया गया है. यह AudioRecord, MediaRecorder, और AAudioStream जो एक साथ ऑडियो कैप्चर करने की सुविधा को चालू और बंद करती है, भले ही, इस्तेमाल का कोई उदाहरण चुना गया हो.

नए तरीके ये हैं:

जब setPrivacySensitive(), true पर सेट होता है, तो कैप्चर के इस्तेमाल का उदाहरण निजी रहता है और यहां तक कि अगर Assistant के पास संरक्षित Assistant की सुविधा है, तो वह एक ही समय में वीडियो रिकॉर्ड नहीं कर सकता. यह सेटिंग जो ऑडियो सोर्स के हिसाब से काम करता है. उदाहरण के लिए, VOICE_COMMUNICATION डिफ़ॉल्ट रूप से निजी होती है, लेकिन UNPROCESSED नहीं होती.

कॉन्फ़िगरेशन में बदलाव

जब कई ऐप्लिकेशन एक साथ ऑडियो कैप्चर करते हैं, तो उनमें से सिर्फ़ एक या दो ऐप्लिकेशन "ऐक्टिव" (ऑडियो मिल रहा है); बाकी की आवाज़ बंद है (चुपचाप की आवाज़ आ रही है). जब इस्तेमाल किए जा रहे ऐप्लिकेशन में बदलाव हो रहा है, तो ऐसा हो सकता है कि ऑडियो फ़्रेमवर्क ऑडियो पाथ को फिर से कॉन्फ़िगर करे इन नियमों के अनुसार:

  • हर चालू ऐप्लिकेशन के लिए, ऑडियो इनपुट डिवाइस बदल सकता है. उदाहरण के लिए, अटैच किए गए ब्लूटूथ हेडसेट के साथ बिल्ट-इन माइक्रोफ़ोन कनेक्ट करने के लिए.
  • सबसे ज़्यादा प्राथमिकता वाले चालू ऐप्लिकेशन से जुड़ी प्री-प्रोसेसिंग चालू है. सभी बाकी प्री-प्रोसेस को अनदेखा कर दिया जाता है.

ज़्यादा प्राथमिकता वाले किसी ऐप्लिकेशन के चालू होने पर, हो सकता है कि किसी चालू ऐप्लिकेशन की आवाज़ बंद हो जाए, तो आप ऑडियो मैनेजर.ऑडियो रिकॉर्डिंगकॉलबैक AudioRecord पर या MediaRecorder ऑब्जेक्ट को कॉन्फ़िगर करने की ज़रूरत नहीं होती. इनमें ये बदलाव हो सकते हैं:

  • कैप्चर करने की सुविधा बंद है या सूचनाओं की आवाज़ बंद है
  • डिवाइस बदला गया
  • प्री-प्रोसेसिंग बदली गई
  • स्ट्रीम की प्रॉपर्टी बदली गईं (सैंपलिंग रेट, चैनल मास्क, सैंपल फ़ॉर्मैट)

आपको कॉल करना होगा AudioRecord.registerAudioRecordingCallback() को कैप्चर करने की ज़रूरत नहीं है. ऐप्लिकेशन को ऑडियो मिलने और कोई बदलाव होने पर ही कॉलबैक किया जाता है.

तरीका onRecordingConfigChanged(), ऑडियो कैप्चर की मौजूदा स्थिति वाला AudioRecordingConfiguration दिखाता है. इनका इस्तेमाल करें के बारे में जानें:

isClientSilenced()
अगर कैप्चर नीति की वजह से क्लाइंट को वापस भेजा गया ऑडियो फ़िलहाल बंद है, तो नतीजे के तौर पर 'सही' दिखाता है.
getAudioDevice()
चालू ऑडियो डिवाइस को दिखाता है.
getEffects()
चालू प्री-प्रोसेसिंग इफ़ेक्ट को दिखाता है. ध्यान दें कि अगर क्लाइंट सबसे ज़्यादा प्राथमिकता वाला चालू ऐप्लिकेशन नहीं है, तो हो सकता है कि ऐक्टिव इफ़ेक्ट और getClientEffects() से मिलने वाला इफ़ेक्ट अलग हो.
getFormat()
स्ट्रीम की प्रॉपर्टी दिखाता है. ध्यान दें कि क्लाइंट को मिले ऑडियो का असल डेटा, getClientFormat() से मिले ज़रूरी फ़ॉर्मैट के हिसाब से ही मिलता है. यह फ़्रेमवर्क, हार्डवेयर इंटरफ़ेस में इस्तेमाल किए गए फ़ॉर्मैट से क्लाइंट के तय किए गए फ़ॉर्मैट में अपने-आप ज़रूरी रीसैंपलिंग, चैनल, और फ़ॉर्मैट कन्वर्ज़न करता है.
AudioRecord.getActiveRecordingConfiguration().
चालू रिकॉर्डिंग कॉन्फ़िगरेशन को दिखाता है.

कॉल करके, डिवाइस पर चल रही सभी रिकॉर्डिंग की सामान्य जानकारी देखी जा सकती है AudioManager.getActiveRecordingConfigurations().