ऑडियो के इंतज़ार का समय

किसी सिग्नल को सिस्टम से होकर गुज़रने में लगने वाले समय को 'लेटेंसी' कहते हैं. ये आम तौर पर होने वाले ऑडियो ऐप्लिकेशन से जुड़े इंतज़ार के समय के प्रकार:

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

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

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

इंतज़ार का समय मापें

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

दोतरफ़ा यात्रा के ऑडियो के इंतज़ार का समय, डिवाइस के मॉडल और डिवाइस के मॉडल पर निर्भर करता है Android बिल्ड. आपको दोतरफ़ा यात्रा का आइडिया मिल सकता है पब्लिश की गई माप के बारे में बताया गया है.

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

सिग्नल प्रोसेस होने के बाद, ऑडियो पाथ के लिए इंतज़ार का समय सबसे कम होता है. इसलिए, आपको साथ ही, अलग-अलग तरह के उपयोगकर्ताओं ऑडियो लूपबैक डोंगल, जिसकी मदद से टेस्ट को हेडसेट कनेक्टर पर चलाया जा सकता है.

इंतज़ार के समय को कम करने के सबसे सही तरीके

ऑडियो की परफ़ॉर्मेंस की पुष्टि करना

Android के साथ काम करने की परिभाषा का दस्तावेज़ (सीडीडी), हार्डवेयर और सॉफ़्टवेयर की सूची बनाता है Android डिवाइस की ज़रूरी शर्तें पूरी करता हो. देखें Android के साथ काम करने के लिए उपलब्ध प्रोग्राम को Android के साथ काम करने वाले पूरे प्रोग्राम के बारे में ज़्यादा जानकारी पाने के लिए, और CDD का इस्तेमाल करें.

CDD में, दोतरफ़ा यात्रा में लगने वाला समय 20 मि॰से॰ या इससे कम होता है. हालांकि, संगीतकारों के लिए आम तौर पर 10 मि॰से॰ की ज़रूरत होती है). ऐसा इसलिए है, क्योंकि इस्तेमाल के ऐसे अहम उदाहरण हैं जिन्हें अनुमति दी है 20 मिलीसेकंड.

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

  • android.hardware.audio.low_latency से पता चलता है कि आउटपुट में इंतज़ार का समय 45 मि॰से॰ या कम.
  • android.hardware.audio.pro से पता चलता है कि दोतरफ़ा यात्रा में 20 मि॰से॰ या कम.

इन फ़्लैग की शिकायत करने का तरीका, CDD के सेक्शन में तय किया गया है 5.6 ऑडियो के लिए इंतज़ार का समय और 5.10 प्रोफ़ेशनल ऑडियो.

Java में इन सुविधाओं की जांच करने का तरीका यहां बताया गया है:

Kotlin

val hasLowLatencyFeature: Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_LOW_LATENCY)

val hasProFeature: Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_PRO)

Java

boolean hasLowLatencyFeature =
    getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_LOW_LATENCY);

boolean hasProFeature =
    getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_PRO);

ऑडियो सुविधाओं के संबंध के आधार पर, android.hardware.audio.low_latency सुविधा android.hardware.audio.pro के लिए एक ज़रूरी शर्त है. डिवाइस लागू कर सकता है android.hardware.audio.low_latency और android.hardware.audio.pro नहीं, लेकिन नहीं कम्यूनिटी दिशा-निर्देशों के उल्लंघन की वजह से, वीडियो को सही जगह बनाया जा सकता है.

ऑडियो की परफ़ॉर्मेंस का कोई अनुमान न लगाएं

इंतज़ार के समय की समस्याओं से बचने के लिए, नीचे दिए गए अनुमानों से सावधान रहें:

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

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

