সতর্কতা: OpenSL ES অবচিত হয়েছে। ডেভেলপারদের ওপেন সোর্স Oboe লাইব্রেরি ব্যবহার করা উচিত যা GitHub এ উপলব্ধ। Oboe হল একটি C++ র্যাপার যা একটি API প্রদান করে যা AAudio-এর সাথে সাদৃশ্যপূর্ণ। AAudio উপলব্ধ থাকলে Oboe AAudio-কে কল করে এবং AAudio উপলব্ধ না হলে OpenSL ES-এ ফিরে আসে৷
Android এর জন্য OpenSL ES রেফারেন্স OpenSL ES স্পেসিফিকেশনকে Android এর সাথে সামঞ্জস্যপূর্ণ করতে এবং Android প্ল্যাটফর্মের শক্তি এবং নমনীয়তার সুবিধা নিতে প্রসারিত করে।
অ্যান্ড্রয়েড এক্সটেনশনের জন্য API-এর সংজ্ঞা OpenSLES_Android.h
এবং এতে অন্তর্ভুক্ত হেডার ফাইলগুলিতে থাকে। এই এক্সটেনশনগুলি সম্পর্কে বিস্তারিত জানার জন্য OpenSLES_Android.h
সাথে পরামর্শ করুন৷ এই ফাইলটি আপনার ইনস্টলেশন রুটের অধীনে, sysroot/usr/include/SLES
ডিরেক্টরিতে অবস্থিত। অন্যথায় উল্লেখ না থাকলে, সমস্ত ইন্টারফেস স্পষ্ট।
এই এক্সটেনশনগুলি আপনার অ্যাপ্লিকেশনের বহনযোগ্যতাকে অন্যান্য OpenSL ES বাস্তবায়নে সীমাবদ্ধ করে, কারণ সেগুলি Android-নির্দিষ্ট। আপনি এক্সটেনশনের ব্যবহার এড়িয়ে বা কম্পাইলের সময় তাদের বাদ দিতে #ifdef
ব্যবহার করে এই সমস্যাটি কমাতে পারেন।
নিম্নলিখিত সারণীটি Android-নির্দিষ্ট ইন্টারফেস এবং ডেটা লোকেটারগুলি দেখায় যা Android OpenSL ES প্রতিটি বস্তুর প্রকারের জন্য সমর্থন করে। কোষের হ্যাঁ মানগুলি প্রতিটি বস্তুর প্রকারের জন্য উপলব্ধ ইন্টারফেস এবং ডেটা লোকেটারগুলি নির্দেশ করে।
বৈশিষ্ট্য | অডিও প্লেয়ার | অডিও রেকর্ডার | ইঞ্জিন | আউটপুট মিশ্রণ |
---|---|---|---|---|
অ্যান্ড্রয়েড বাফার সারি | হ্যাঁ: উত্স (ডিকোড) | না | না | না |
অ্যান্ড্রয়েড কনফিগারেশন | হ্যাঁ | হ্যাঁ | না | না |
অ্যান্ড্রয়েড প্রভাব | হ্যাঁ | না | না | হ্যাঁ |
অ্যান্ড্রয়েড প্রভাব ক্ষমতা | না | না | হ্যাঁ | না |
অ্যান্ড্রয়েড ইফেক্ট পাঠান | হ্যাঁ | না | না | না |
অ্যান্ড্রয়েড সহজ বাফার সারি | হ্যাঁ: উত্স (প্লেব্যাক) বা সিঙ্ক (ডিকোড) | হ্যাঁ | না | না |
অ্যান্ড্রয়েড বাফার কিউ ডেটা লোকেটার | হ্যাঁ: উত্স (ডিকোড) | না | না | না |
অ্যান্ড্রয়েড ফাইল বর্ণনাকারী ডেটা লোকেটার | হ্যাঁ: উত্স | না | না | না |
অ্যান্ড্রয়েড সাধারণ বাফার কিউ ডেটা লোকেটার | হ্যাঁ: উত্স (প্লেব্যাক) বা সিঙ্ক (ডিকোড) | হ্যাঁ: সিঙ্ক | না | না |
অ্যান্ড্রয়েড কনফিগারেশন ইন্টারফেস
অ্যান্ড্রয়েড কনফিগারেশন ইন্টারফেস বস্তুর জন্য প্ল্যাটফর্ম-নির্দিষ্ট পরামিতি সেট করার একটি উপায় প্রদান করে। এই ইন্টারফেসটি অন্যান্য OpenSL ES 1.0.1 ইন্টারফেস থেকে আলাদা যে আপনার অ্যাপটি সংশ্লিষ্ট বস্তুকে ইনস্ট্যান্ট করার আগে এটি ব্যবহার করতে পারে; এইভাবে, আপনি বস্তুটিকে তাৎক্ষণিক করার আগে কনফিগার করতে পারেন। OpenSLES_AndroidConfiguration.h
হেডার ফাইল, যা /sysroot/usr/include/SLES
এ থাকে, নিম্নলিখিত উপলব্ধ কনফিগারেশন কী এবং মানগুলি নথিভুক্ত করে:
- অডিও প্লেয়ারের জন্য স্ট্রিমের ধরন (ডিফল্ট
SL_ANDROID_STREAM_MEDIA
)। - অডিও রেকর্ডারগুলির জন্য রেকর্ড প্রোফাইল (ডিফল্ট
SL_ANDROID_RECORDING_PRESET_GENERIC
)।
নিম্নলিখিত কোড স্নিপেট একটি অডিও প্লেয়ারে অ্যান্ড্রয়েড অডিও স্ট্রিম টাইপ সেট করার একটি উদাহরণ দেখায়:
// CreateAudioPlayer and specify SL_IID_ANDROIDCONFIGURATION // in the required interface ID array. Do not realize player yet. // ... SLAndroidConfigurationItf playerConfig; result = (*playerObject)->GetInterface(playerObject, SL_IID_ANDROIDCONFIGURATION, &playerConfig); assert(SL_RESULT_SUCCESS == result); SLint32 streamType = SL_ANDROID_STREAM_ALARM; result = (*playerConfig)->SetConfiguration(playerConfig, SL_ANDROID_KEY_STREAM_TYPE, &streamType, sizeof(SLint32)); assert(SL_RESULT_SUCCESS == result); // ... // Now realize the player here.
আপনি একটি অডিও রেকর্ডারের জন্য প্রিসেট কনফিগার করতে অনুরূপ কোড ব্যবহার করতে পারেন:
// ... obtain the configuration interface as the first four lines above, then: SLuint32 presetValue = SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION; result = (*playerConfig)->SetConfiguration(playerConfig, RECORDING_PRESET, &presetValue, sizeof(SLuint32));
অ্যান্ড্রয়েড ইফেক্ট ইন্টারফেস
অ্যান্ড্রয়েডের প্রভাব, প্রভাব প্রেরণ, এবং প্রভাব ক্ষমতা ইন্টারফেসগুলি ডিভাইস-নির্দিষ্ট অডিও প্রভাবগুলি অনুসন্ধান এবং ব্যবহার করার জন্য একটি অ্যাপ্লিকেশনের জন্য একটি সাধারণ প্রক্রিয়া প্রদান করে। ডিভাইস প্রস্তুতকারকদের উচিত যেকোন উপলব্ধ ডিভাইস-নির্দিষ্ট অডিও প্রভাবগুলি নথিভুক্ত করা যা তারা প্রদান করে।
পোর্টেবল অ্যাপ্লিকেশনগুলিকে অ্যান্ড্রয়েড প্রভাব এক্সটেনশনের পরিবর্তে অডিও প্রভাবগুলির জন্য OpenSL ES 1.0.1 API ব্যবহার করা উচিত৷
অ্যান্ড্রয়েড ফাইল বর্ণনাকারী ডেটা লোকেটার
অ্যান্ড্রয়েড ফাইল বর্ণনাকারী ডেটা লোকেটার আপনাকে একটি অডিও প্লেয়ারের জন্য একটি খোলা ফাইল বর্ণনাকারী হিসাবে রিড অ্যাক্সেস সহ উৎস নির্দিষ্ট করার অনুমতি দেয়। তথ্য বিন্যাস MIME হতে হবে.
এই এক্সটেনশনটি নেটিভ অ্যাসেট ম্যানেজারের সাথে একত্রে বিশেষভাবে উপযোগী, কারণ অ্যাপটি একটি ফাইল বর্ণনাকারীর মাধ্যমে APK থেকে সম্পদগুলি পড়ে।
অ্যান্ড্রয়েড সাধারণ বাফার কিউ ডেটা লোকেটার এবং ইন্টারফেস
OpenSL ES 1.0.1 রেফারেন্স স্পেসিফিকেশনে, বাফার কিউগুলি শুধুমাত্র অডিও প্লেয়ারের জন্য ব্যবহার করা যেতে পারে এবং সেগুলি PCM এবং অন্যান্য ডেটা ফর্ম্যাটের সাথে সামঞ্জস্যপূর্ণ। অ্যান্ড্রয়েড সাধারণ বাফার কিউ ডেটা লোকেটার এবং ইন্টারফেস স্পেস দুটি ব্যতিক্রম সহ রেফারেন্স স্পেসিফিকেশনের সাথে অভিন্ন:
- আপনি অডিও রেকর্ডার এবং অডিও প্লেয়ার সহ Android সাধারণ বাফার সারি ব্যবহার করতে পারেন।
- আপনি এই সারিগুলির সাথে শুধুমাত্র PCM ডেটা বিন্যাস ব্যবহার করতে পারেন৷
রেকর্ডিংয়ের জন্য, আপনার অ্যাপকে খালি বাফার সারিবদ্ধ করা উচিত। যখন একটি নিবন্ধিত কলব্যাক একটি বিজ্ঞপ্তি পাঠায় যে সিস্টেমটি একটি বাফারে ডেটা লেখা শেষ করেছে, অ্যাপটি সেই বাফার থেকে পড়তে পারে।
প্লেব্যাক একই ভাবে কাজ করে। ভবিষ্যতের সোর্স কোড সামঞ্জস্যের জন্য, যাইহোক, আমরা পরামর্শ দিচ্ছি যে অ্যাপ্লিকেশনগুলি OpenSL ES 1.0.1 বাফার সারিগুলির পরিবর্তে Android সাধারণ বাফার কিউ ব্যবহার করে৷
বাফার সারি আচরণ
অ্যান্ড্রয়েড বাস্তবায়ন রেফারেন্স স্পেসিফিকেশনের প্রয়োজনীয়তা অন্তর্ভুক্ত করে না যে প্লেব্যাক যখন SL_PLAYSTATE_STOPPED
অবস্থায় প্রবেশ করে তখন প্লে কার্সারটি বর্তমানে বাজানো বাফারের শুরুতে ফিরে আসে। এই বাস্তবায়ন সেই আচরণের সাথে সামঞ্জস্যপূর্ণ হতে পারে, অথবা এটি প্লে কার্সারের অবস্থান অপরিবর্তিত রেখে যেতে পারে। ফলস্বরূপ, আপনার অ্যাপ অনুমান করতে পারে না যে উভয় আচরণই ঘটে। অতএব, SL_PLAYSTATE_STOPPED
এ রূপান্তরের পরে আপনার স্পষ্টভাবে BufferQueue::Clear()
পদ্ধতিতে কল করা উচিত। এটি করা বাফার সারি একটি পরিচিত অবস্থায় সেট করে।
একইভাবে, বাফার কিউ কলব্যাকের জন্য ট্রিগার অবশ্যই SL_PLAYSTATE_STOPPED
এ রূপান্তরিত হতে হবে বা BufferQueue::Clear()
এর সম্পাদন হতে হবে তা নিয়ন্ত্রণ করে এমন কোনো স্পেসিফিকেশন নেই। অতএব, আমরা সুপারিশ করি যে আপনি এক বা অন্যের উপর নির্ভরতা তৈরি করবেন না; পরিবর্তে, আপনার অ্যাপ উভয়ই পরিচালনা করতে সক্ষম হওয়া উচিত।
বস্তু তৈরিতে গতিশীল ইন্টারফেস
সুবিধার জন্য, OpenSL ES 1.0.1 এর অ্যান্ড্রয়েড বাস্তবায়ন আপনার অ্যাপকে গতিশীল ইন্টারফেস নির্দিষ্ট করার অনুমতি দেয় যখন এটি কোনো বস্তুকে ইনস্ট্যান্টিয়েট করে। ইন্সট্যান্টেশনের পরে এই ইন্টারফেসগুলি যোগ করার জন্য এটি DynamicInterfaceManagement::AddInterface()
ব্যবহার করার একটি বিকল্প।
এক্সটেনশন রিপোর্টিং
প্ল্যাটফর্মটি অ্যান্ড্রয়েড এক্সটেনশন সমর্থন করে কিনা তা অনুসন্ধান করার জন্য তিনটি পদ্ধতি রয়েছে। এই পদ্ধতিগুলি হল:
-
Engine::QueryNumSupportedExtensions()
-
Engine::QuerySupportedExtension()
-
Engine::IsExtensionSupported()
এই পদ্ধতিগুলির যেকোনো একটি ANDROID_SDK_LEVEL_<API-level>
প্রদান করে, যেখানে API-level
হল প্ল্যাটফর্ম API স্তর; উদাহরণস্বরূপ, ANDROID_SDK_LEVEL_23
। 9 বা উচ্চতর একটি প্ল্যাটফর্ম API স্তর মানে প্ল্যাটফর্মটি এক্সটেনশনগুলিকে সমর্থন করে৷
PCM-তে অডিও ডিকোড করুন
এই বিভাগটি অবিলম্বে প্লেব্যাক ছাড়াই PCM-এ একটি এনকোড করা স্ট্রীম ডিকোড করার জন্য OpenSL ES 1.0.1-এ একটি অবচয়িত Android-নির্দিষ্ট এক্সটেনশন বর্ণনা করে। নীচের টেবিলটি এই এক্সটেনশন এবং বিকল্পগুলি ব্যবহারের জন্য সুপারিশ দেয়।
API স্তর | বিকল্প |
---|---|
15 এবং নীচে | একটি উপযুক্ত লাইসেন্স সহ একটি ওপেন সোর্স কোডেক |
16 থেকে 20 | MediaCodec ক্লাস বা উপযুক্ত লাইসেন্স সহ একটি ওপেন-সোর্স কোডেক |
21 এবং তার উপরে | <media/NdkMedia*.h> হেডার ফাইলে NDK MediaCodec, MediaCodec ক্লাস, অথবা উপযুক্ত লাইসেন্স সহ একটি ওপেন-সোর্স কোডেক |
দ্রষ্টব্য: MediaCodec
API-এর NDK সংস্করণের জন্য বর্তমানে কোনো ডকুমেন্টেশন নেই। যাইহোক, আপনি একটি উদাহরণের জন্য নেটিভ-কোডেক নমুনা কোড উল্লেখ করতে পারেন।
একটি স্ট্যান্ডার্ড অডিও প্লেয়ার একটি অডিও ডিভাইসে ফিরে আসে, ডেটা সিঙ্ক হিসাবে আউটপুট মিশ্রণকে নির্দিষ্ট করে। অ্যান্ড্রয়েড এক্সটেনশনটি আলাদা যে একটি অডিও প্লেয়ার পরিবর্তে একটি ডিকোডার হিসাবে কাজ করে যদি অ্যাপটি ডেটা উত্সটিকে URI হিসাবে বা MIME ডেটা ফর্ম্যাট ব্যবহার করে বর্ণিত একটি Android ফাইল বর্ণনাকারী ডেটা লোকেটার হিসাবে নির্দিষ্ট করে থাকে। এই ধরনের ক্ষেত্রে, ডেটা সিঙ্ক হল একটি অ্যান্ড্রয়েড সাধারণ বাফার কিউ ডেটা লোকেটার যা PCM ডেটা ফর্ম্যাট ব্যবহার করে।
এই বৈশিষ্ট্যটি প্রাথমিকভাবে একটি নতুন গেম স্তরে পরিবর্তন করার সময় গেমগুলি তাদের অডিও সম্পদগুলিকে প্রি-লোড করার উদ্দেশ্যে তৈরি করা হয়েছে, যা SoundPool
ক্লাসের কার্যকারিতার অনুরূপ।
অ্যাপ্লিকেশনটিকে প্রাথমিকভাবে অ্যান্ড্রয়েড সাধারণ বাফার সারিতে খালি বাফারগুলির একটি সেট সারিবদ্ধ করা উচিত। এর পরে, অ্যাপটি পিসিএম ডেটা দিয়ে বাফারগুলি পূরণ করে। প্রতিটি বাফার পূর্ণ হওয়ার পরে অ্যান্ড্রয়েড সাধারণ বাফার কিউ কলব্যাক ফায়ার হয়ে যায়। কলব্যাক হ্যান্ডলার PCM ডেটা প্রক্রিয়া করে, এখন-খালি বাফারটিকে পুনরায় সারিবদ্ধ করে এবং তারপরে ফেরত দেয়। অ্যাপ্লিকেশনটি ডিকোড করা বাফারগুলির ট্র্যাক রাখার জন্য দায়ী; কলব্যাক পরামিতি তালিকায় পর্যাপ্ত তথ্য অন্তর্ভুক্ত করা হয় না যা বাফারটি নির্দেশ করে যেটিতে ডেটা রয়েছে বা বাফার যা পরবর্তী সারিবদ্ধ হওয়া উচিত।
স্ট্রীমের শেষে একটি SL_PLAYEVENT_HEADATEND
ইভেন্ট ডেলিভার করার মাধ্যমে ডেটা উত্সটি স্ট্রিমের সমাপ্তি (EOS) রিপোর্ট করে৷ অ্যাপটি প্রাপ্ত সমস্ত ডেটা ডিকোড করার পরে, এটি অ্যান্ড্রয়েড সাধারণ বাফার কিউ কলব্যাকে আর কোনও কল করে না।
সিঙ্কের PCM ডেটা বিন্যাস সাধারণত নমুনা হার, চ্যানেল গণনা এবং বিট গভীরতার ক্ষেত্রে এনকোড করা ডেটা উত্সের সাথে মেলে। যাইহোক, আপনি একটি ভিন্ন নমুনা হার, চ্যানেল গণনা বা বিট গভীরতায় ডিকোড করতে পারেন। প্রকৃত PCM বিন্যাস সনাক্ত করার জন্য একটি বিধান সম্পর্কে তথ্যের জন্য, মেটাডেটার মাধ্যমে ডিকোড করা PCM ডেটার বিন্যাস নির্ধারণ করুন দেখুন।
অ্যান্ড্রয়েডের পিসিএম ডিকোডিং বৈশিষ্ট্যের জন্য ওপেনএসএল ইএস বিরতি এবং প্রাথমিক সন্ধান সমর্থন করে; এটি ভলিউম নিয়ন্ত্রণ, প্রভাব, লুপিং, বা প্লেব্যাক হার সমর্থন করে না।
প্ল্যাটফর্ম বাস্তবায়নের উপর নির্ভর করে, ডিকোডিংয়ের জন্য এমন সংস্থানগুলির প্রয়োজন হতে পারে যা নিষ্ক্রিয় রাখা যাবে না। অতএব, আমরা সুপারিশ করছি যে আপনি পর্যাপ্ত সংখ্যক খালি PCM বাফার প্রদান নিশ্চিত করুন; অন্যথায়, ডিকোডার ক্ষুধার্ত। এটি ঘটতে পারে, উদাহরণস্বরূপ, যদি আপনার অ্যাপটি অ্যান্ড্রয়েড সাধারণ বাফার কিউ কলব্যাক থেকে অন্য খালি বাফার সারিবদ্ধ না করে ফিরে আসে। ডিকোডার অনাহারের ফলাফল অনির্দিষ্ট, তবে এতে অন্তর্ভুক্ত থাকতে পারে: ডিকোড করা পিসিএম ডেটা ড্রপ করা, ডিকোডিং প্রক্রিয়া থামানো, বা ডিকোডারটি সরাসরি বন্ধ করা।
দ্রষ্টব্য: একটি এনকোড করা স্ট্রীমকে PCM-এ ডিকোড করতে কিন্তু অবিলম্বে প্লে ব্যাক না করতে, Android 4.x (API লেভেল 16-20) এ চলমান অ্যাপগুলির জন্য, আমরা MediaCodec
ক্লাস ব্যবহার করার পরামর্শ দিই। Android 5.0 (API স্তর 21) বা উচ্চতর সংস্করণে চলমান নতুন অ্যাপ্লিকেশনগুলির জন্য, আমরা NDK সমতুল্য, <NdkMedia*.h>
ব্যবহার করার পরামর্শ দিই। এই হেডার ফাইলগুলি আপনার ইনস্টলেশন রুটের অধীনে media/
ডিরেক্টরিতে থাকে।
ডিকোড স্ট্রিমিং ADTS AAC থেকে PCM
একটি অডিও প্লেয়ার একটি স্ট্রিমিং ডিকোডার হিসাবে কাজ করে যদি ডেটা উত্সটি একটি Android বাফার সারি ডেটা লোকেটার হয় যা MIME ডেটা ফর্ম্যাট ব্যবহার করে এবং ডেটা সিঙ্ক হল একটি Android সাধারণ বাফার কিউ ডেটা লোকেটার যা PCM ডেটা ফর্ম্যাট ব্যবহার করে৷ নিম্নরূপ MIME ডেটা বিন্যাস কনফিগার করুন:
- ধারক:
SL_CONTAINERTYPE_RAW
- MIME প্রকারের স্ট্রিং:
SL_ANDROID_MIME_AACADTS
এই বৈশিষ্ট্যটি প্রাথমিকভাবে স্ট্রিমিং মিডিয়া অ্যাপ্লিকেশনগুলির জন্য উদ্দিষ্ট যেগুলি AAC অডিওর সাথে ডিল করে তবে প্লেব্যাকের আগে কাস্টম অডিও প্রক্রিয়াকরণ করতে হবে৷ PCM-এ অডিও ডিকোড করতে হয় এমন বেশিরভাগ অ্যাপ্লিকেশনগুলিকে PCM-এ অডিও ডিকোড করার পদ্ধতি ব্যবহার করা উচিত, কারণ সেই পদ্ধতিটি সহজ এবং আরও অডিও ফর্ম্যাট পরিচালনা করে। এখানে বর্ণিত কৌশলটি একটি আরও বিশেষ পদ্ধতি, শুধুমাত্র এই দুটি শর্ত প্রযোজ্য হলেই ব্যবহার করা হবে:
- কম্প্রেসড অডিও সোর্স হল ADTS হেডারে থাকা AAC ফ্রেমের একটি প্রবাহ।
- অ্যাপ্লিকেশন এই স্ট্রীম পরিচালনা করে. ডেটা একটি নেটওয়ার্ক সংস্থানের মধ্যে অবস্থিত নয় যার সনাক্তকারী একটি URI বা একটি স্থানীয় ফাইলের মধ্যে যার সনাক্তকারী একটি ফাইল বর্ণনাকারী৷
অ্যাপ্লিকেশনটিকে প্রাথমিকভাবে Android বাফার সারিতে ভরা বাফারগুলির একটি সেট সারিবদ্ধ করা উচিত। প্রতিটি বাফারে এক বা একাধিক সম্পূর্ণ ADTS AAC ফ্রেম থাকে। প্রতিটি বাফার খালি করার পরে অ্যান্ড্রয়েড বাফার কিউ কলব্যাক ফায়ার হয়৷ কলব্যাক হ্যান্ডলারকে বাফারটি পুনরায় পূরণ করা এবং পুনরায় সারিবদ্ধ করা উচিত এবং তারপরে ফিরে আসা উচিত। অ্যাপ্লিকেশনটিকে এনকোড করা বাফারগুলির ট্র্যাক রাখতে হবে না; কলব্যাক পরামিতি তালিকায় পর্যাপ্ত তথ্য রয়েছে যা পরবর্তীতে সারিবদ্ধ হওয়া উচিত। একটি EOS আইটেম সারিবদ্ধ করে স্ট্রিমের শেষ স্পষ্টভাবে চিহ্নিত করা হয়েছে। EOS এর পরে, আর কোন সারি অনুমোদিত নয়।
আমরা সুপারিশ করছি যে আপনি ডিকোডারের অনাহার এড়াতে সম্পূর্ণ ADTS AAC বাফার প্রদান নিশ্চিত করুন। এটি ঘটতে পারে, উদাহরণস্বরূপ, যদি আপনার অ্যাপ অ্যান্ড্রয়েড বাফার কিউ কলব্যাক থেকে অন্য একটি সম্পূর্ণ বাফার সারিবদ্ধ না করে ফিরে আসে। ডিকোডার অনাহারের ফলাফল অনির্দিষ্ট।
ডেটা উত্স ব্যতীত সমস্ত ক্ষেত্রে, স্ট্রিমিং ডিকোড পদ্ধতিটি পিসিএম-এ অডিও ডিকোডের বর্ণনার মতোই।
নামের মধ্যে মিল থাকা সত্ত্বেও, একটি Android বাফার সারি একটি Android সাধারণ বাফার সারির মতো নয় । স্ট্রিমিং ডিকোডার উভয় ধরণের বাফার সারি ব্যবহার করে: ADTS AAC ডেটা উত্সের জন্য একটি Android বাফার সারি এবং PCM ডেটা সিঙ্কের জন্য একটি Android সাধারণ বাফার সারি৷ অ্যান্ড্রয়েড সাধারণ বাফার সারি API সম্পর্কে আরও তথ্যের জন্য, অ্যান্ড্রয়েড সাধারণ বাফার সারি ডেটা লোকেটার এবং ইন্টারফেস দেখুন। অ্যান্ড্রয়েড বাফার সারি API সম্পর্কে আরও তথ্যের জন্য, ইনস্টলেশন রুটের অধীনে docs/Additional_library_docs/openmaxal/
ডিরেক্টরিতে index.html
ফাইলটি দেখুন।
মেটাডেটার মাধ্যমে ডিকোড করা PCM ডেটার বিন্যাস নির্ধারণ করুন
SLMetadataExtractionItf
ইন্টারফেস হল রেফারেন্স স্পেসিফিকেশনের অংশ। যাইহোক, ডিকোড করা PCM ডেটার প্রকৃত বিন্যাস নির্দেশ করে এমন মেটাডেটা কীগুলি Android-এর জন্য নির্দিষ্ট। OpenSLES_AndroidMetadata.h
হেডার ফাইল এই মেটাডেটা কীগুলিকে সংজ্ঞায়িত করে। এই হেডার ফাইলটি আপনার ইনস্টলেশন রুটের অধীনে /sysroot/usr/include/SLES
ডিরেক্টরিতে থাকে।
মেটাডেটা কী সূচকগুলি Object::Realize()
মেথড এক্সিকিউটিং শেষ হওয়ার পরপরই পাওয়া যায়। যাইহোক, অ্যাপটি প্রথম এনকোড করা ডেটা ডিকোড না করা পর্যন্ত সংশ্লিষ্ট মানগুলি উপলভ্য নয়। একটি ভাল অনুশীলন হল Object::Realize
কল করার পরে মূল থ্রেডের মূল সূচকগুলির জন্য অনুসন্ধান করা এবং প্রথমবার কল করার সময় অ্যান্ড্রয়েড সাধারণ বাফার কিউ কলব্যাক হ্যান্ডলারে পিসিএম ফর্ম্যাট মেটাডেটা মানগুলি পড়া। এই ইন্টারফেসের সাথে কাজ করার উদাহরণগুলির জন্য NDK প্যাকেজে উদাহরণ কোডটি দেখুন।
মেটাডেটা কী নাম স্থিতিশীল, কিন্তু মূল সূচকগুলি নথিভুক্ত নয় এবং পরিবর্তন সাপেক্ষে। একটি অ্যাপ্লিকেশনের অনুমান করা উচিত নয় যে সূচকগুলি বিভিন্ন এক্সিকিউশন রান জুড়ে স্থায়ী, এবং অনুমান করা উচিত নয় যে একাধিক অবজেক্ট ইনস্ট্যান্স একই রানের মধ্যে সূচকগুলি ভাগ করে।
ফ্লোটিং-পয়েন্ট ডেটা
Android 5.0 (API লেভেল 21) এবং উচ্চতর সংস্করণে চলমান একটি অ্যাপ একক-নির্ভুলতা, ফ্লোটিং-পয়েন্ট বিন্যাসে একটি AudioPlayer-এ ডেটা সরবরাহ করতে পারে।
নিম্নলিখিত উদাহরণ কোডে, Engine::CreateAudioPlayer()
পদ্ধতি একটি অডিও প্লেয়ার তৈরি করে যা ফ্লোটিং-পয়েন্ট ডেটা ব্যবহার করে:
#include <SLES/OpenSLES_Android.h> ... SLAndroidDataFormat_PCM_EX pcm; pcm.formatType = SL_ANDROID_DATAFORMAT_PCM_EX; pcm.numChannels = 2; pcm.sampleRate = SL_SAMPLINGRATE_44_1; pcm.bitsPerSample = 32; pcm.containerSize = 32; pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; pcm.representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; ... SLDataSource audiosrc; audiosrc.pLocator = ... audiosrc.pFormat = &pcm;