View a markdown version of this page

Kasus Penggunaan Lanjutan untuk IVS Android Broadcast SDK | Streaming Low-Latency - Amazon IVS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Kasus Penggunaan Lanjutan untuk IVS Android Broadcast SDK | Streaming Low-Latency

Di sini kami menyajikan beberapa kasus penggunaan lanjutan. Mulailah dengan pengaturan dasar di atas dan lanjutkan di sini.

Membuat Konfigurasi Siaran

Di sini kita membuat konfigurasi khusus dengan dua slot mixer yang memungkinkan kita untuk mengikat dua sumber video ke mixer. Satu (custom) adalah layar penuh dan diletakkan di belakang yang lain (camera), yang lebih kecil dan di sudut kanan bawah. Perhatikan bahwa untuk custom slot kami tidak mengatur posisi, ukuran, atau mode aspek. Karena kami tidak mengatur parameter ini, slot akan menggunakan pengaturan video untuk ukuran dan posisi.

BroadcastConfiguration config = BroadcastConfiguration.with($ -> { $.audio.setBitrate(128_000); $.video.setMaxBitrate(3_500_000); $.video.setMinBitrate(500_000); $.video.setInitialBitrate(1_500_000); $.video.setSize(1280, 720); $.mixer.slots = new BroadcastConfiguration.Mixer.Slot[] { BroadcastConfiguration.Mixer.Slot.with(slot -> { // Do not automatically bind to a source slot.setPreferredAudioInput( Device.Descriptor.DeviceType.UNKNOWN); // Bind to user image if unbound slot.setPreferredVideoInput( Device.Descriptor.DeviceType.USER_IMAGE); slot.setName("custom"); return slot; }), BroadcastConfiguration.Mixer.Slot.with(slot -> { slot.setzIndex(1); slot.setAspect(BroadcastConfiguration.AspectMode.FILL); slot.setSize(300, 300); slot.setPosition($.video.getSize().x - 350, $.video.getSize().y - 350); slot.setName("camera"); return slot; }) }; return $; });

Buat Sesi Siaran (Versi Lanjutan)

Buat BroadcastSession seperti yang Anda lakukan dalam contoh dasar, tetapi berikan konfigurasi khusus Anda di sini. Juga sediakan null untuk array perangkat, karena kami akan menambahkannya secara manual.

// Create a broadcast-session instance and sign up to receive broadcast // events and errors. Context ctx = getApplicationContext(); broadcastSession = new BroadcastSession(ctx, broadcastListener, config, // The configuration we created above null); // We’ll manually attach devices after

Iterasi dan Pasang Perangkat Kamera

Di sini kami mengulangi melalui perangkat input yang telah dideteksi SDK. Di Android 7 (Nougat) ini hanya akan mengembalikan perangkat mikrofon default, karena Amazon IVS Broadcast SDK tidak mendukung pemilihan perangkat non-default pada versi Android ini.

Setelah kami menemukan perangkat yang ingin kami gunakan, kami memanggil attachDevice untuk melampirkannya. Fungsi lambda dipanggil pada utas utama saat memasang perangkat input telah selesai. Jika terjadi kegagalan, Anda akan menerima kesalahan di Listener.

for(Device.Descriptor desc: BroadcastSession.listAvailableDevices(getApplicationContext())) { if(desc.type == Device.Descriptor.DeviceType.CAMERA && desc.position == Device.Descriptor.Position.FRONT) { session.attachDevice(desc, device -> { LinearLayout previewHolder = findViewById(R.id.previewHolder); ImagePreviewView preview = ((ImageDevice)device).getPreviewView(); preview.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); previewHolder.addView(preview); // Bind the camera to the mixer slot we created above. session.getMixer().bind(device, "camera"); }); break; } }

Tukar Kamera

// This assumes you’ve kept a reference called "currentCamera" that points to // a front facing camera for(Device device: BroadcastSession.listAvailableDevices()) { if(device.type == Device.Descriptor.DeviceType.CAMERA && Device.position != currentCamera.position) { // Remove the preview view for the old device. // setImagePreviewTextureView is an example function // that handles your view hierarchy. setImagePreviewView(null); session.exchangeDevices(currentCamera, device, camera -> { // Set the preview view for the new device. setImagePreviewView(camera.getPreviewView()); currentCamera = camera; }); break; } }

Buat Permukaan Input

Untuk memasukkan data suara atau gambar yang dihasilkan aplikasi Anda, gunakan, createImageInputSource ataucreateAudioInputSource. Kedua metode ini membuat dan melampirkan perangkat virtual yang dapat diikat ke mixer seperti perangkat lainnya.

Yang SurfaceSource dikembalikan oleh createImageInputSource memiliki getInputSurface metode, yang akan memberi Anda Surface yang dapat Anda gunakan dengan Camera2 API, OpenGL, atau Vulkan, atau apa pun yang dapat menulis ke Surface.

Yang AudioDevice dikembalikan oleh createAudioInputSource dapat menerima data PCM Linear yang dihasilkan oleh AudioRecorder atau cara lain.

SurfaceSource source = session.createImageInputSource(); Surface surface = source.getInputSurface(); session.getMixer().bind(source, “custom”);

Lepaskan Perangkat

Jika Anda ingin melepaskan dan tidak mengganti perangkat, lepaskan dengan Device atau. Device.Descriptor

session.detachDevice(currentCamera);

Tangkapan Audio Layar dan Sistem

Amazon IVS Broadcast SDK untuk Android menyertakan beberapa pembantu yang menyederhanakan pengambilan layar perangkat (Android 6 dan lebih tinggi) dan audio sistem (Android 10 dan lebih tinggi). Jika Anda ingin mengelolanya secara manual, Anda dapat membuat sumber input gambar khusus dan sumber input audio khusus.

Untuk membuat sesi pengambilan audio layar dan sistem, Anda harus terlebih dahulu membuat maksud permission-request:

public void startScreenCapture() { MediaProjectionManager manager = (MediaProjectionManager) getApplicationContext() .getSystemService(Context.MEDIA_PROJECTION_SERVICE); if(manager != null) { Intent intent = manager.createScreenCaptureIntent(); startActivityIfNeeded(intent, SCREEN_CAPTURE_REQUEST_ID); } }

Untuk menggunakan fitur ini, Anda harus menyediakan kelas yang diperluascom.amazonaws.ivs.broadcast.SystemCaptureService. Anda tidak harus mengganti salah satu metodenya, tetapi kelas harus ada di sana untuk menghindari potensi tabrakan antar layanan.

Anda juga harus menambahkan beberapa elemen ke manifes Android Anda:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <application ...> <service android:name=".ExampleSystemCaptureService" android:foregroundServiceType="mediaProjection" android:isolatedProcess="false" /> </application> ...

Kelas Anda yang SystemCaptureService diperluas harus diberi nama dalam <service> elemen. Di Android 9 dan yang lebih baru, foregroundServiceType harusmediaProjection.

Setelah maksud izin kembali, Anda dapat melanjutkan dengan membuat layar dan sesi pengambilan audio sistem. Di Android 8 dan yang lebih baru, Anda harus memberikan pemberitahuan untuk ditampilkan di Panel Pemberitahuan pengguna Anda. Amazon IVS Broadcast SDK untuk Android menyediakan metode createServiceNotificationBuilder kenyamanan. Sebagai alternatif, Anda dapat memberikan pemberitahuan Anda sendiri.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode != SCREEN_CAPTURE_REQUEST_ID || Activity.RESULT_OK != resultCode) { return; } Notification notification = null; if(Build.VERSION.SDK_INT >= 26) { Intent intent = new Intent(getApplicationContext(), NotificationActivity.class); notification = session .createServiceNotificationBuilder("example", "example channel", intent) .build(); } session.createSystemCaptureSources(data, ExampleSystemCaptureService.class, Notification, devices -> { // This step is optional if the mixer slots have been given preferred // input device types SCREEN and SYSTEM_AUDIO for (Device device : devices) { session.getMixer().bind(device, "game"); } }); }

Untuk mengevaluasi koneksi pengguna Anda sebelum memulai siaran, gunakan recommendedVideoSettings metode untuk menjalankan tes singkat. Saat pengujian berjalan, Anda akan menerima beberapa rekomendasi, dipesan dari yang paling banyak hingga yang paling tidak direkomendasikan. Dalam versi SDK ini, tidak mungkin untuk mengkonfigurasi ulang saat iniBroadcastSession, jadi Anda akan membutuh release() kannya dan kemudian membuat yang baru dengan pengaturan yang disarankan. Anda akan terus menerima BroadcastSessionTest.Results sampai Result.status ada SUCCESS atauERROR. Anda dapat memeriksa kemajuan denganResult.progress.

Amazon IVS mendukung bitrate maksimum 8,5 Mbps (untuk saluran yang type STANDARD atauADVANCED), sehingga yang maximumBitrate dikembalikan oleh metode ini tidak pernah melebihi 8,5 Mbps. Untuk memperhitungkan fluktuasi kecil dalam kinerja jaringan, yang disarankan initialBitrate dikembalikan oleh metode ini sedikit kurang dari bitrate sebenarnya yang diukur dalam pengujian. (Menggunakan 100% dari bandwidth yang tersedia biasanya tidak disarankan.)

void runBroadcastTest() { this.test = session.recommendedVideoSettings(RTMPS_ENDPOINT, RTMPS_STREAMKEY, result -> { if (result.status == BroadcastSessionTest.Status.SUCCESS) { this.recommendation = result.recommendations[0]; } }); }

Menggunakan Auto-Reconnect

IVS mendukung koneksi ulang otomatis ke siaran jika siaran berhenti secara tak terduga tanpa memanggil stop API; misalnya, kehilangan sementara dalam konektivitas jaringan. Untuk mengaktifkan koneksi ulang otomatis, hubungisetEnabled(true). BroadcastConfiguration.autoReconnect

Ketika sesuatu menyebabkan aliran berhenti secara tak terduga, SDK mencoba lagi hingga 5 kali, mengikuti strategi mundur linier. Ini memberi tahu aplikasi Anda tentang status coba lagi melalui metode. BroadcastSession.Listener.onRetryStateChanged

Di balik layar, auto-reconnect menggunakan fungsionalitas pengambilalihan aliran IVS dengan menambahkan nomor prioritas, dimulai dengan 1, ke akhir kunci aliran yang disediakan. Untuk durasi BroadcastSession instance, angka itu bertambah 1 setiap kali koneksi ulang dicoba. Ini berarti jika koneksi perangkat terputus 4 kali selama siaran, dan setiap kehilangan memerlukan 1-4 upaya coba lagi, prioritas streaming terakhir bisa berada di antara 5 dan 17. Karena itu, kami sarankan Anda tidak menggunakan pengambilalihan aliran IVS dari perangkat lain saat koneksi ulang otomatis diaktifkan di SDK untuk saluran yang sama. Tidak ada jaminan prioritas apa yang digunakan SDK pada saat itu, dan SDK akan mencoba menyambung kembali dengan prioritas yang lebih tinggi jika perangkat lain mengambil alih.

Menggunakan Mikrofon Bluetooth

Untuk menyiarkan menggunakan perangkat mikrofon Bluetooth, Anda harus memulai koneksi Bluetooth SCO:

Bluetooth.startBluetoothSco(context); // Now bluetooth microphones can be used … // Must also stop bluetooth SCO Bluetooth.stopBluetoothSco(context);