HDR یا محدوده دینامیکی بالا، طیف وسیعتری از رنگها و کنتراست بیشتری بین روشنترین سفیدها و تاریکترین سایهها ارائه میدهد و در نتیجه کیفیت ویدیو بیشتر شبیه به چیزی است که چشم غیرمسلح درک میکند.
شما میتوانید پخش ویدیوی HDR را در برنامه خود تنظیم کنید تا محتوای ویدیوی HDR را پیشنمایش و پخش کنید.
این مقاله فرض میکند که شما از قبل پشتیبانی اولیه پخش ویدیو را به برنامه خود اضافه کردهاید. برای جزئیات بیشتر در مورد پخش، به مستندات ExoPlayer مراجعه کنید.
پیشنیازهای دستگاه
همه دستگاههای اندروید از پخش HDR پشتیبانی نمیکنند. قبل از پخش محتوای ویدیویی HDR در برنامه خود، بررسی کنید که آیا دستگاه شما پیشنیازهای زیر را دارد یا خیر:
- اندروید ۷.۰ یا بالاتر (لایه API ۲۴) را هدف قرار میدهد.
- دارای رمزگشای HDR و دسترسی به صفحه نمایش با قابلیت HDR.
پشتیبانی از پخش HDR را بررسی کنید
 از Display.getHdrCapabilities() برای جستجوی قابلیتهای HDR یک نمایشگر استفاده کنید. این متد اطلاعاتی در مورد پروفایلهای HDR پشتیبانیشده و محدوده روشنایی نمایشگر را برمیگرداند.
کد زیر بررسی میکند که آیا دستگاه از پخش HLG10 پشتیبانی میکند یا خیر. از اندروید ۱۳ به بعد، HLG10 حداقل استانداردی است که سازندگان دستگاه باید در صورت قابلیت پخش HDR در دستگاه، از آن پشتیبانی کنند:
کاتلین
// Check if display supports the HDR type val capabilities = display?.hdrCapabilities?.supportedHdrTypes ?: intArrayOf() if (!capabilities.contains(HDR_TYPE_HLG)) { throw RuntimeException("Display does not support desired HDR type"); }
جاوا
// Check if display supports the HDR type int[] list = getDisplay().getHdrCapabilities().getSupportedHdrTypes(); Listcapabilities = Arrays.stream(list).boxed().collect(Collectors.toList()); if (!capabilities.contains(HDR_TYPE_HLG)) { throw new RuntimeException("Display does not support desired HDR type"); } 
پخش HDR را در برنامه خود تنظیم کنید
اگر برنامه شما از ExoPlayer استفاده میکند، به طور پیشفرض از پخش HDR پشتیبانی میکند. برای مراحل بعدی، به بررسی پشتیبانی از پخش HDR مراجعه کنید.
 اگر برنامه شما از ExoPlayer استفاده نمیکند، پخش HDR را با استفاده از MediaCodec از طریق SurfaceView تنظیم کنید.
راهاندازی MediaCodec با استفاده از SurfaceView
 با استفاده از SurfaceView یک جریان پخش استاندارد MediaCodec تنظیم کنید. این به شما امکان میدهد محتوای ویدیویی HDR را بدون هیچ گونه دستکاری خاصی برای پخش HDR نمایش دهید:
-  MediaCodec: محتوای ویدیویی HDR را رمزگشایی میکند.
-  SurfaceView: محتوای ویدیویی HDR را نمایش میدهد.
 کد زیر بررسی میکند که آیا کدک از پروفایل HDR پشتیبانی میکند یا خیر، سپس MediaCodec با استفاده از SurfaceView تنظیم میکند: 
کاتلین
// Check if there's a codec that supports the specific HDR profile val list = MediaCodecList(MediaCodecList.REGULAR_CODECS) var format = MediaFormat() /* media format from the container */; format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AV1ProfileMain10) val codecName = list.findDecoderForFormat (format) ?: throw RuntimeException ("No codec supports the format") // Here is a standard MediaCodec playback flow val codec: MediaCodec = MediaCodec.createByCodecName(codecName); val surface: Surface = surfaceView.holder.surface val callback: MediaCodec.Callback = (object : MediaCodec.Callback() { override fun onInputBufferAvailable(codec: MediaCodec, index: Int) { queue.offer(index) } override fun onOutputBufferAvailable( codec: MediaCodec, index: Int, info: MediaCodec.BufferInfo ) { codec.releaseOutputBuffer(index, timestamp) } override fun onError(codec: MediaCodec, e: MediaCodec.CodecException) { // handle error } override fun onOutputFormatChanged( codec: MediaCodec, format: MediaFormat ) { // handle format change } }) codec.setCallback(callback) codec.configure(format, surface, crypto, 0 /* flags */) codec.start() while (/* until EOS */) { val index = queue.poll() val buffer = codec.getInputBuffer(index) buffer?.put(/* write bitstream */) codec.queueInputBuffer(index, offset, size, timestamp, flags) } codec.stop() codec.release()
جاوا
// Check if there's a codec that supports the specific HDR profile MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS); MediaFormat format = /* media format from the container */; format.setInteger( MediaFormat.KEY_PROFILE, CodecProfileLevel.AV1ProfileMain10); String codecName = list.findDecoderForFormat(format); if (codecName == null) { throw new RuntimeException("No codec supports the format"); } // Below is a standard MediaCodec playback flow MediaCodec codec = MediaCodec.getCodecByName(codecName); Surface surface = surfaceView.getHolder().getSurface(); MediaCodec.Callback callback = new MediaCodec.Callback() { @Override void onInputBufferAvailable(MediaCodec codec, int index) { queue.offer(index); } @Override void onOutputBufferAvailable(MediaCodec codec, int index) { // release the buffer for render codec.releaseOutputBuffer(index, timestamp); } @Override void onOutputFormatChanged(MediaCodec codec, MediaFormat format) { // handle format change } @Override void onError(MediaCodec codec, MediaCodec.CodecException ex) { // handle error } }; codec.setCallback(callback); codec.configure(format, surface, crypto, 0 /* flags */); codec.start(); while (/* until EOS */) { int index = queue.poll(); ByteBuffer buffer = codec.getInputBuffer(index); buffer.put(/* write bitstream */); codec.queueInputBuffer(index, offset, size, timestamp, flags); } codec.stop(); codec.release();
 برای پیادهسازیهای بیشتر MediaCodec با استفاده از SurfaceView ، به نمونههای دوربین اندروید مراجعه کنید.
منابع
برای اطلاعات بیشتر در مورد پخش HDR، به منابع زیر مراجعه کنید:
اچدیآر
- ضبط ویدیوی HDR : یاد بگیرید چگونه ضبط ویدیوی HDR را با استفاده از API های Camera2 تنظیم کنید.
- نمونه Camera2Video در گیتهاب : یک برنامه کاربردی با قابلیت ضبط و پخش HDR را ببینید.
رسانه
- مرجع API رسانه : درباره APIهای رسانه بیشتر بدانید.
- ExoPlayer : یاد بگیرید چگونه برنامه خود را با کتابخانه ExoPlayer تنظیم کنید.