इनपुट में लगने वाला समय कम करें

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

  • अगर आपका ऐप्लिकेशन इनपुट पर नज़र रख रहा है, तो उपयोगकर्ताओं को हेडसेट का इस्तेमाल करने के लिए कहें उदाहरण के लिए, पहली बार चलाने पर हेडफ़ोन के साथ सबसे अच्छा ऐप्लिकेशन स्क्रीन दिखाकर. नोट जोड़ें हेडसेट का इस्तेमाल करने से इस बात की गारंटी नहीं मिलती कि इंतज़ार का समय सबसे कम होगा. आपको ये काम करने पड़ सकते हैं ऑडियो पाथ से अनचाही सिग्नल प्रोसेसिंग को हटाने के लिए, अन्य चरण पूरे करें. जैसे, का उपयोग करके रिकॉर्डिंग के दौरान, VOICE_RECOGNITION प्रीसेट.
  • रिपोर्ट के मुताबिक, 44,100 और 48,000 हर्ट्ज़ की नॉमिनल सैंपल रेट को मैनेज करने के लिए तैयार रहें इसके लिए getप्रॉपर्टी(String) PROPERTY_OUTPUT_SAMPLE_RATE. अन्य सैंपल रेट हो सकते हैं, लेकिन बहुत कम.
  • रिपोर्ट किए गए बफ़र साइज़ को मैनेज करने के लिए तैयार रहें इसके लिए getप्रॉपर्टी(String) PROPERTY_OUTPUT_FRAMES_PER_BUFFER. सामान्य बफ़र साइज़ में 96, 128, 160, 192, 240, 256, और अन्य या 512 फ़्रेम की ज़रूरत होती है, लेकिन कुछ और वैल्यू भी हो सकती हैं.

आउटपुट में लगने वाले समय को कम करें

सही सैंपल रेट का इस्तेमाल करें जब आप अपना ऑडियो प्लेयर बनाते हैं

इंतज़ार का समय कम से कम रखने के लिए, आपको डिवाइस की परफ़ॉर्मेंस से मेल खाने वाला ऑडियो डेटा देना होगा सैंपल रेट और बफ़र साइज़. ज़्यादा जानकारी के लिए, यह देखें इंतज़ार का समय कम करने के लिए डिज़ाइन करें.

Java में, AudioManager से सबसे सही सैंपल रेट हासिल किया जा सकता है. इसकी जानकारी यहां दी गई है कोड का उदाहरण:

Kotlin

val am = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val sampleRateStr: String? = am.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE)
var sampleRate: Int = sampleRateStr?.let { str ->
    Integer.parseInt(str).takeUnless { it == 0 }
} ?: 44100 // Use a default value if property not found

Java

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
String sampleRateStr = am.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
int sampleRate = Integer.parseInt(sampleRateStr);
if (sampleRate == 0) sampleRate = 44100; // Use a default value if property not found

सही सैंपल रेट पता चलने के बाद, प्लेयर बनाते समय सैंपल रेट उपलब्ध कराया जा सकता है. इस उदाहरण में OpenSL ES का इस्तेमाल किया गया है:

// create buffer queue audio player
void Java_com_example_audio_generatetone_MainActivity_createBufferQueueAudioPlayer
        (JNIEnv* env, jclass clazz, jint sampleRate, jint framesPerBuffer)
{
   ...
   // specify the audio source format
   SLDataFormat_PCM format_pcm;
   format_pcm.numChannels = 2;
   format_pcm.samplesPerSec = (SLuint32) sampleRate * 1000;
   ...
}

ध्यान दें: samplesPerSec का मतलब, हर चैनल के लिए सैंपल रेट से है मिलीहर्ट्ज़ (1 हर्ट्ज़ = 1,000 मिलीहर्ट्ज़).

ऑडियो डेटा को क्यू में जोड़ने के लिए, सही बफ़र साइज़ का इस्तेमाल करें

आप इनका इस्तेमाल करके, सबसे अच्छे सैंपल रेट की तरह ही सबसे सही बफ़र साइज़ पा सकते हैं. AudioManager एपीआई:

Kotlin

val am = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val framesPerBuffer: String? = am.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER)
var framesPerBufferInt: Int = framesPerBuffer?.let { str ->
    Integer.parseInt(str).takeUnless { it == 0 }
} ?: 256 // Use default

Java

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
String framesPerBuffer = am.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
int framesPerBufferInt = Integer.parseInt(framesPerBuffer);
if (framesPerBufferInt == 0) framesPerBufferInt = 256; // Use default

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

बफ़र साइज़ तय करने के लिए, हार्डकोड वैल्यू के बजाय, एपीआई का इस्तेमाल करना ज़रूरी है, क्योंकि सभी डिवाइसों और Android बिल्ड में HAL बफ़र का साइज़ अलग-अलग होता है.

