অডিও ইনপুট সাধারণত বিল্ট-ইন মাইক, একটি বাহ্যিক মাইক বা ডিভাইসের সাথে সংযুক্ত একটি অডিও ইন্টারফেস থেকে আসে। অডিও ইনপুট ফোন কথোপকথন থেকেও আসতে পারে।
কখনও কখনও দুই বা ততোধিক অ্যাপ উভয়ই একই অডিও ইনপুট "ক্যাপচার" করতে চাইতে পারে। তারা হয়তো বিভিন্ন কাজ করছে। উদাহরণস্বরূপ, কিছু অ্যাপ যেগুলি অডিও গ্রহণ করে সেগুলি একটি সাধারণ ভয়েস রেকর্ডারের মতো "রেকর্ডিং" হতে পারে, যখন অন্যান্য অ্যাপগুলি "শোনা" হতে পারে, যেমন Google অ্যাসিস্ট্যান্ট বা একটি অ্যাক্সেসিবিলিটি পরিষেবা যা ভয়েস কমান্ডে সাড়া দেয়।
উভয় ক্ষেত্রেই, এই অ্যাপগুলি অডিও ইনপুট পেতে চায়। এই পৃষ্ঠা জুড়ে, আমরা "ক্যাপচার" শব্দটি ব্যবহার করি তা নির্বিশেষে একটি অ্যাপ রেকর্ডিং বা শুধু শুনছে।
যদি দুই বা ততোধিক অ্যাপ একই সময়ে অডিও ক্যাপচার করতে চায়, তাহলে একই উৎস থেকে অডিও সিগন্যাল সবার কাছে পৌঁছে দিতে সমস্যা হতে পারে। এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে Android সিস্টেম অডিও ক্যাপচার করে এমন একাধিক অ্যাপের মধ্যে অডিও ইনপুট ভাগ করে।
প্রি-অ্যান্ড্রয়েড 10 আচরণ
অ্যান্ড্রয়েড 10 এর আগে ইনপুট অডিও স্ট্রিমটি একবারে একটি অ্যাপ দ্বারা ক্যাপচার করা যেত। যদি কিছু অ্যাপ ইতিমধ্যেই অডিও রেকর্ডিং বা শুনছে, তাহলে আপনার অ্যাপ একটি AudioRecord
অবজেক্ট তৈরি করতে পারে, কিন্তু আপনি AudioRecord.startRecording()
কল করলে একটি ত্রুটি ফিরে আসবে এবং রেকর্ডিং শুরু হবে না।
এই নিয়মের একটি ব্যতিক্রম ছিল যখন একটি বিশেষ সুবিধাপ্রাপ্ত অ্যাপ (যেমন Google অ্যাসিস্ট্যান্ট বা একটি অ্যাক্সেসিবিলিটি পরিষেবা) android.permission.CAPTURE_AUDIO_HOTWORD
অনুমতি ছিল এবং HOTWORD
ধরনের একটি অডিও উৎস ব্যবহার করেছিল। এই ক্ষেত্রে অন্য অ্যাপ রেকর্ডিং শুরু করতে পারে। যখন এটি ঘটেছিল তখন বিশেষ সুবিধাপ্রাপ্ত অ্যাপটি বন্ধ হয়ে যায় এবং নতুন অ্যাপটি ইনপুটটি ক্যাপচার করে।
অ্যান্ড্রয়েড 9-এ আরও একটি পরিবর্তন যোগ করা হয়েছে: শুধুমাত্র অগ্রভাগে চলমান অ্যাপগুলি (বা একটি অগ্রভাগের পরিষেবা) অডিও ইনপুট ক্যাপচার করতে পারে৷ যখন ফোরগ্রাউন্ড সার্ভিস বা ফোরগ্রাউন্ড UI কম্পোনেন্ট ছাড়া একটি অ্যাপ ক্যাপচার করা শুরু করে, তখন অ্যাপটি চলতে থাকে কিন্তু নীরবতা পায়, এমনকি সেই সময়ে অডিও ক্যাপচারিং একমাত্র অ্যাপ হলেও।
অ্যান্ড্রয়েড 10 আচরণ
অ্যান্ড্রয়েড 10-এর আগের আচরণ হল "আগে আসলে আগে পাবেন।" একবার একটি অ্যাপ অডিও ক্যাপচার করা শুরু করলে, অডিও ক্যাপচার করা অ্যাপটি বন্ধ না হওয়া পর্যন্ত অন্য কোনও অ্যাপ অডিও ইনপুট অ্যাক্সেস করতে পারবে না।
অ্যান্ড্রয়েড 10 একটি অগ্রাধিকার স্কিম আরোপ করে যা অ্যাপগুলির মধ্যে ইনপুট অডিও স্ট্রীম চালু করার সময় স্যুইচ করতে পারে। বেশিরভাগ ক্ষেত্রে, যদি একটি নতুন অ্যাপ অডিও ইনপুট অর্জন করে, পূর্বে ক্যাপচার করা অ্যাপটি চলতে থাকে, কিন্তু নীরবতা গ্রহণ করে। কিছু ক্ষেত্রে সিস্টেম উভয় অ্যাপে অডিও সরবরাহ করা চালিয়ে যেতে পারে। বিভিন্ন শেয়ারিং পরিস্থিতি নীচে ব্যাখ্যা করা হয়েছে.
এই স্কিমটি যেভাবে অডিও ফোকাস অডিও আউটপুট ব্যবহারের জন্য প্রতিদ্বন্দ্বিতাকারী একাধিক অ্যাপ পরিচালনা করে তার অনুরূপ। যাইহোক, অডিও ফোকাস ফোকাস অর্জন এবং ছেড়ে দেওয়ার জন্য প্রোগ্রাম্যাটিক অনুরোধ দ্বারা পরিচালিত হয়, যখন এখানে বর্ণিত ইনপুট স্যুইচিং স্কিমটি একটি অগ্রাধিকার নীতির উপর ভিত্তি করে যা যখনই একটি নতুন অ্যাপ অডিও ক্যাপচার করতে শুরু করে তখন স্বয়ংক্রিয়ভাবে প্রয়োগ হয়৷
অডিও ক্যাপচার করার উদ্দেশ্যে, অ্যান্ড্রয়েড দুটি ধরণের অ্যাপকে আলাদা করে:
- "সাধারণ" অ্যাপগুলি ব্যবহারকারী দ্বারা ইনস্টল করা হয়।
- "প্রিভিলেজড" অ্যাপগুলি ডিভাইসে আগে থেকে ইনস্টল করা আছে। এর মধ্যে রয়েছে গুগল অ্যাসিস্ট্যান্ট এবং সমস্ত অ্যাক্সেসিবিলিটি পরিষেবা।
উপরন্তু, একটি অ্যাপ যদি "গোপনীয়তা-সংবেদনশীল" অডিও উৎস ব্যবহার করে তাহলে তাকে ভিন্নভাবে বিবেচনা করা হয়: CAMCORDER
বা VOICE_COMMUNICATION
।
অডিও ইনপুট ব্যবহার এবং ভাগ করার জন্য অগ্রাধিকারের নিয়মগুলি নিম্নরূপ:
- সাধারণ অ্যাপের তুলনায় বিশেষ সুবিধাপ্রাপ্ত অ্যাপের অগ্রাধিকার বেশি।
- দৃশ্যমান ফোরগ্রাউন্ড UI সহ অ্যাপ্লিকেশানগুলির ব্যাকগ্রাউন্ড অ্যাপগুলির চেয়ে বেশি অগ্রাধিকার রয়েছে৷
- গোপনীয়তা-সংবেদনশীল উৎস থেকে অডিও ক্যাপচার করা অ্যাপের অগ্রাধিকার নেই এমন অ্যাপের চেয়ে বেশি।
- দুটি সাধারণ অ্যাপ কখনোই একই সময়ে অডিও ক্যাপচার করতে পারে না।
- কিছু পরিস্থিতিতে, একটি বিশেষ সুবিধাপ্রাপ্ত অ্যাপ অন্য অ্যাপের সাথে অডিও ইনপুট শেয়ার করতে পারে।
- যদি একই অগ্রাধিকারের দুটি ব্যাকগ্রাউন্ড অ্যাপ অডিও ক্যাপচার করে, শেষেরটি শুরু হয়েছে তার অগ্রাধিকার বেশি।
শেয়ারিং দৃশ্যকল্প
যখন দুটি অ্যাপ অডিও ক্যাপচার করার চেষ্টা করছে, তখন তারা উভয়ই ইনপুট সিগন্যাল পেতে সক্ষম হতে পারে, অথবা তাদের মধ্যে একটি নীরবতা পেতে পারে।
চারটি প্রধান পরিস্থিতি রয়েছে:
- সহকারী + সাধারণ অ্যাপ
- অ্যাক্সেসিবিলিটি পরিষেবা + সাধারণ অ্যাপ
- দুটি সাধারণ অ্যাপ
- ভয়েস কল + সাধারণ অ্যাপ
সহকারী + সাধারণ অ্যাপ
অ্যাসিস্ট্যান্ট একটি বিশেষ সুবিধাপ্রাপ্ত অ্যাপ কারণ এটি আগে থেকে ইনস্টল করা আছে এবং এটি RoleManager.ROLE_ASSISTANT
ভূমিকা পালন করে। এই ভূমিকা সহ অন্য যেকোন প্রি-ইনস্টল করা অ্যাপের সাথে একই রকম আচরণ করা হয়।
অ্যান্ড্রয়েড এই নিয়ম অনুযায়ী ইনপুট অডিও শেয়ার করে:
গোপনীয়তা-সংবেদনশীল অডিও উৎস ব্যবহার করে অন্য অ্যাপ ইতিমধ্যেই ক্যাপচার না করলে সহকারী অডিও গ্রহণ করতে পারে (সেটি অগ্রভাগে বা ব্যাকগ্রাউন্ডে যাই হোক না কেন)।
অ্যাসিস্ট্যান্টের স্ক্রিনের উপরে একটি দৃশ্যমান UI উপাদান না থাকলে অ্যাপটি অডিও গ্রহণ করে।
মনে রাখবেন যে দুটি অ্যাপই কেবল তখনই অডিও গ্রহণ করে যখন অ্যাসিস্ট্যান্ট ব্যাকগ্রাউন্ডে থাকে এবং অন্য অ্যাপ কোনও গোপনীয়তা-সংবেদনশীল অডিও উৎস থেকে ক্যাপচার করে না।
অ্যাক্সেসিবিলিটি পরিষেবা + সাধারণ অ্যাপ
একটি AccessibilityService
জন্য একটি কঠোর ঘোষণার প্রয়োজন।
অ্যান্ড্রয়েড এই নিয়ম অনুযায়ী ইনপুট অডিও শেয়ার করে:
পরিষেবার UI শীর্ষে থাকলে, পরিষেবা এবং অ্যাপ উভয়ই অডিও ইনপুট গ্রহণ করে৷ এই আচরণ ভয়েস কল নিয়ন্ত্রণ বা ভয়েস কমান্ড সহ ভিডিও ক্যাপচারের মতো কার্যকারিতা প্রদান করে।
যদি পরিষেবাটি উপরে না থাকে, তাহলে এই কেসটিকে নিচের সাধারণ দুই-অ্যাপ কেসের মতোই বিবেচনা করা হয়।
দুটি সাধারণ অ্যাপ
যখন দুটি অ্যাপ একসাথে ক্যাপচার করছে, শুধুমাত্র একটি অ্যাপ অডিও গ্রহণ করে এবং অন্যটি নীরবতা পায়।
অ্যান্ড্রয়েড এই নিয়ম অনুযায়ী ইনপুট অডিও শেয়ার করে:
- যদি কোনও অ্যাপই গোপনীয়তা-সংবেদনশীল না হয়, তবে উপরে একটি UI সহ অ্যাপটি অডিও গ্রহণ করে। যদি কোনও অ্যাপেরই UI না থাকে, যেটি সম্প্রতি ক্যাপচার করা শুরু করেছে সেটি অডিও গ্রহণ করে।
- যদি অ্যাপগুলির মধ্যে একটি গোপনীয়তা-সংবেদনশীল হয়, তবে এটি অডিও গ্রহণ করে এবং অন্য অ্যাপটি নীরবতা পায় যদিও এটির উপরে একটি UI থাকে বা সম্প্রতি ক্যাপচার করা শুরু করে।
- যদি উভয় অ্যাপই গোপনীয়তা-সংবেদনশীল হয়, যে অ্যাপটি সম্প্রতি ক্যাপচার করা শুরু করেছে সেটি অডিও গ্রহণ করে এবং অন্যটি নীরবতা পায়।
ভয়েস কল + সাধারণ অ্যাপ
একটি ভয়েস কল সক্রিয় থাকে যদি AudioManager.getMode()
দ্বারা ফিরে আসা অডিও মোডটি MODE_IN_CALL
বা MODE_IN_COMMUNICATION
হয়।
অ্যান্ড্রয়েড এই নিয়ম অনুযায়ী ইনপুট অডিও শেয়ার করে:
- কলটি সর্বদা অডিও গ্রহণ করে।
- অ্যাপটি অডিও ক্যাপচার করতে পারে যদি এটি একটি অ্যাক্সেসিবিলিটি পরিষেবা হয়।
CAPTURE_AUDIO_OUTPUT
অনুমতি সহ অ্যাপটি ভয়েস কল ক্যাপচার করতে পারে যদি এটি একটি বিশেষাধিকারপ্রাপ্ত (প্রি-ইনস্টল করা) অ্যাপ হয়।ভয়েস কলের আপলিংক (TX), ডাউনলিংক (RX) বা উভয়ই ক্যাপচার করতে, অ্যাপটিকে অবশ্যই অডিও উত্সগুলি উল্লেখ করতে হবে
MediaRecorder.AudioSource.VOICE_UPLINK
বাMediaRecorder.AudioSource.VOICE_DOWNLINK
, এবং/অথবাAudioDeviceInfo.TYPE_TELEPHONY
ডিভাইস৷
অ্যান্ড্রয়েড 11 আচরণ
Android 11 (API স্তর 30) উপরে বর্ণিত Android 10 অগ্রাধিকার স্কিম পর্যবেক্ষণ করে। এটি AudioRecord
, MediaRecorder
, এবং AAudioStream
এ নতুন পদ্ধতিগুলিও প্রদান করে যা নির্বাচিত ব্যবহারের ক্ষেত্রে নির্বিশেষে একযোগে অডিও ক্যাপচার করার ক্ষমতা সক্ষম এবং অক্ষম করে৷
নতুন পদ্ধতি হল:
-
AudioRecord.Builder.setPrivacySensitive()
-
AudioRecord.isPrivacySensitive()
-
MediaRecorder.setPrivacySensitive()
-
MediaRecorder.isPrivacySensitive()
-
AAudioStreamBuilder_setPrivacySensitive()
-
AAudioStream_isPrivacySensitive()
যখন setPrivacySensitive()
true
হয়, তখন ক্যাপচার ব্যবহারের কেসটি ব্যক্তিগত হয় এবং এমনকি একটি বিশেষ সুবিধাপ্রাপ্ত সহকারী একই সাথে ক্যাপচার করতে পারে না। এই সেটিংটি ডিফল্ট আচরণকে ওভাররাইড করে যা অডিও উৎসের উপর নির্ভর করে। উদাহরণস্বরূপ, VOICE_COMMUNICATION
ডিফল্টরূপে ব্যক্তিগত কিন্তু UNPROCESSED
নয়৷
কনফিগারেশন পরিবর্তন
যখন একাধিক অ্যাপ একসাথে অডিও ক্যাপচার করে, তখন শুধুমাত্র একটি বা দুটি "সক্রিয়" থাকে (অডিও গ্রহণ করে); অন্যরা নিঃশব্দ (নিঃশব্দ গ্রহণ) যখন সক্রিয় অ্যাপগুলি পরিবর্তন হয়, তখন অডিও ফ্রেমওয়ার্ক এই নিয়ম অনুসারে অডিও পাথগুলি পুনরায় কনফিগার করতে পারে:
- প্রতিটি সক্রিয় অ্যাপের জন্য অডিও ইনপুট ডিভাইস পরিবর্তিত হতে পারে (উদাহরণস্বরূপ, অন্তর্নির্মিত মাইক্রোফোন থেকে একটি সংযুক্ত ব্লুটুথ হেডসেটে)।
- সর্বোচ্চ অগ্রাধিকার সক্রিয় অ্যাপের সাথে যুক্ত প্রিপ্রসেসিং সক্ষম করা হয়েছে। অন্যান্য সমস্ত প্রিপ্রসেসিং উপেক্ষা করা হয়।
যেহেতু একটি উচ্চ-অগ্রাধিকার অ্যাপ সক্রিয় হয়ে গেলে একটি সক্রিয় অ্যাপ নীরব হয়ে যেতে পারে, আপনি একটি অডিও ম্যানেজার নিবন্ধন করতে পারেন। কনফিগারেশন পরিবর্তিত হলে বিজ্ঞপ্তির জন্য AudioRecord
বা MediaRecorder
অবজেক্টে AudioRecordingCallback। সম্ভাব্য পরিবর্তন হতে পারে:
- নীরব বা আনসাইলেন্স ক্যাপচার করুন
- ডিভাইস পরিবর্তন করা হয়েছে
- প্রিপ্রসেসিং পরিবর্তিত হয়েছে
- স্ট্রিম বৈশিষ্ট্য পরিবর্তিত হয়েছে (স্যাম্পলিং রেট, চ্যানেল মাস্ক, নমুনা ফর্ম্যাট)
ক্যাপচার শুরু করার আগে আপনাকে অবশ্যই AudioRecord.registerAudioRecordingCallback()
কল করতে হবে। কলব্যাক শুধুমাত্র তখনই কার্যকর হয় যখন অ্যাপটি অডিও গ্রহণ করে এবং একটি পরিবর্তন ঘটে।
onRecordingConfigChanged()
পদ্ধতিটি বর্তমান অডিও ক্যাপচার অবস্থা ধারণকারী একটি AudioRecordingConfiguration
প্রদান করে। পরিবর্তন সম্পর্কে জানতে নিম্নলিখিত পদ্ধতি ব্যবহার করুন:
-
isClientSilenced()
- ক্লায়েন্টের কাছে ফিরে আসা অডিওটি বর্তমানে ক্যাপচার নীতির কারণে নীরব করা হলে সত্য ফেরত দেয়৷
-
getAudioDevice()
- সক্রিয় অডিও ডিভাইস ফেরত দেয়।
-
getEffects()
- সক্রিয় প্রিপ্রসেসিং প্রভাব ফেরত দেয়। মনে রাখবেন যে সক্রিয় প্রভাবটি
getClientEffects()
দ্বারা প্রত্যাবর্তিতগুলির মতো নাও হতে পারে যদি ক্লায়েন্ট সর্বোচ্চ-অগ্রাধিকার সক্রিয় অ্যাপ না হয়। -
getFormat()
- স্ট্রিম বৈশিষ্ট্য প্রদান করে। মনে রাখবেন যে ক্লায়েন্ট দ্বারা প্রাপ্ত প্রকৃত অডিও ডেটা সর্বদা
getClientFormat()
দ্বারা প্রত্যাবর্তিত প্রয়োজনীয় বিন্যাসকে সম্মান করে। হার্ডওয়্যার ইন্টারফেসে ব্যবহৃত ফরম্যাট থেকে ক্লায়েন্ট দ্বারা নির্দিষ্ট করা ফরম্যাটে ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে প্রয়োজনীয় রিস্যাম্পলিং, চ্যানেল এবং ফরম্যাট রূপান্তর সম্পাদন করে। -
AudioRecord.getActiveRecordingConfiguration()
। - সক্রিয় রেকর্ডিং কনফিগারেশন প্রদান করে।
আপনি AudioManager.getActiveRecordingConfigurations()
কল করে ডিভাইসে সমস্ত সক্রিয় রেকর্ডিংয়ের একটি সাধারণ দৃশ্য পেতে পারেন।