এই বিভাগটি ব্যাখ্যা করে কিভাবে একটি মিডিয়া প্লেয়ার অ্যাপকে একটি মিডিয়া কন্ট্রোলার (UI-এর জন্য) এবং একটি মিডিয়া সেশন (প্রকৃত প্লেয়ারের জন্য) মধ্যে আলাদা করতে হয়। এটি দুটি মিডিয়া অ্যাপ আর্কিটেকচার বর্ণনা করে: একটি ক্লায়েন্ট/সার্ভার ডিজাইন যা অডিও অ্যাপের জন্য ভাল কাজ করে এবং ভিডিও প্লেয়ারের জন্য একটি একক-অ্যাকটিভিটি ডিজাইন। এটি আরও দেখায় যে কীভাবে মিডিয়া অ্যাপগুলিকে হার্ডওয়্যার নিয়ন্ত্রণে সাড়া দেওয়া যায় এবং অডিও আউটপুট স্ট্রিম ব্যবহার করে এমন অন্যান্য অ্যাপগুলির সাথে সহযোগিতা করা যায়।
প্লেয়ার এবং UI
একটি মাল্টিমিডিয়া অ্যাপ্লিকেশন যা অডিও বা ভিডিও চালায় সাধারণত দুটি অংশ থাকে:
- একটি প্লেয়ার যা ডিজিটাল মিডিয়া গ্রহণ করে এবং এটি ভিডিও এবং/অথবা অডিও হিসাবে রেন্ডার করে
- প্লেয়ার চালানোর জন্য পরিবহন নিয়ন্ত্রণ সহ একটি UI এবং ঐচ্ছিকভাবে প্লেয়ারের অবস্থা প্রদর্শন করে
অ্যান্ড্রয়েডে আপনি গ্রাউন্ড আপ থেকে নিজের প্লেয়ার তৈরি করতে পারেন, অথবা আপনি এই বিকল্পগুলি থেকে বেছে নিতে পারেন:
- মিডিয়াপ্লেয়ার ক্লাস একটি বেয়ার-বোন প্লেয়ারের জন্য মৌলিক কার্যকারিতা প্রদান করে যা সবচেয়ে সাধারণ অডিও/ভিডিও ফর্ম্যাট এবং ডেটা উত্স সমর্থন করে।
- ExoPlayer হল একটি ওপেন সোর্স লাইব্রেরি যা
MediaCodec
এবংAudioTrack
মতো নিম্ন-স্তরের মিডিয়া ফ্রেমওয়ার্ক উপাদানগুলির উপরে তৈরি করা হয়েছে। ExoPlayer DASH-এর মতো উচ্চ-পারফরম্যান্স বৈশিষ্ট্য সমর্থন করে যাMediaPlayer
এ উপলব্ধ নয়। আপনি ExoPlayer কোড কাস্টমাইজ করতে পারেন, নতুন উপাদান যোগ করা সহজ করে তোলে। ExoPlayer শুধুমাত্র Android সংস্করণ 4.1 এবং উচ্চতর সংস্করণে ব্যবহার করা যেতে পারে।
মিডিয়া সেশন এবং মিডিয়া কন্ট্রোলার
যদিও UI এবং প্লেয়ারের জন্য APIগুলি নির্বিচারে হতে পারে, তবে দুটি অংশের মধ্যে মিথস্ক্রিয়া প্রকৃতি মূলত সমস্ত মিডিয়া প্লেয়ার অ্যাপের জন্য একই। অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দুটি ক্লাস সংজ্ঞায়িত করে, একটি মিডিয়া সেশন এবং একটি মিডিয়া কন্ট্রোলার, যা একটি মিডিয়া প্লেয়ার অ্যাপ তৈরির জন্য একটি সু-সংজ্ঞায়িত কাঠামো আরোপ করে।
মিডিয়া সেশন এবং মিডিয়া কন্ট্রোলার একে অপরের সাথে যোগাযোগ করে পূর্বনির্ধারিত কলব্যাকগুলি ব্যবহার করে যা স্ট্যান্ডার্ড প্লেয়ার অ্যাকশনগুলির (প্লে, পজ, স্টপ, ইত্যাদি) সাথে সঙ্গতিপূর্ণ, সেইসাথে এক্সটেনসিবল কাস্টম কলগুলি যা আপনি আপনার অ্যাপের জন্য অনন্য বিশেষ আচরণগুলিকে সংজ্ঞায়িত করতে ব্যবহার করেন৷
মিডিয়া সেশন
একটি মিডিয়া সেশন প্লেয়ারের সাথে সমস্ত যোগাযোগের জন্য দায়ী। এটি আপনার অ্যাপের বাকি অংশ থেকে প্লেয়ারের API লুকিয়ে রাখে। প্লেয়ারকে শুধুমাত্র মিডিয়া সেশন থেকে ডাকা হয় যা এটি নিয়ন্ত্রণ করে।
সেশনটি প্লেয়ারের অবস্থার একটি প্রতিনিধিত্ব বজায় রাখে (বাজানো/পজ করা) এবং কী খেলছে সে সম্পর্কে তথ্য। একটি সেশন এক বা একাধিক মিডিয়া কন্ট্রোলার থেকে কলব্যাক গ্রহণ করতে পারে। এটি আপনার প্লেয়ারকে আপনার অ্যাপের UI এবং Wear OS এবং Android Auto চালিত সহচর ডিভাইস দ্বারা নিয়ন্ত্রিত করা সম্ভব করে তোলে। যে যুক্তি কলব্যাকের সাড়া দেয় তা অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে। কোন ক্লায়েন্ট অ্যাপ কলব্যাক শুরু করুক না কেন একটি MediaSession
কলব্যাকের প্রতিক্রিয়া একই হওয়া উচিত।
মিডিয়া কন্ট্রোলার
একটি মিডিয়া কন্ট্রোলার আপনার UI বিচ্ছিন্ন করে। আপনার UI কোড শুধুমাত্র মিডিয়া কন্ট্রোলারের সাথে যোগাযোগ করে, প্লেয়ারের সাথে নয়। মিডিয়া কন্ট্রোলার ট্রান্সপোর্ট কন্ট্রোল অ্যাকশনকে মিডিয়া সেশনে কলব্যাকে অনুবাদ করে। এটি মিডিয়া সেশন থেকে কলব্যাক গ্রহণ করে যখনই সেশনের অবস্থা পরিবর্তিত হয়। এটি স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট UI আপডেট করার জন্য একটি প্রক্রিয়া প্রদান করে। একটি মিডিয়া কন্ট্রোলার একবারে শুধুমাত্র একটি মিডিয়া সেশনের সাথে সংযোগ করতে পারে।
আপনি যখন একটি মিডিয়া কন্ট্রোলার এবং একটি মিডিয়া সেশন ব্যবহার করেন, আপনি রানটাইমে বিভিন্ন ইন্টারফেস এবং/অথবা প্লেয়ার স্থাপন করতে পারেন। যে ডিভাইসে এটি চলছে তার ক্ষমতার উপর নির্ভর করে আপনি স্বাধীনভাবে আপনার অ্যাপের চেহারা এবং/অথবা কর্মক্ষমতা পরিবর্তন করতে পারেন।
ভিডিও অ্যাপ বনাম অডিও অ্যাপ
একটি ভিডিও চালানোর সময়, আপনার চোখ এবং কান উভয়ই নিযুক্ত থাকে। অডিও চালানোর সময়, আপনি শুনছেন, কিন্তু আপনি একই সময়ে একটি ভিন্ন অ্যাপের সাথে কাজ করতে পারেন। প্রতিটি ব্যবহারের ক্ষেত্রে একটি ভিন্ন নকশা আছে।
ভিডিও অ্যাপ
একটি ভিডিও অ্যাপের বিষয়বস্তু দেখার জন্য একটি উইন্ডো প্রয়োজন। এই কারণে একটি ভিডিও অ্যাপ সাধারণত একটি একক Android কার্যকলাপ হিসাবে প্রয়োগ করা হয়। যে স্ক্রীনে ভিডিওটি প্রদর্শিত হয় সেটি কার্যকলাপের অংশ।
অডিও অ্যাপ
একটি অডিও প্লেয়ারের সর্বদা তার UI দৃশ্যমান থাকার প্রয়োজন নেই। একবার এটি অডিও চালাতে শুরু করলে, প্লেয়ারটি একটি ব্যাকগ্রাউন্ড টাস্ক হিসাবে চালাতে পারে। ব্যবহারকারী অন্য অ্যাপে স্যুইচ করতে পারেন এবং শোনার সময় কাজ করতে পারেন।
অ্যান্ড্রয়েডে এই নকশাটি বাস্তবায়ন করতে, আপনি দুটি উপাদান ব্যবহার করে একটি অডিও অ্যাপ তৈরি করতে পারেন: UI এর জন্য একটি কার্যকলাপ এবং প্লেয়ারের জন্য একটি পরিষেবা৷ ব্যবহারকারী অন্য অ্যাপে স্যুইচ করলে, পরিষেবাটি ব্যাকগ্রাউন্ডে চলতে পারে। একটি অডিও অ্যাপের দুটি অংশকে আলাদা কম্পোনেন্টে ফ্যাক্টর করে, প্রতিটি তার নিজের থেকে আরও দক্ষতার সাথে চালাতে পারে। একটি UI সাধারণত একটি প্লেয়ারের তুলনায় স্বল্পস্থায়ী হয়, যা একটি UI ছাড়াই দীর্ঘ সময়ের জন্য চলতে পারে।
সমর্থন লাইব্রেরি এই ক্লায়েন্ট/সার্ভার পদ্ধতি বাস্তবায়নের জন্য দুটি ক্লাস প্রদান করে: MediaBrowserService
এবং MediaBrowser
। পরিষেবা উপাদানটি মিডিয়া সেশন এবং এর প্লেয়ার ধারণকারী MediaBrowserService
এর একটি সাবক্লাস হিসাবে প্রয়োগ করা হয়। UI এবং মিডিয়া কন্ট্রোলারের সাথে কার্যকলাপে একটি MediaBrowser
অন্তর্ভুক্ত করা উচিত, যা MediaBrowserService
সাথে যোগাযোগ করে।
MediaBrowserService
ব্যবহার করা আপনার অ্যাপের UI অ্যাক্টিভিটি অ্যাক্সেস না করেই সহচর ডিভাইসগুলির (যেমন Android Auto এবং Wear) জন্য আপনার অ্যাপ আবিষ্কার করা, এতে সংযোগ করা, বিষয়বস্তু ব্রাউজ করা এবং প্লেব্যাক নিয়ন্ত্রণ করা সহজ করে তোলে। প্রকৃতপক্ষে, একই সময়ে একই MediaBrowserService
এর সাথে একাধিক অ্যাপ সংযুক্ত থাকতে পারে, প্রতিটি অ্যাপের নিজস্ব MediaController
সহ। একটি MediaBrowserService
অফার করে এমন একটি অ্যাপ একাধিক একযোগে সংযোগ পরিচালনা করতে সক্ষম হওয়া উচিত।
মিডিয়া অ্যাপ এবং অ্যান্ড্রয়েড অডিও অবকাঠামো
একটি ভাল-ডিজাইন করা মিডিয়া অ্যাপ অডিও চালায় এমন অন্যান্য অ্যাপের সাথে "একসাথে ভাল খেলতে হবে"। এটি ফোন শেয়ার করার জন্য এবং আপনার ডিভাইসে অডিও ব্যবহার করে এমন অন্যান্য অ্যাপের সাথে সহযোগিতা করার জন্য প্রস্তুত হওয়া উচিত। এটি ডিভাইসে হার্ডওয়্যার নিয়ন্ত্রণগুলিতেও সাড়া দিতে হবে।
এই সমস্ত আচরণ কন্ট্রোলিং অডিও আউটপুটে বর্ণনা করা হয়েছে।
মিডিয়া-কম্প্যাট লাইব্রেরি
মিডিয়া-কম্প্যাট লাইব্রেরিতে এমন ক্লাস রয়েছে যা অডিও এবং ভিডিও চালায় এমন অ্যাপ তৈরির জন্য সহায়ক। এই ক্লাসগুলি Android 2.3 (API লেভেল 9) এবং উচ্চতর চলমান ডিভাইসগুলির সাথে সামঞ্জস্যপূর্ণ। তারা একটি আরামদায়ক, পরিচিত Android অভিজ্ঞতা তৈরি করতে অন্যান্য Android বৈশিষ্ট্যগুলির সাথেও কাজ করে৷
মিডিয়া সেশন এবং মিডিয়া কন্ট্রোলারের প্রস্তাবিত বাস্তবায়ন হল MediaSessionCompat
এবং MediaControllerCompat
ক্লাস, যেগুলি মিডিয়া-কম্প্যাট সমর্থন লাইব্রেরিতে সংজ্ঞায়িত করা হয়েছে। এগুলি অ্যান্ড্রয়েড 5.0 (এপিআই স্তর 21) এ প্রবর্তিত MediaSession
এবং MediaController
ক্লাসের আগের সংস্করণগুলি প্রতিস্থাপন করে। কম্প্যাট ক্লাসগুলি একই কার্যকারিতা অফার করে তবে আপনার অ্যাপটি বিকাশ করা আরও সহজ করে তোলে কারণ আপনাকে শুধুমাত্র একটি API এ লিখতে হবে। লাইব্রেরি মিডিয়া সেশন পদ্ধতিগুলিকে পুরানো প্ল্যাটফর্ম সংস্করণগুলিতে উপলব্ধ হলে সমতুল্য পদ্ধতিতে অনুবাদ করে পশ্চাদপদ সামঞ্জস্যের যত্ন নেয়।
আপনার যদি ইতিমধ্যেই পুরানো ক্লাস ব্যবহার করে এমন একটি কার্যকরী অ্যাপ থাকে তবে আমরা কমপ্যাট ক্লাসে আপডেট করার পরামর্শ দিই। আপনি যখন কম্প্যাট সংস্করণগুলি ব্যবহার করেন তখন আপনি RemoteControlClient
থেকে registerMediaButtonReceiver()
এবং যেকোনো পদ্ধতিতে সমস্ত কল মুছে ফেলতে পারেন।
পরিমাপ কর্মক্ষমতা
Android 8.0 (API স্তর 26) এবং পরবর্তীতে, getMetrics()
পদ্ধতি কিছু মিডিয়া ক্লাসের জন্য উপলব্ধ। এটি একটি PersistableBundle
অবজেক্ট প্রদান করে যার মধ্যে কনফিগারেশন এবং কর্মক্ষমতা তথ্য রয়েছে, যা বৈশিষ্ট্য এবং মানগুলির মানচিত্র হিসাবে প্রকাশ করা হয়েছে। getMetrics()
পদ্ধতি এই মিডিয়া ক্লাসের জন্য সংজ্ঞায়িত করা হয়েছে:
-
MediaPlayer.getMetrics()
-
MediaRecorder.getMetrics()
-
MediaCodec.getMetrics()
-
MediaExtractor.getMetrics()
প্রতিটি উদাহরণের জন্য মেট্রিক্স আলাদাভাবে সংগ্রহ করা হয় এবং দৃষ্টান্তের জীবনকাল ধরে থাকে। যদি কোন মেট্রিক্স উপলব্ধ না হয় তবে পদ্ধতিটি শূন্য প্রদান করে। প্রত্যাবর্তিত প্রকৃত মেট্রিক্স ক্লাসের উপর নির্ভর করে।