आउटपुट इंटरफ़ेस न जोड़ें जिसमें सिग्नल प्रोसेसिंग शामिल होती है

फ़ास्ट मिक्सर सिर्फ़ इन इंटरफ़ेस के साथ काम करता है:

  • SL_IID_ANDROIDसिमPLEBUFFERQUEUE
  • एसएल_आईआईडी_वॉल्यूम
  • SL_IID_MUTESOLO

ऐसे इंटरफ़ेस की अनुमति नहीं है, क्योंकि इनमें सिग्नल प्रोसेसिंग शामिल होती है. इसकी वजह से फ़ास्ट ट्रैक के लिए किए गए आपके अनुरोध को अस्वीकार किया जाएगा:

  • SL_IID_BASSBOOST
  • SL_IID_इफ़ेक्ट
  • एसएल_आईआईडी_ENVIRONMENTALREVERB
  • एसएल_आईआईडी_EQUALIZER
  • SL_IID_PLAYBACKRATE
  • एसएल_IID_PRESETREVERB
  • एसएल_आईआईडी_VIRTUALIZER
  • SL_IID_ANDROIDइफ़
  • SL_IID_ANDROIDइफ़्सEND

अपना प्लेयर बनाते समय, पक्का करें कि आप सिर्फ़ तेज़ इंटरफ़ेस जोड़ रहे हों, जैसा कि यहां दिखाया गया है नीचे दिया गया उदाहरण:

const SLInterfaceID interface_ids[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_VOLUME };

पुष्टि करें कि 'वीडियो स्ट्रीम होने और उसके दिखने के समय का अंतर कम करें' वाले ट्रैक का इस्तेमाल किया जा रहा है

इन चरणों को पूरा करके इस बात की पुष्टि करें कि आपने 'वीडियो स्ट्रीम होने और उसके दिखने के समय का अंतर कम करें' कार्रवाई कर ली है:

  1. अपना ऐप्लिकेशन लॉन्च करें और फिर नीचे दिया गया निर्देश चलाएं:
  2. adb shell ps | grep your_app_name
    
  3. अपने ऐप्लिकेशन के प्रोसेस आईडी को नोट कर लें.
  4. अब अपने ऐप्लिकेशन से कुछ ऑडियो चलाएं. इसे चलाने के लिए आपके पास करीब तीन सेकंड हैं टर्मिनल से निम्न आदेश:
  5. adb shell dumpsys media.audio_flinger
    
  6. अपने प्रोसेस आईडी के लिए स्कैन करें. अगर आपको नाम कॉलम में F दिखता है, तो यह लो-लेटेंसी ट्रैक (F का मतलब है फ़ास्ट ट्रैक).

वॉर्मअप के दौरान इंतज़ार का समय कम करें

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

#define CHANNELS 1
static short* silenceBuffer;
int numSamples = frames * CHANNELS;
silenceBuffer = malloc(sizeof(*silenceBuffer) * numSamples);
    for (i = 0; i<numSamples; i++) {
        silenceBuffer[i] = 0;
    }

जब ऑडियो बनाया जाना चाहिए, तब प्रीफ़िक्स बफ़र का इस्तेमाल किया जा सकता है. का इस्तेमाल करता है.

ध्यान दें: लगातार ऑडियो सुनने में ऊर्जा की बहुत ज़्यादा खपत होती है. सुनिश्चित करें कि आप आउटपुट onPause() तरीका. साथ ही, उपयोगकर्ता की कुछ समय तक कोई गतिविधि न होने के बाद, साइलेंट आउटपुट को रोक दें.

अतिरिक्त सैंपल कोड

ऑडियो के इंतज़ार का समय दिखाने वाला सैंपल ऐप्लिकेशन डाउनलोड करने के लिए, यह देखें NDK सैंपल.

अधिक जानकारी के लिए

  1. ऐप्लिकेशन डेवलपर के लिए, ऑडियो के लिए इंतज़ार का समय
  2. ऑडियो के लिए इंतज़ार के समय में योगदान देने वाले लोग
  3. ऑडियो के लिए इंतज़ार का समय मेज़र करना
  4. ऑडियो वॉर्मअप
  5. इंतज़ार का समय (ऑडियो)
  6. दोतरफ़ा यात्रा में देरी का समय