- "ক্লিয়ারটেক্সট HTTP ট্রাফিক অনুমোদিত নয়" সমস্যার সমাধান করা
- "SSLHandshakeException", "CertPathValidatorException" এবং "ERR_CERT_AUTHORITY_INVALID" সমস্যার সমাধান করা
- কিছু মিডিয়া ফাইল কেন সিক করা যায় না?
- কিছু MP3 ফাইলে কেন ভুলভাবে খোঁজা হচ্ছে?
- আমার ভিডিওতে সিকিং করার প্রসেস ধীরে চলছে কেন?
- কিছু MPEG-TS ফাইল কেন চালানো যায় না?
- কিছু MPEG-TS ফাইলে সাবটাইটেল কেন পাওয়া যায় না?
- কিছু MP4/FMP4 ফাইল কেন সঠিকভাবে প্লে হয় না?
- HTTP রেসপন্স কোড 301 বা 302 সহ কিছু স্ট্রিম কেন কাজ করে না?
- কিছু স্ট্রিম কেন UnrecognizedInputFormatException দিয়ে ব্যর্থ হয়?
- কিছু ডিভাইসে setPlaybackParameters কেন ঠিকমতো কাজ করে না?
- "প্লেয়ার ভুল থ্রেডে অ্যাক্সেস করা হয়েছে" সমস্যার অর্থ কী?
- "অপ্রত্যাশিত স্ট্যাটাস লাইন: ICY 200 OK" সমস্যাটি কীভাবে সমাধান করব?
- যে স্ট্রিম চালানো হচ্ছে সেটি লাইভ স্ট্রিম কিনা তা আমি কীভাবে কোয়েরি করব?
- আমার অ্যাপ ব্যাকগ্রাউন্ডে চলে গেলেও কীভাবে অডিও চালানো চালিয়ে যাব?
- ExoPlayer আমার কন্টেন্ট সাপোর্ট করলেও ExoPlayer Cast লাইব্রেরি কেন করে না?
- কন্টেন্ট কেন চালানো যায় না, কিন্তু কোনও সমস্যা দেখা যায় না?
- প্লেব্যাকের জন্য লোড ও ব্যবহার করার জন্য আমি কীভাবে ডিকোডিং লাইব্রেরি পেতে পারি?
- আমি কি ExoPlayer-এর মাধ্যমে সরাসরি YouTube ভিডিও চালাতে পারি?
- ভিডিও প্লেব্যাক আটকে যাচ্ছে
- অস্থির API লিন্ট সংক্রান্ত সমস্যা
"ক্লিয়ারটেক্সট HTTP ট্রাফিক অনুমোদিত নয়" সমস্যার সমাধান করা
আপনার অ্যাপ যদি ক্লিয়ারটেক্সট HTTP ট্রাফিক (অর্থাৎ,
http:// https://-এর পরিবর্তে) অনুরোধ করে, তাহলে এই সমস্যাটি হবে, যখন এর নেটওয়ার্ক নিরাপত্তা কনফিগারেশন
সেটির অনুমতি দেয় না। আপনার অ্যাপ Android 9 (API লেভেল 28) বা এর পরের যেকোনও ভার্সনকে টার্গেট করলে, ডিফল্ট কনফিগারেশনের মাধ্যমে cleartext
HTTP ট্রাফিক বন্ধ করে দেওয়া হয়।
আপনার অ্যাপকে যদি ক্লিয়ারটেক্সট HTTP ট্রাফিকের সাথে কাজ করতে হয়, তাহলে আপনাকে এমন
নেটওয়ার্ক নিরাপত্তা কনফিগারেশন ব্যবহার করতে হবে যা এটির অনুমতি দেয়। বিস্তারিত জানতে Android-এর
নেটওয়ার্ক সুরক্ষা সংক্রান্ত ডকুমেন্টেশন
দেখুন। সমস্ত ক্লিয়ারটেক্সট HTTP ট্রাফিক চালু করতে, আপনি নিজের অ্যাপের
AndroidManifest.xml-এর application এলিমেন্টে
android:usesCleartextTraffic="true" যোগ করতে পারেন।
ExoPlayer ডেমো অ্যাপ ডিফল্ট নেটওয়ার্ক নিরাপত্তা কনফিগারেশন ব্যবহার করে এবং তাই এটি ক্লিয়ারটেক্সট HTTP ট্রাফিকের অনুমতি দেয় না। উপরে দেওয়া নির্দেশাবলী ব্যবহার করে আপনি এটি চালু করতে পারবেন।
"SSLHandshakeException", "CertPathValidatorException" এবং "ERR_CERT_AUTHORITY_INVALID" সমস্যার সমাধান করা
SSLHandshakeException, CertPathValidatorException এবং
ERR_CERT_AUTHORITY_INVALID এই সবকটিই সার্ভারের SSL
সার্টিফিকেটে কোনও সমস্যা আছে বলে ইঙ্গিত করে। এইসব সমস্যা ExoPlayer-এর সাথে নির্দিষ্ট নয়। আরও বিবরণের জন্য
Android-এর SSL ডকুমেন্টেশন
দেখুন।
কিছু মিডিয়া ফাইল কেন সিক করা যায় না?
সাধারণত, ExoPlayer এমন মিডিয়াতে খোঁজার সুবিধা দেয় না যেখানে সঠিক খোঁজার অপারেশন পারফর্ম করার একমাত্র পদ্ধতি হল প্লেয়ারকে সম্পূর্ণ ফাইল স্ক্যান ও ইন্ডেক্স করতে হবে। ExoPlayer এই ধরনের ফাইলকে আনসিক্যাবল হিসেবে বিবেচনা করে। বেশিরভাগ আধুনিক মিডিয়া কন্টেনার ফর্ম্যাটে খোঁজার জন্য মেটাডেটা (যেমন, স্যাম্পেল ইন্ডেক্স) অন্তর্ভুক্ত থাকে, এতে ভালভাবে সংজ্ঞায়িত খোঁজার অ্যালগরিদম (যেমন, Ogg-এর জন্য ইন্টারপোলেটেড বাইসেকশন সার্চ) থাকে অথবা এতে থাকা কন্টেন্ট যে কনস্ট্যান্ট বিটরেট তা নির্দেশ করে। এইসব ক্ষেত্রে ExoPlayer-এর মাধ্যমে দক্ষতার সাথে খোঁজার অপারেশন সম্ভব এবং কাজ করে।
আপনার খোঁজার প্রয়োজন হলে কিন্তু খোঁজার অযোগ্য মিডিয়া থাকলে, আমরা সাজেস্ট করি যে আরও উপযুক্ত কন্টেনার ফর্ম্যাট ব্যবহার করার জন্য আপনার কন্টেন্ট কনভার্ট করুন। MP3, ADTS ও AMR ফাইলের ক্ষেত্রে, আপনি এও ধরে নিতে পারেন যে ফাইলের বিটরেট ধ্রুবক এবং সেই অনুযায়ী সিকিং চালু করতে পারেন। এই বিষয়ে এখানে বর্ণনা করা হয়েছে।
কিছু MP3 ফাইলে কেন খোঁজা সংক্রান্ত তথ্য সঠিক হয় না?
ভেরিয়েবল বিটরেট (VBR) MP3 ফাইলগুলি মূলত সেইসব ব্যবহারের ক্ষেত্রে অনুপযুক্ত যেগুলিতে সঠিকভাবে খোঁজার প্রয়োজন হয়। এর দুটি কারণ আছে:
- সঠিকভাবে খোঁজার জন্য, কন্টেনার ফর্ম্যাট সাধারণত হেডারে সঠিক টাইম-টু-বাইট ম্যাপিং প্রদান করবে। এই ম্যাপিংয়ের মাধ্যমে কোনও প্লেয়ার অনুরোধ করা খোঁজার সময়কে সংশ্লিষ্ট বাইট অফসেটে ম্যাপ করতে এবং সেই অফসেট থেকে মিডিয়া অনুরোধ, পার্স ও চালানো শুরু করতে পারে। MP3-তে এই ম্যাপিং নির্দিষ্ট করার জন্য উপলভ্য হেডার (যেমন, XING হেডার) দুর্ভাগ্যবশত প্রায়ই অনিশ্চিত হয়।
- যেসব কন্টেনার ফর্ম্যাটে সঠিক টাইম-টু-বাইট ম্যাপিং (বা কোনও টাইম-টু-বাইট ম্যাপিং) প্রদান করা হয় না, সেগুলির ক্ষেত্রেও যদি কন্টেনারে স্ট্রিমের মধ্যে অ্যাবসলিউট স্যাম্পেল টাইমস্ট্যাম্প থাকে, তাহলে সঠিক সিক পারফর্ম করা সম্ভব। এই ক্ষেত্রে, কোনও প্লেয়ার সংশ্লিষ্ট বাইট অফসেটের সেরা অনুমান অনুযায়ী সিক টাইম ম্যাপ করতে পারে, সেই অফসেট থেকে মিডিয়া অনুরোধ করা শুরু করতে পারে, প্রথম অ্যাবসলিউট স্যাম্পেল টাইমস্ট্যাম্প পার্স করতে পারে এবং সঠিক স্যাম্পেল না পাওয়া পর্যন্ত মিডিয়ার মধ্যে কার্যকরভাবে একটি নির্দেশিত বাইনারি সার্চ পারফর্ম করতে পারে। দুর্ভাগ্যবশত, MP3-তে স্ট্রিমের মধ্যে অ্যাবসলিউট স্যাম্পেল টাইমস্ট্যাম্প থাকে না, তাই এই পদ্ধতিটি সম্ভব নয়।
এইসব কারণে, VBR MP3 ফাইলে সঠিক সিক পারফর্ম করার একমাত্র উপায় হল
সম্পূর্ণ ফাইল স্ক্যান করা এবং প্লেয়ারে ম্যানুয়ালি টাইম-টু-বাইট ম্যাপিং
তৈরি করা। FLAG_ENABLE_INDEX_SEEKING ব্যবহার করে এই স্ট্র্যাটেজি চালু করা যেতে পারে,
যা setMp3ExtractorFlags ব্যবহার করে DefaultExtractorsFactory-এ সেট করা যেতে পারে। মনে রাখবেন, এটি বড় MP3 ফাইলের ক্ষেত্রে ভালভাবে স্কেল করে না,
বিশেষ করে ব্যবহারকারী প্লেব্যাক শুরু করার কিছুক্ষণ পরে স্ট্রিমের শেষ
দিকে যেতে চাইলে, যার জন্য প্লেয়ারকে স্ট্রিমটি ডাউনলোড
এবং ইন্ডেক্স না করা পর্যন্ত অপেক্ষা করতে হবে। ExoPlayer-এ, আমরা
এই ক্ষেত্রে নির্ভুলতার চেয়ে স্পিড অপ্টিমাইজ করার সিদ্ধান্ত নিয়েছি এবং
FLAG_ENABLE_INDEX_SEEKING তাই ডিফল্ট হিসেবে বন্ধ করা আছে।
আপনি যদি নিজের চালানো মিডিয়া কন্ট্রোল করেন, তাহলে আমরা আপনাকে MP4-এর মতো আরও উপযুক্ত কন্টেনার ফর্ম্যাট ব্যবহার করার জন্য বিশেষভাবে সাজেস্ট করি। MP3 হল সেরা মিডিয়া ফর্ম্যাট, এমন কোনও ব্যবহারিক প্রয়োগের ব্যাপারে আমরা অবগত নই।
আমার ভিডিওতে সিকিং করার প্রসেস ধীরে ধীরে হচ্ছে কেন?
প্লেয়ার যখন কোনও ভিডিওতে নতুন প্লেব্যাক পজিশনে যায়, তখন এটিকে দুটি কাজ করতে হয়:
- নতুন প্লেব্যাক পজিশনের সাথে সম্পর্কিত ডেটা বাফারে লোড করুন (এই ডেটা আগে থেকেই বাফার করা থাকলে এটি করার প্রয়োজন নাও হতে পারে)।
- নতুন প্লেব্যাক পজিশনের আগে ভিডিও ডিকোডার ফ্ল্যাশ করুন এবং I-ফ্রেম (কীফ্রেম) থেকে ডিকোডিং শুরু করুন। এর কারণ হল, বেশিরভাগ ভিডিও কম্প্রেশন ফর্ম্যাট ইন্ট্রা-ফ্রেম কোডিং ব্যবহার করে। সঠিকভাবে খোঁজা হয়েছে কিনা তা নিশ্চিত করতে (অর্থাৎ, প্লেব্যাক ঠিক সেই পজিশন থেকে শুরু হয় যেখানে খোঁজা হয়েছে), আগের I-ফ্রেম ও খোঁজার পজিশনের মধ্যে থাকা সব ফ্রেমকে ডিকোড করে অবিলম্বে ডিসকার্ড করতে হবে (স্ক্রিনে না দেখিয়ে)।
(১)-এর কারণে হওয়া লেটেন্সি, প্লেয়ারের মেমরিতে বাফার করা ডেটার পরিমাণ বাড়িয়ে অথবা ডিস্কে ডেটা প্রি-ক্যাশিং করে কমানো যেতে পারে।
ExoPlayer.setSeekParameters ব্যবহার করে খোঁজার অ্যাকুরেসি কমিয়ে অথবা আরও ঘন ঘন I-ফ্রেম পেতে ভিডিওটি আবার এনকোড করে (এর ফলে আউটপুট ফাইলটি আরও বড় হবে)
(২) দ্বারা প্রবর্তিত লেটেন্সি কমানো যেতে পারে।
কিছু MPEG-TS ফাইল কেন চালানো যায় না?
কিছু MPEG-TS ফাইলে অ্যাক্সেস ইউনিট ডিলিমিটার (AUD) থাকে না। সাধারণত, ফ্রেমের সীমানা কম খরচে শনাক্ত করার জন্য ExoPlayer AUD-এর উপর নির্ভর করে। একইভাবে, কিছু MPEG-TS ফাইলে IDR কীফ্রেম থাকে না। ডিফল্ট হিসেবে, ExoPlayer শুধুমাত্র এই ধরনের কীফ্রেম বিবেচনা করে।
AUD বা IDR কীফ্রেম নেই এমন
MPEG-TS ফাইল চালানোর জন্য বলা হলে, ExoPlayer বাফারিং অবস্থায় আটকে আছে বলে মনে হবে। এই ধরনের ফাইল চালাতে চাইলে,
আপনি যথাক্রমে FLAG_DETECT_ACCESS_UNITS এবং
FLAG_ALLOW_NON_IDR_KEYFRAMES ব্যবহার করে তা করতে পারবেন। setTsExtractorFlags ব্যবহার করে DefaultExtractorsFactory-এ
কনস্ট্রাক্টর ব্যবহার করে DefaultHlsExtractorFactory-এ
এইসব ফ্ল্যাগ সেট করা যেতে পারে।
FLAG_DETECT_ACCESS_UNITS ব্যবহারের কোনও পার্শ্বপ্রতিক্রিয়া নেই, তবে AUD-এর উপর ভিত্তি করে ফ্রেম বাউন্ডারি ডিটেকশনের তুলনায়
এটি গণনা করার জন্য অনেক বেশি রিসোর্স প্রয়োজন। কিছু MPEG-TS ফাইল চালানোর সময় প্লেব্যাকের শুরুতে এবং সিক করার সাথে সাথেই
FLAG_ALLOW_NON_IDR_KEYFRAMES ব্যবহার করলে
অস্থায়ী ভিজ্যুয়াল করাপশন হতে পারে।
কিছু MPEG-TS ফাইলে সাবটাইটেল কেন পাওয়া যায় না?
কিছু MPEG-TS ফাইলে CEA-608 ট্র্যাক অন্তর্ভুক্ত থাকে, কিন্তু সেগুলি
কন্টেনার মেটাডেটায় ঘোষণা করা হয় না, তাই ExoPlayer সেগুলি শনাক্ত করতে পারে না। আপনি DefaultExtractorsFactory-এ প্রত্যাশিত সাবটাইটেল ফর্ম্যাটের
একটি তালিকা প্রদান করে যেকোনও সাবটাইটেল ট্র্যাক ম্যানুয়ালি
নির্দিষ্ট করতে পারেন, এর মধ্যে অ্যাক্সেসিবিলিটি
চ্যানেলও অন্তর্ভুক্ত যা MPEG-TS স্ট্রিমে সেগুলি শনাক্ত করতে ব্যবহার করা যেতে পারে:
Kotlin
val extractorsFactory = DefaultExtractorsFactory() .setTsSubtitleFormats( listOf( Format.Builder() .setSampleMimeType(MimeTypes.APPLICATION_CEA608) .setAccessibilityChannel(accessibilityChannel) // Set other subtitle format info, such as language. .build() ) ) val player: Player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()
জাভা
DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory() .setTsSubtitleFormats( ImmutableList.of( new Format.Builder() .setSampleMimeType(MimeTypes.APPLICATION_CEA608) .setAccessibilityChannel(accessibilityChannel) // Set other subtitle format info, such as language. .build())); Player player = new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory)) .build();
কিছু MP4/FMP4 ফাইল কেন সঠিকভাবে প্লে হয় না?
কিছু MP4/FMP4 ফাইলে এডিট লিস্ট থাকে যা স্যাম্পেলের তালিকা এড়িয়ে যাওয়া, সরানো বা রিপিট করার মাধ্যমে মিডিয়া টাইমলাইন আবার লেখে। এডিট তালিকা প্রয়োগ করার জন্য ExoPlayer-এ আংশিক সহায়তা আছে। যেমন, এটি সিঙ্ক্রোনাইজেশন স্যাম্পেল থেকে শুরু হওয়া স্যাম্পেলের গ্রুপকে বিলম্বিত বা রিপিট করতে পারে, কিন্তু এটি এডিট করার জন্য অডিও স্যাম্পেল বা প্রিরোল মিডিয়াকে ট্রানকেট করে না যা সিঙ্ক্রোনাইজেশন স্যাম্পেল থেকে শুরু হয় না।
আপনি যদি দেখেন যে মিডিয়ার কোনও অংশ অপ্রত্যাশিতভাবে অনুপস্থিত বা পুনরাবৃত্তি হয়েছে,
তাহলে Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS বা
FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS সেট করার চেষ্টা করুন, যা
এক্সট্র্যাক্টরকে এডিট তালিকা সম্পূর্ণভাবে উপেক্ষা করতে বাধ্য করবে। এগুলি setMp4ExtractorFlags বা
setFragmentedMp4ExtractorFlags ব্যবহার করে কোনও
DefaultExtractorsFactory-এ সেট করা যেতে পারে।
HTTP রেসপন্স কোড 301 বা 302 সহ কিছু স্ট্রিম কেন কাজ করে না?
HTTP রেসপন্স কোড ৩০০ ও ৩০২, দুটিই রিডাইরেকশন নির্দেশ করে। সংক্ষিপ্ত বিবরণ Wikipedia-তে পাওয়া যাবে। ExoPlayer কোনও অনুরোধ করলে এবং স্ট্যাটাস কোড 301 বা 302 সহ উত্তর পেলে, এটি সাধারণত রিডাইরেক্ট অনুসরণ করবে এবং স্বাভাবিকভাবে প্লেব্যাক শুরু করবে। ডিফল্ট হিসেবে এটি ঘটে না এমন একটি ক্ষেত্র হল ক্রস-প্রোটোকল রিডাইরেক্ট। ক্রস-প্রোটোকল রিডাইরেক্ট হল এমন একটি রিডাইরেক্ট যা HTTPS থেকে HTTP বা এর বিপরীত দিকে (বা তুলনামূলকভাবে কম সাধারণ, অন্য কোনও প্রোটোকলের মধ্যে) রিডাইরেক্ট করে। কোনও URL-এর কারণে ক্রস-প্রোটোকল রিডাইরেক্ট হচ্ছে কিনা তা আপনি নিম্নলিখিত wget কমান্ড লাইন টুলের সাহায্যে পরীক্ষা করে দেখতে পারেন:
wget "https://yourserver.example.com/test.mp3" 2>&1 | grep Location
আউটপুটটি এই ধরনের দেখতে হবে:
Location: https://secondserver.example.net/test.mp3 [following]
Location: http://thirdserver.example.org/test.mp3 [following]
এই উদাহরণে, দুটি রিডাইরেক্ট আছে। প্রথম রিডাইরেক্টটি
https://yourserver.example.com/test.mp3 থেকে
https://secondserver.example.net/test.mp3-এ করা হয়েছে। দুটিই HTTPS, তাই এটি
ক্রস-প্রোটোকল রিডাইরেক্ট নয়। দ্বিতীয় রিডাইরেক্টটি
https://secondserver.example.net/test.mp3 থেকে
http://thirdserver.example.org/test.mp3-এ হয়েছে। এটি HTTPS থেকে HTTP-তে রিডাইরেক্ট করে এবং
তাই এটি একটি ক্রস-প্রোটোকল রিডাইরেক্ট। ExoPlayer-এর ডিফল্ট কনফিগারেশনে
এই রিডাইরেক্ট ফলো করা হবে না, অর্থাৎ প্লেব্যাক কাজ করবে না।
প্রয়োজন হলে, আপনার
অ্যাপ্লিকেশনে ব্যবহৃত DefaultHttpDataSource.Factory ইনস্ট্যান্স ইনস্ট্যানশিয়েট করার সময়, ক্রস-প্রোটোকল রিডাইরেক্ট
ফলো করার জন্য আপনি ExoPlayer কনফিগার করতে পারবেন। নেটওয়ার্ক স্ট্যাক বেছে নেওয়া ও কনফিগার করা সম্পর্কে
এখান থেকে জানুন।
কিছু স্ট্রিম কেন UnrecognizedInputFormatException দিয়ে ব্যর্থ হয়?
এই প্রশ্নটি নিম্নলিখিত ফর্মের প্লেব্যাক ব্যর্থতা সম্পর্কিত:
UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.
এটি না হওয়ার দুটি সম্ভাব্য কারণ আছে। সবচেয়ে সাধারণ কারণ হল যে
আপনি DASH (mpd), HLS (m3u8) বা SmoothStreaming (ism, isml)
কন্টেন্ট চালানোর চেষ্টা করছেন, কিন্তু প্লেয়ার সেটি প্রোগ্রেসিভ স্ট্রিম হিসেবে চালানোর চেষ্টা করছে। এই ধরনের
স্ট্রিম চালাতে, আপনাকে অবশ্যই সংশ্লিষ্ট ExoPlayer মডিউলের উপর নির্ভর করতে হবে। যেসব ক্ষেত্রে
স্ট্যান্ডার্ড ফাইল এক্সটেনশন দিয়ে স্ট্রিম URI শেষ হয় না, সেখানে আপনি
MimeTypes.APPLICATION_MPD, MimeTypes.APPLICATION_M3U8 বা
MimeTypes.APPLICATION_SS-এর মাধ্যমে MediaItem.Builder-এর setMimeType-এ স্ট্রিমের ধরন স্পষ্টভাবে
নির্দিষ্ট করতে পারেন।
দ্বিতীয়, তুলনামূলক কম সাধারণ কারণ হল, আপনি যে মিডিয়া চালানোর চেষ্টা করছেন, ExoPlayer সেটির কন্টেনার ফর্ম্যাট সাপোর্ট করে না। এই ক্ষেত্রে, কাজ না করাটা যেমন হওয়ার কথা তেমনই হয়েছে, তবে কন্টেনার ফর্ম্যাট ও টেস্ট স্ট্রিমের বিবরণ সহ আমাদের ইস্যু ট্র্যাকার-এ ফিচার অনুরোধ জমা দিতে দ্বিধা করবেন না। নতুন অনুরোধ জমা দেওয়ার আগে, আগে থেকে থাকা কোনও ফিচারের অনুরোধ সার্চ করে দেখুন।
কিছু ডিভাইসে setPlaybackParameters কেন ঠিকমতো কাজ করে না?
Android M ও এর আগের যেকোনও ভার্সনে আপনার অ্যাপের কোনও ডিবাগ বিল্ড চালানোর সময়, setPlaybackParameters API ব্যবহার করলে আপনি
অমসৃণ পারফর্ম্যান্স, শোনা যায় এমন আর্টিফ্যাক্ট ও CPU-এর বেশি ব্যবহার
সম্পর্কিত সমস্যার সম্মুখীন হতে পারেন। এর কারণ হল, Android-এর এইসব
ভার্সনে রান করা ডিবাগ বিল্ডের জন্য এই API-এর ক্ষেত্রে গুরুত্বপূর্ণ
অপ্টিমাইজেশন বন্ধ করা আছে।
এটি মনে রাখা গুরুত্বপূর্ণ যে এই সমস্যাটি শুধুমাত্র ডিবাগ বিল্ডকে প্রভাবিত করে। এটি রিলিজ বিল্ডকে প্রভাবিত করে না যেটির জন্য অপ্টিমাইজেশন সবসময় চালু থাকে। তাই, ব্যবহারকারীদের দেওয়া রিলিজের উপর এই সমস্যার কোনও প্রভাব পড়বে না।
"প্লেয়ার ভুল থ্রেডে অ্যাক্সেস করা হয়েছে" সমস্যার অর্থ কী?
শুরু করার পৃষ্ঠায় থ্রেডিং সম্পর্কে একটি নোট দেখুন।
"অপ্রত্যাশিত স্ট্যাটাস লাইন: ICY 200 OK" সমস্যাটি কীভাবে সমাধান করব?
সার্ভারের উত্তরে HTTP মেনে চলা স্ট্যাটাস লাইনের পরিবর্তে ICY স্ট্যাটাস লাইন থাকলে এই সমস্যা হতে পারে। ICY স্ট্যাটাস লাইন আর ব্যবহার করা হয় না এবং ব্যবহার করা উচিত নয়, তাই আপনি সার্ভার কন্ট্রোল করলে, HTTP মেনে চলে এমন উত্তর দেওয়ার জন্য আপনাকে এটি আপডেট করতে হবে। আপনি এটি করতে না পারলে, ExoPlayer OkHttp লাইব্রেরি ব্যবহার করলে সমস্যার সমাধান হয়ে যাবে, কারণ এটি ICY স্ট্যাটাস লাইন সঠিকভাবে ম্যানেজ করতে পারে।
যে স্ট্রিম চালানো হচ্ছে সেটি লাইভ স্ট্রিম কিনা তা আমি কীভাবে কোয়েরি করতে পারি?
আপনি প্লেয়ারের isCurrentWindowLive মেথড কোয়েরি করতে পারবেন। এছাড়াও, উইন্ডোটি ডায়নামিক কিনা তা জানতে
আপনি isCurrentWindowDynamic চেক করতে পারেন
(অর্থাৎ, সময়ের সাথে সাথে এখনও আপডেট হচ্ছে)।
আমার অ্যাপ ব্যাকগ্রাউন্ডে চলে গেলেও কীভাবে অডিও চালানো চালিয়ে যাব?
আপনার অ্যাপ ব্যাকগ্রাউন্ডে থাকাকালীন অডিওর একটানা প্লেব্যাক নিশ্চিত করতে এইসব ধাপ অনুসরণ করুন:
- আপনার একটি চালু ফোরগ্রাউন্ড পরিষেবা থাকতে হবে। এর ফলে, রিসোর্স খালি করার জন্য সিস্টেম আপনার প্রসেস বন্ধ করতে পারবে না।
- আপনাকে
WifiLockওWakeLockধরে রাখতে হবে। এগুলি নিশ্চিত করে যে সিস্টেম ওয়াই-ফাই রেডিও ও সিপিইউকে অ্যাক্টিভ রাখে।setWakeModeকল করেExoPlayerব্যবহার করলে এটি সহজেই করা যেতে পারে, যা সঠিক সময়ে প্রয়োজনীয় লক অটোমেটিক অ্যাকোয়ার ও রিলিজ করবে।
অডিও আর না বাজানো হলে, যত তাড়াতাড়ি সম্ভব লক রিলিজ করা (setWakeMode ব্যবহার না করলে) এবং পরিষেবা বন্ধ করা
গুরুত্বপূর্ণ।
ExoPlayer আমার কন্টেন্ট সাপোর্ট করলেও ExoPlayer Cast লাইব্রেরি কেন করে না?
আপনি যে কন্টেন্ট চালানোর চেষ্টা করছেন সেটি হয়ত CORS চালু করা নয়। কাস্ট ফ্রেমওয়ার্ক-এর মাধ্যমে কন্টেন্ট চালানোর জন্য সেটিতে CORS চালু থাকতে হবে।
কন্টেন্ট কেন চালানো যায় না, কিন্তু কোনও সমস্যা দেখা যায় না?
সম্ভবত, আপনি যে ডিভাইসে কন্টেন্ট চালাচ্ছেন সেটি নির্দিষ্ট মিডিয়া স্যাম্পেল ফর্ম্যাট
সাপোর্ট করে না। আপনার প্লেয়ারে লিসনার হিসেবে
EventLogger যোগ করে এবং Logcat-এ এই ধরনের
লাইন খুঁজে দেখে এটি সহজেই কনফার্ম করা যায়:
[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE
NO_UNSUPPORTED_TYPE মানে হল, mimeType-এর নির্দিষ্ট করা মিডিয়া
স্যাম্পেল ফর্ম্যাট ডিভাইসটি ডিকোড করতে পারছে না। কোন কোন স্যাম্পেল ফর্ম্যাট কাজ করে সেই বিষয়ে জানতে Android মিডিয়া ফর্ম্যাট
ডকুমেন্টেশন দেখুন। প্লেব্যাক করার জন্য লোড ও ব্যবহার করা যায় এমন
ডিকোডিং লাইব্রেরি আমি কীভাবে পেতে পারি? প্রশ্নটিও সহায়ক হতে পারে।
প্লেব্যাকের জন্য লোড ও ব্যবহার করার জন্য আমি কীভাবে ডিকোডিং লাইব্রেরি পেতে পারি?
- বেশিরভাগ ডিকোডার লাইব্রেরিতে ডিপেন্ডেন্সি চেক-আউট ও বিল্ড করার জন্য ম্যানুয়াল ধাপ থাকে, তাই নিশ্চিত করুন যে আপনি প্রাসঙ্গিক লাইব্রেরির README-তে দেওয়া ধাপগুলি অনুসরণ করেছেন। যেমন, ExoPlayer FFmpeg লাইব্রেরির জন্য, libraries/decoder_ffmpeg/README.md-এ দেওয়া নির্দেশাবলী অনুসরণ করা প্রয়োজন, এর মধ্যে আপনি যে ফর্ম্যাট চালাতে চান তার জন্য ডিকোডার চালু করার কনফিগারেশন ফ্ল্যাগ পাস করা অন্তর্ভুক্ত।
- যেসব লাইব্রেরিতে নেটিভ কোড আছে, সেগুলির ক্ষেত্রে README-এ উল্লেখ করা Android NDK-এর সঠিক
ভার্সন ব্যবহার করছেন কিনা তা নিশ্চিত করুন এবং কনফিগারেশন ও বিল্ড করার সময় কোনও
সমস্যা হচ্ছে কিনা তা দেখুন। README-এ দেওয়া ধাপগুলি অনুসরণ করার পরে, প্রতিটি
সাপোর্ট করা আর্কিটেকচারের জন্য লাইব্রেরির পাথের
libsসাবডিরেক্টরিতে.soফাইল দেখতে পাবেন। - ডেমো অ্যাপ্লিকেশন-এ লাইব্রেরি ব্যবহার করে প্লেব্যাক করার চেষ্টা করতে, বান্ডেল করা ডিকোডার চালু করা দেখুন। আপনার নিজের অ্যাপ থেকে লাইব্রেরি ব্যবহার করার নির্দেশাবলীর জন্য লাইব্রেরির README দেখুন।
- আপনি
DefaultRenderersFactoryব্যবহার করলে, ডিকোডার লোড হওয়ার সময় Logcat-এ "Loaded FfmpegAudioRenderer"-এর মতো তথ্য-লেভেলের লগ লাইন দেখতে পাবেন। সেটি না থাকলে, নিশ্চিত করুন যে অ্যাপ্লিকেশনটি ডিকোডিং লাইব্রেরির উপর নির্ভরশীল। - Logcat-এ
LibraryLoaderথেকে সতর্কতা লেভেলের লগ দেখতে পেলে, এটি বোঝায় যে লাইব্রেরির নেটিভ কম্পোনেন্ট লোড করা যায়নি। এমনটি হলে, লাইব্রেরির README-তে দেওয়া ধাপগুলি সঠিকভাবে অনুসরণ করেছেন কিনা তা চেক করুন এবং নির্দেশাবলী অনুসরণ করার সময় কোনও ত্রুটি আউটপুট হয়নি কিনা তা দেখুন।
আপনি এখনও ডিকোডিং লাইব্রেরি ব্যবহার করার সময় সমস্যার সম্মুখীন হলে, কোনও প্রাসঙ্গিক সাম্প্রতিক সমস্যা আছে কিনা তা জানতে Media3 সমস্যা ট্র্যাকার চেক করুন। আপনাকে যদি নতুন কোনও সমস্যার ব্যাপারে অভিযোগ জানাতে হয় এবং সেটি যদি লাইব্রেরির নেটিভ অংশ তৈরি করার সাথে সম্পর্কিত হয়, তাহলে README নির্দেশাবলী চালানোর সম্পূর্ণ কমান্ড লাইন আউটপুট অন্তর্ভুক্ত করুন। এটি আমাদের সমস্যাটি নির্ণয় করতে সাহায্য করবে।
আমি কি ExoPlayer-এর মাধ্যমে সরাসরি YouTube ভিডিও চালাতে পারি?
না, ExoPlayer YouTube থেকে ভিডিও চালাতে পারে না, যেমন এই ধরনের URL
https://www.youtube.com/watch?v=.... এর পরিবর্তে, আপনাকে YouTube
IFrame Player API ব্যবহার করতে হবে,
যা Android-এ YouTube ভিডিও চালানোর অফিসিয়াল পদ্ধতি।
ভিডিও প্লেব্যাক আটকে যাচ্ছে
ডিভাইসটি কন্টেন্ট দ্রুত ডিকোড করতে নাও পারতে পারে, যেমন, কন্টেন্টের বিটরেট বা রেজোলিউশন ডিভাইসের ক্ষমতা অতিক্রম করলে। এই ধরনের ডিভাইসে ভালো পারফর্ম্যান্স পেতে হলে আপনাকে খারাপ কোয়ালিটির কন্টেন্ট ব্যবহার করতে হতে পারে।
Android 6.0 (API লেভেল 23) থেকে শুরু করে Android 11 (API লেভেল 30) পর্যন্ত যেকোনও ভার্সনে ভিডিও স্টাটারিং হলে, বিশেষ করে DRM সুরক্ষিত বা হাই-ফ্রেম-রেট কন্টেন্ট চালানোর সময়, আপনি অ্যাসিঙ্ক্রোনাস বাফার কিউয়িং চালু করে দেখতে পারেন।
অস্থিতিশীল API লিন্ট সংক্রান্ত সমস্যা
Media3, API সারফেসের একটি সাবসেটের জন্য বাইনারি কম্প্যাটিবিলিটির গ্যারান্টি দেয়। যেসব পার্ট বাইনারি মানানসই হওয়ার গ্যারান্টি দেয় না, সেগুলি
@UnstableApi দিয়ে চিহ্নিত করা হয়। এই পার্থক্য স্পষ্ট করার জন্য, @OptIn দিয়ে অ্যানোটেট করা না থাকলে, আনস্টেবল
API সিম্বল ব্যবহার করলে লিন্ট এরর তৈরি হয়।
@UnstableApi অ্যানোটেশন API-এর কোয়ালিটি বা পারফর্ম্যান্স সম্পর্কে কিছু জানায় না, এটি শুধু এই তথ্য দেয় যে এটি "API-ফ্রিজ" করা নেই।
অস্থিতিশীল API লিন্ট সংক্রান্ত সমস্যার সমাধান করার জন্য আপনার কাছে দুটি বিকল্প আছে:
- একই ফলাফল পাওয়া যায় এমন স্টেবল API ব্যবহার করুন।
- অস্থির API ব্যবহার করা চালিয়ে যান এবং পরে দেখানো
@OptIn-এর মাধ্যমে ব্যবহার অ্যানোটেট করুন।
@OptIn অ্যানোটেশন যোগ করুন
Android Studio আপনাকে অ্যানোটেশন যোগ করতে সাহায্য করতে পারে:
এছাড়াও, আপনি নির্দিষ্ট ব্যবহারের সাইট ম্যানুয়ালি ট্যাগ করতে পারবেন:
Kotlin
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }
জাভা
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }
package-info ফাইল যোগ করে সম্পূর্ণ প্যাকেজ অপ্ট-ইন করা যেতে পারে:
Kotlin
// In your package-info.kt
@OptIn(UnstableApi::class)
package name.of.your.package
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
জাভা
// In your package-info.java
@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
পুরো প্রোজেক্টের জন্য, সেটির
lint.xml ফাইলে নির্দিষ্ট লিন্ট সংক্রান্ত সমস্যা এড়িয়ে গিয়ে অপ্ট-ইন করা যেতে পারে:
<?xml version="1.0" encoding="utf-8"?>
<lint>
<issue id="UnsafeOptInUsageError">
<option name="opt-in" value="androidx.media3.common.util.UnstableApi" />
</issue>
</lint>
এছাড়াও, একটি kotlin.OptIn অ্যানোটেশন আছে যা ব্যবহার করা উচিত নয়। androidx.annotation.OptIn অ্যানোটেশন ব্যবহার করা
গুরুত্বপূর্ণ।