সমস্যা সমাধান


"ক্লিয়ারটেক্সট HTTP ট্র্যাফিক অনুমোদিত নয়" ত্রুটিগুলি ঠিক করা হচ্ছে৷

এই ত্রুটিটি ঘটবে যদি আপনার অ্যাপ ক্লিয়ারটেক্সট HTTP ট্র্যাফিকের অনুরোধ করে (অর্থাৎ, https:// http:// ) যখন এর নেটওয়ার্ক নিরাপত্তা কনফিগারেশন এটির অনুমতি দেয় না। আপনার অ্যাপ যদি Android 9 (API লেভেল 28) বা উচ্চতরকে লক্ষ্য করে, তাহলে ক্লিয়ারটেক্সট 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 ফাইলগুলি মৌলিকভাবে ব্যবহারের ক্ষেত্রে অনুপযুক্ত যেগুলির জন্য সঠিক অনুসন্ধানের প্রয়োজন৷ এই জন্য দুটি কারণ আছে:

  1. সঠিক অনুসন্ধানের জন্য, একটি ধারক বিন্যাস আদর্শভাবে একটি শিরোনামে একটি সুনির্দিষ্ট টাইম-টু-বাইট ম্যাপিং প্রদান করবে। এই ম্যাপিং একজন খেলোয়াড়কে সংশ্লিষ্ট বাইট অফসেটে অনুরোধ করা সময়কে ম্যাপ করতে এবং সেই অফসেট থেকে মিডিয়ার অনুরোধ, পার্সিং এবং প্লে করা শুরু করতে দেয়। MP3 তে এই ম্যাপিং নির্দিষ্ট করার জন্য উপলব্ধ হেডার (যেমন XING শিরোনাম) দুর্ভাগ্যবশত, প্রায়শই ভুল।
  2. কন্টেইনার ফরম্যাটগুলির জন্য যেগুলি একটি সুনির্দিষ্ট টাইম-টু-বাইট ম্যাপিং (বা কোনও টাইম-টু-বাইট ম্যাপিং) প্রদান করে না, তবে কন্টেইনারটিতে স্ট্রীমে নিখুঁত নমুনা টাইমস্ট্যাম্প অন্তর্ভুক্ত থাকলে একটি সঠিক অনুসন্ধান করা এখনও সম্ভব। এই ক্ষেত্রে একজন খেলোয়াড় সংশ্লিষ্ট বাইট অফসেটের সর্বোত্তম অনুমানে অনুসন্ধানের সময়কে ম্যাপ করতে পারে, সেই অফসেট থেকে মিডিয়ার অনুরোধ করা শুরু করতে পারে, প্রথম পরম নমুনা টাইমস্ট্যাম্পটি পার্স করতে পারে এবং সঠিক নমুনা না পাওয়া পর্যন্ত মিডিয়াতে একটি নির্দেশিত বাইনারি অনুসন্ধান করতে পারে। . দুর্ভাগ্যবশত MP3 স্ট্রীমে নিখুঁত নমুনা টাইমস্ট্যাম্প অন্তর্ভুক্ত করে না, তাই এই পদ্ধতিটি সম্ভব নয়।

এই কারণে, একটি VBR MP3 ফাইলে সঠিক অনুসন্ধান করার একমাত্র উপায় হল পুরো ফাইলটি স্ক্যান করা এবং প্লেয়ারে ম্যানুয়ালি একটি টাইম-টু-বাইট ম্যাপিং তৈরি করা। এই কৌশলটি FLAG_ENABLE_INDEX_SEEKING ব্যবহার করে সক্ষম করা যেতে পারে, যা setMp3ExtractorFlags ব্যবহার করে একটি DefaultExtractorsFactory এ সেট করা যেতে পারে। মনে রাখবেন যে এটি বড় MP3 ফাইলগুলিতে ভালভাবে পরিমাপ করে না, বিশেষ করে যদি ব্যবহারকারী প্লেব্যাক শুরু করার কিছুক্ষণ পরেই স্ট্রিমের শেষের কাছাকাছি যাওয়ার চেষ্টা করে, যার জন্য প্লেয়ারকে অপেক্ষা করতে হবে যতক্ষণ না এটি ডাউনলোড করা হয় এবং অনুসন্ধানটি সম্পাদন করার আগে সম্পূর্ণ স্ট্রীমটি ইন্ডেক্স করা হয়। . ExoPlayer-এ, আমরা এই ক্ষেত্রে নির্ভুলতার চেয়ে গতির জন্য অপ্টিমাইজ করার সিদ্ধান্ত নিয়েছি এবং তাই FLAG_ENABLE_INDEX_SEEKING ডিফল্টরূপে অক্ষম করা হয়েছে৷

আপনি যে মিডিয়াটি চালাচ্ছেন তা নিয়ন্ত্রণ করলে, আমরা দৃঢ়ভাবে পরামর্শ দিই যে আপনি আরও উপযুক্ত কন্টেইনার ফর্ম্যাট ব্যবহার করুন, যেমন MP4৷ MP3 মিডিয়া ফর্ম্যাটের সর্বোত্তম পছন্দ যেখানে আমরা সচেতন আছি এমন কোনও ব্যবহারের ক্ষেত্রে নেই৷

আমার ভিডিওতে চাওয়া ধীর কেন?

প্লেয়ার যখন একটি ভিডিওতে একটি নতুন প্লেব্যাক অবস্থান খোঁজে তখন তাকে দুটি জিনিস করতে হবে:

  1. বাফারে নতুন প্লেব্যাক অবস্থানের সাথে সম্পর্কিত ডেটা লোড করুন (এই ডেটা ইতিমধ্যে বাফার করা থাকলে এটির প্রয়োজন নাও হতে পারে)।
  2. ভিডিও ডিকোডারটি ফ্লাশ করুন এবং নতুন প্লেব্যাক অবস্থানের আগে আই-ফ্রেম (কীফ্রেম) থেকে ডিকোডিং শুরু করুন, বেশিরভাগ ভিডিও কম্প্রেশন ফর্ম্যাটগুলির দ্বারা ব্যবহৃত ইন্ট্রা-ফ্রেম কোডিংয়ের কারণে৷ সিক সঠিক কিনা তা নিশ্চিত করার জন্য (অর্থাৎ, সিক পজিশনে প্লেব্যাক ঠিক শুরু হয়), পূর্ববর্তী আই-ফ্রেম এবং সিক পজিশনের মধ্যে সমস্ত ফ্রেমকে ডিকোড করতে হবে এবং অবিলম্বে বাতিল করতে হবে (স্ক্রীনে দেখানো ছাড়া)।

(1) দ্বারা প্রবর্তিত লেটেন্সি হয় প্লেয়ার দ্বারা মেমরিতে বাফার করা ডেটার পরিমাণ বাড়িয়ে বা ডিস্কে ডেটা প্রাক-ক্যাশ করে প্রশমিত করা যেতে পারে।

(2) দ্বারা প্রবর্তিত লেটেন্সিটি হয় ExoPlayer.setSeekParameters ব্যবহার করে অনুসন্ধানের নির্ভুলতা হ্রাস করে, অথবা আরও ঘন ঘন আই-ফ্রেম (যার ফলে একটি বড় আউটপুট ফাইল হবে) থাকার জন্য ভিডিওটিকে পুনরায় এনকোড করে প্রশমিত করা যেতে পারে।

কেন কিছু MPEG-TS ফাইল খেলতে ব্যর্থ হয়?

কিছু MPEG-TS ফাইলে অ্যাক্সেস ইউনিট ডিলিমিটার (AUDs) থাকে না। ডিফল্টরূপে, ExoPlayer সস্তায় ফ্রেমের সীমানা সনাক্ত করতে AUD-এর উপর নির্ভর করে। একইভাবে, কিছু MPEG-TS ফাইলে IDR কীফ্রেম থাকে না। ডিফল্টরূপে, এগুলিই ExoPlayer দ্বারা বিবেচিত একমাত্র ধরনের কীফ্রেম।

AUDs বা IDR কীফ্রেম নেই এমন MPEG-TS ফাইল চালাতে বলা হলে ExoPlayer বাফারিং অবস্থায় আটকে আছে বলে মনে হবে। আপনার যদি এই ধরনের ফাইলগুলি চালানোর প্রয়োজন হয়, আপনি যথাক্রমে FLAG_DETECT_ACCESS_UNITS এবং FLAG_ALLOW_NON_IDR_KEYFRAMES ব্যবহার করে তা করতে পারেন৷ এই পতাকাগুলি setTsExtractorFlags ব্যবহার করে একটি DefaultExtractorsFactory তে বা কনস্ট্রাক্টর ব্যবহার করে একটি DefaultHlsExtractorFactory এ সেট করা যেতে পারে। FLAG_DETECT_ACCESS_UNITS ব্যবহারে AUD ভিত্তিক ফ্রেম সীমানা সনাক্তকরণের তুলনায় গণনাগতভাবে ব্যয়বহুল হওয়া ছাড়া অন্য কোনও পার্শ্ব প্রতিক্রিয়া নেই। FLAG_ALLOW_NON_IDR_KEYFRAMES ব্যবহারের ফলে প্লেব্যাকের শুরুতে এবং কিছু MPEG-TS ফাইল চালানোর সময় অনুসন্ধানের পরপরই সাময়িকভাবে চাক্ষুষ দুর্নীতি হতে পারে।

কেন কিছু MPEG-TS ফাইলে সাবটাইটেল পাওয়া যায় না?

কিছু MPEG-TS ফাইলে CEA-608 ট্র্যাক অন্তর্ভুক্ত থাকে কিন্তু কন্টেইনার মেটাডেটাতে সেগুলি ঘোষণা করে না, তাই ExoPlayer সেগুলি সনাক্ত করতে অক্ষম৷ আপনি DefaultExtractorsFactory প্রত্যাশিত সাবটাইটেল ফরম্যাটের একটি তালিকা প্রদান করে যে কোনো সাবটাইটেল ট্র্যাক ম্যানুয়ালি নির্দিষ্ট করতে পারেন, যেখানে অ্যাক্সেসিবিলিটি চ্যানেলগুলি রয়েছে যা MPEG-TS স্ট্রীমে তাদের সনাক্ত করতে ব্যবহার করা যেতে পারে:

কোটলিন

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 প্রতিক্রিয়া কোড 301 এবং 302 উভয়ই পুনর্নির্দেশ নির্দেশ করে। সংক্ষিপ্ত বিবরণ উইকিপিডিয়ায় পাওয়া যাবে। যখন ExoPlayer একটি অনুরোধ করে এবং স্ট্যাটাস কোড 301 বা 302 সহ একটি প্রতিক্রিয়া পায়, তখন এটি সাধারণত পুনঃনির্দেশ অনুসরণ করবে এবং স্বাভাবিক হিসাবে প্লেব্যাক শুরু করবে। একটি ক্ষেত্রে যেখানে এটি ডিফল্টরূপে ঘটে না ক্রস-প্রটোকল পুনঃনির্দেশের জন্য। একটি ক্রস-প্রটোকল রিডাইরেক্ট হল এমন যেটি HTTPS থেকে HTTP বা বিপরীতে (অথবা কম সাধারণত, অন্য এক জোড়া প্রোটোকলের মধ্যে) রিডাইরেক্ট করে। আপনি নিম্নরূপ wget কমান্ড লাইন টুল ব্যবহার করে একটি URL ক্রস-প্রটোকল পুনঃনির্দেশিত করে কিনা তা পরীক্ষা করতে পারেন:

wget "https://yourserver.com/test.mp3" 2>&1  | grep Location

আউটপুট এই মত কিছু দেখতে হবে:

Location: https://second.com/test.mp3 [following]
Location: http://third.com/test.mp3 [following]

এই উদাহরণে, দুটি পুনঃনির্দেশ আছে। প্রথম পুনঃনির্দেশ হল https://yourserver.com/test.mp3 থেকে https://second.com/test.mp3 এ। উভয়ই HTTPS, এবং তাই এটি একটি ক্রস-প্রটোকল পুনর্নির্দেশ নয়। দ্বিতীয় পুনঃনির্দেশটি https://second.com/test.mp3 থেকে http://third.com/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), বা স্মুথস্ট্রিমিং (ism, isml) বিষয়বস্তু চালানোর চেষ্টা করছেন, কিন্তু প্লেয়ার এটি একটি প্রগতিশীল স্ট্রিম হিসাবে চালানোর চেষ্টা করে। এই ধরনের স্ট্রীম চালাতে, আপনাকে অবশ্যই সংশ্লিষ্ট ExoPlayer মডিউলের উপর নির্ভর করতে হবে। যে ক্ষেত্রে স্ট্রীম URI স্ট্যান্ডার্ড ফাইল এক্সটেনশনের সাথে শেষ হয় না, আপনি MimeTypes.APPLICATION_MPD , MimeTypes.APPLICATION_M3U8 বা MimeTypes.APPLICATION_SS MediaItem.Builder এর setMimeType করতেও পাস করতে পারেন৷ বিল্ডার স্পষ্টভাবে টাইপটি নির্দিষ্ট করতে৷

দ্বিতীয়, কম-সাধারণ কারণ হল যে ExoPlayer মিডিয়ার কন্টেইনার ফর্ম্যাটকে সমর্থন করে না যা আপনি চালানোর চেষ্টা করছেন। এই ক্ষেত্রে, ব্যর্থতা উদ্দেশ্য অনুযায়ী কাজ করছে, তবে আমাদের ইস্যু ট্র্যাকারে একটি বৈশিষ্ট্য অনুরোধ জমা দিতে নির্দ্বিধায়, কন্টেইনার ফর্ম্যাটের বিশদ এবং একটি পরীক্ষা স্ট্রিম সহ। একটি নতুন একটি জমা দেওয়ার আগে একটি বিদ্যমান বৈশিষ্ট্য অনুরোধ অনুসন্ধান করুন.

কেন কিছু ডিভাইসে প্লেব্যাক প্যারামিটারগুলি সঠিকভাবে কাজ করে না?

অ্যান্ড্রয়েড এম এবং তার আগে আপনার অ্যাপের একটি ডিবাগ বিল্ড চালানোর সময়, setPlaybackParameters এপিআই ব্যবহার করার সময় আপনি চপি পারফরম্যান্স, শ্রবণযোগ্য আর্টিফ্যাক্ট এবং উচ্চ সিপিইউ ব্যবহার অনুভব করতে পারেন। কারণ এই API-এর জন্য গুরুত্বপূর্ণ একটি অপ্টিমাইজেশন অ্যান্ড্রয়েডের এই সংস্করণগুলিতে চলমান ডিবাগ বিল্ডগুলির জন্য অক্ষম করা হয়েছে৷

এটা মনে রাখা গুরুত্বপূর্ণ যে এই সমস্যাটি শুধুমাত্র ডিবাগ বিল্ডকে প্রভাবিত করে। এটি রিলিজ বিল্ডকে প্রভাবিত করে না , যার জন্য সর্বদা অপ্টিমাইজেশান সক্রিয় থাকে। তাই শেষ ব্যবহারকারীদের জন্য আপনার প্রদান করা রিলিজ এই সমস্যা দ্বারা প্রভাবিত করা উচিত নয়।

"ভুল থ্রেডে প্লেয়ার অ্যাক্সেস করা হয়েছে" ত্রুটির অর্থ কী?

শুরু করার পৃষ্ঠায় থ্রেডিংয়ের উপর একটি নোট দেখুন।

আমি কিভাবে "অপ্রত্যাশিত স্থিতি লাইন: ICY 200 OK" ঠিক করতে পারি?

এই সমস্যাটি ঘটতে পারে যদি সার্ভারের প্রতিক্রিয়াতে HTTP অনুগত না হয়ে একটি ICY স্ট্যাটাস লাইন অন্তর্ভুক্ত থাকে। আইসিওয়াই স্ট্যাটাস লাইনগুলি অবহেলিত এবং ব্যবহার করা উচিত নয়, তাই আপনি যদি সার্ভার নিয়ন্ত্রণ করেন তবে আপনাকে একটি HTTP অনুগত প্রতিক্রিয়া প্রদান করতে এটি আপডেট করা উচিত। আপনি যদি এটি করতে অক্ষম হন তবে ExoPlayer OkHttp লাইব্রেরি ব্যবহার করলে সমস্যাটি সমাধান হবে, কারণ এটি ICY স্ট্যাটাস লাইন সঠিকভাবে পরিচালনা করতে সক্ষম।

যে স্ট্রিমটি চালানো হচ্ছে সেটি লাইভ স্ট্রিম কিনা তা আমি কীভাবে জিজ্ঞাসা করতে পারি?

আপনি প্লেয়ারের isCurrentWindowLive পদ্ধতিটি জিজ্ঞাসা করতে পারেন। উপরন্তু, উইন্ডোটি গতিশীল কিনা তা জানতে আপনি isCurrentWindowDynamic চেক করতে পারেন (অর্থাৎ সময়ের সাথে সাথে আপডেট হচ্ছে)।

আমার অ্যাপের ব্যাকগ্রাউন্ডে থাকা অবস্থায় আমি কীভাবে অডিও বাজিয়ে রাখব?

যখন আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকে তখন অডিওর ক্রমাগত প্লেব্যাক নিশ্চিত করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. আপনার একটি চলমান ফোরগ্রাউন্ড পরিষেবা থাকতে হবে। এটি রিসোর্স মুক্ত করার জন্য আপনার প্রক্রিয়াটিকে হত্যা করা থেকে সিস্টেমকে বাধা দেয়।
  2. আপনাকে একটি WifiLock এবং একটি WakeLock ধরে রাখতে হবে। এগুলি নিশ্চিত করে যে সিস্টেমটি ওয়াইফাই রেডিও এবং সিপিইউকে জাগ্রত রাখে৷ এটি সহজেই করা যেতে পারে যদি ExoPlayer ব্যবহার করে setWakeMode কল করে, যা স্বয়ংক্রিয়ভাবে সঠিক সময়ে প্রয়োজনীয় লকগুলি অর্জন করবে এবং ছেড়ে দেবে৷

এটি গুরুত্বপূর্ণ যে আপনি লকগুলি ছেড়ে দিন (যদি 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 লাইব্রেরির জন্য লাইব্রেরি/decoder_ffmpeg/README.md এর নির্দেশাবলী অনুসরণ করা প্রয়োজন, যার মধ্যে আপনি যে কোনো ফরম্যাটের জন্য ডিকোডার সক্ষম করতে কনফিগারেশন ফ্ল্যাগ পাস করা সহ।
  • যে লাইব্রেরিগুলির নেটিভ কোড আছে, তাদের জন্য নিশ্চিত করুন যে আপনি README-এ উল্লেখিত Android NDK-এর সঠিক সংস্করণ ব্যবহার করছেন এবং কনফিগারেশন এবং বিল্ডিংয়ের সময় প্রদর্শিত কোনও ত্রুটির জন্য দেখুন। আপনি দেখতে পাবেন .so ফাইলগুলি README-এর ধাপগুলি অনুসরণ করার পরে প্রতিটি সমর্থিত আর্কিটেকচারের জন্য লাইব্রেরির পাথের libs সাবডিরেক্টরিতে প্রদর্শিত হবে।
  • ডেমো অ্যাপ্লিকেশনে লাইব্রেরি ব্যবহার করে প্লেব্যাক চেষ্টা করার জন্য, বান্ডেলড ডিকোডার সক্রিয় করা দেখুন। আপনার নিজের অ্যাপ থেকে লাইব্রেরি ব্যবহার করার নির্দেশাবলীর জন্য লাইব্রেরির জন্য README দেখুন।
  • আপনি যদি DefaultRenderersFactory ব্যবহার করেন, তাহলে ডিকোডার লোড হওয়ার সময় Logcat-এ আপনার "লোড করা 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) থেকে অ্যান্ড্রয়েড 11 (API লেভেল 30) পর্যন্ত অ্যান্ড্রয়েড 6.0 (API লেভেল 30) পর্যন্ত এবং সহ, বিশেষ করে DRM সুরক্ষিত বা উচ্চ-ফ্রেম-রেট কন্টেন্ট খেলার সময় এমন কোনো ডিভাইসে ভিডিও তোতলাতে থাকেন অ্যাসিঙ্ক্রোনাস বাফার সারি সক্রিয় করার চেষ্টা করুন।

অস্থির API লিন্ট ত্রুটি৷

Media3 API পৃষ্ঠের একটি উপসেটের জন্য বাইনারি সামঞ্জস্যের গ্যারান্টি দেয়। যে অংশগুলি বাইনারি সামঞ্জস্যের গ্যারান্টি দেয় না সেগুলি @UnstableApi দিয়ে চিহ্নিত করা হয়েছে। এই পার্থক্যটি পরিষ্কার করার জন্য, অস্থির API চিহ্নগুলির ব্যবহার একটি লিন্ট ত্রুটি তৈরি করে যদি না সেগুলি @OptIn এর সাথে টীকা করা হয়।

@UnstableApi টীকাটি একটি API এর গুণমান বা কার্যকারিতা সম্পর্কে কিছুই বোঝায় না, কেবলমাত্র এটি "এপিআই-ফ্রোজেন" নয়।

অস্থির API লিন্ট ত্রুটিগুলি পরিচালনা করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে:

  • একটি স্থিতিশীল API ব্যবহার করতে স্যুইচ করুন যা একই ফলাফল অর্জন করে।
  • অস্থির API ব্যবহার চালিয়ে যান এবং @OptIn এর সাথে ব্যবহার টীকা করুন, যেমনটি পরে দেখানো হয়েছে।
@OptIn টীকা যোগ করুন

অ্যান্ড্রয়েড স্টুডিও আপনাকে টীকা যোগ করতে সাহায্য করতে পারে:

স্ক্রিনশট: কীভাবে অপটিন টীকা যোগ করবেন
চিত্র 2 : Android স্টুডিওর সাথে একটি @androidx.annotations.OptIn টীকা যোগ করা।

আপনি ম্যানুয়ালি কোটলিনে নির্দিষ্ট ব্যবহারের সাইটগুলিকে টীকা করতে পারেন:

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.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 টীকা ব্যবহার করা গুরুত্বপূর্ণ।