Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Kasus Penggunaan Tingkat Lanjut untuk Siaran IVS Android SDK | Streaming Latensi Rendah
Di sini kami menyajikan beberapa kasus penggunaan lanjutan. Mulailah dengan pengaturan dasar di atas dan lanjutkan di sini.
Buat Konfigurasi Siaran
Di sini kita membuat konfigurasi khusus dengan dua slot mixer yang memungkinkan kita untuk mengikat dua sumber video ke mixer. One (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 kustom 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 kita iterasi melalui perangkat input yang SDK telah terdeteksi. 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 thread utama ketika melampirkan 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; } }
Swap 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, digunakan, createImageInputSource
atau aplikasi AndacreateAudioInputSource
. 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 PCM data 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);
Layar dan Sistem Audio Capture
Amazon IVS Broadcast SDK untuk Android mencakup beberapa pembantu yang menyederhanakan menangkap layar perangkat (Android 5 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 permintaan izin:
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 meluas. com.amazonaws.ivs.broadcast.SystemCaptureService
Anda tidak perlu mengganti salah satu metodenya, tetapi kelas harus ada 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 meluas SystemCaptureService
harus diberi nama dalam <service>
elemen. Di Android 9 dan yang lebih baru, itu foregroundServiceType
harusmediaProjection
.
Setelah maksud izin kembali, Anda dapat melanjutkan dengan membuat sesi pengambilan audio layar dan sistem. Di Android 8 dan yang lebih baru, Anda harus memberikan notifikasi untuk ditampilkan di Panel Pemberitahuan pengguna Anda. Amazon IVS Broadcast SDK untuk Android menyediakan metode kenyamanancreateServiceNotificationBuilder
. 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"); } }); }
Dapatkan Pengaturan Siaran yang Disarankan
Untuk mengevaluasi koneksi pengguna Anda sebelum memulai siaran, gunakan recommendedVideoSettings
metode ini untuk menjalankan tes singkat. Saat tes berjalan, Anda akan menerima beberapa rekomendasi, dipesan dari yang paling banyak hingga yang paling tidak direkomendasikan. Dalam versi iniSDK, tidak mungkin untuk mengkonfigurasi ulang saat iniBroadcastSession
, jadi Anda harus release()
melakukannya 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 STANDARD
atauADVANCED
), sehingga yang type
maximumBitrate
dikembalikan oleh metode ini tidak pernah melebihi 8, 5 Mbps. Untuk memperhitungkan fluktuasi kecil dalam kinerja jaringan, yang direkomendasikan yang 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
IVSmendukung koneksi ulang otomatis ke siaran jika siaran berhenti secara tak terduga tanpa memanggil stop
API; misalnya, kehilangan sementara dalam konektivitas jaringan. Untuk mengaktifkan sambung ulang otomatis, hubungisetEnabled(true)
. BroadcastConfiguration.autoReconnect
Ketika sesuatu menyebabkan aliran berhenti secara tak terduga, SDK mencoba lagi hingga 5 kali, mengikuti strategi backoff linier. Ini memberi tahu aplikasi Anda tentang status coba lagi melalui metode iniBroadcastSession.Listener.onRetryStateChanged
.
Di belakang layar, sambungkan kembali otomatis menggunakan IVS fungsionalitas pengambilalihan aliran dengan menambahkan nomor prioritas, dimulai dengan 1, hingga akhir kunci aliran yang disediakan. Selama durasi BroadcastSession
instance, angka itu bertambah 1 setiap kali penyambungan kembali dicoba. Ini berarti jika koneksi perangkat terputus 4 kali selama siaran, dan setiap kerugian memerlukan 1-4 upaya coba lagi, prioritas streaming terakhir bisa berada di mana saja antara 5 dan 17. Karena itu, kami menyarankan Anda untuk tidak menggunakan pengambilalihan IVS aliran dari perangkat lain sementara sambungan ulang otomatis diaktifkan di saluran SDK yang sama. Tidak ada jaminan prioritas apa yang SDK digunakan pada saat itu, dan SDK akan mencoba untuk terhubung kembali dengan prioritas yang lebih tinggi jika perangkat lain mengambil alih.
Menggunakan Mikrofon Bluetooth
Untuk menyiarkan menggunakan perangkat mikrofon Bluetooth, Anda harus memulai SCO koneksi Bluetooth:
Bluetooth.startBluetoothSco(context); // Now bluetooth microphones can be used … // Must also stop bluetooth SCO Bluetooth.stopBluetoothSco(context);