IVS Android 广播 SDK 入门 | 低延迟直播功能 - Amazon IVS

IVS Android 广播 SDK 入门 | 低延迟直播功能

本文档将引导您完成 Amazon IVS 低延迟直播功能 Android 广播 SDK 入门所涉及的步骤。

安装库

要将 Amazon IVS Android 广播库添加到您的 Android 开发环境中,请将该库添加到您模块的 build.gradle 文件,如此处所示(适用于最新版本的 Amazon IVS 广播开发工具包)。

repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:ivs-broadcast:1.25.0' }

如要手动安装 SDK,也可从以下位置下载最新版本:

使用带有调试符号的 SDK

我们还发布了包含调试符号的 Android 广播 SDK 版本。如果您在 IVS 广播 SDK 中遇到崩溃,则可以使用此版本来提高 Firebase Crashlytics 中调试报告(堆栈跟踪)的质量;即 libbroadcastcore.so。当您向 IVS SDK 团队报告这些崩溃时,堆栈跟踪质量越高,修复问题越轻松。

要使用此版本的 SDK,请将以下内容放入您的 Gradle 构建文件中:

implementation "com.amazonaws:ivs-broadcast:$version:unstripped@aar"

使用上面一行代替以下一行:

implementation "com.amazonaws:ivs-broadcast:$version@aar"

将符号上传到 Firebase Crashlytics

确保已为 Firebase Crashlytics 设置 Gradle 构建文件。请按照此处的 Google 说明进行操作:

https://firebase.google.com/docs/crashlytics/ndk-reports

请务必将 com.google.firebase:firebase-crashlytics-ndk 作为依赖项包括在内。

在构建要发布的应用程序时,Firebase Crashlytics 插件应自动上传符号。要手动上传符号,请运行以下命令之一:

gradle uploadCrashlyticsSymbolFileRelease
./gradlew uploadCrashlyticsSymbolFileRelease

[如果符号上传两次(自动和手动上传)也无妨。]

防止您的版本 .apk 变得越来越大

在打包版本 .apk 文件之前,Android Gradle 插件会自动尝试从共享库(包括 IVS 广播 SDK 的 libbroadcastcore.so 库)中剥离调试信息。但是,有时这种情况不会发生。因此,您的 .apk 文件可能会变大,您可能会收到来自 Android Gradle 插件的警告消息,告知无法剥离调试符号并将按原样打包 .so 文件。如果发生这种情况,则请执行以下操作:

  • 安装 Android NDK。任何最新版本都可以使用。

  • ndkVersion <your_installed_ndk_version_number> 添加到应用程序的 build.gradle 文件中。即使您的应用程序本身不包含原生代码,也要这样做。

有关更多信息,请参阅此问题报告

创建事件侦听器

设置事件侦听器可接收状态更新、设备更改通知、错误和会话音频信息。

BroadcastSession.Listener broadcastListener = new BroadcastSession.Listener() { @Override public void onStateChanged(@NonNull BroadcastSession.State state) { Log.d(TAG, "State=" + state); } @Override public void onError(@NonNull BroadcastException exception) { Log.e(TAG, "Exception: " + exception); } };

请求权限

您的应用必须请求权限才能访问用户摄像头和麦克风。(这并非特定于 Amazon IVS;需要访问摄像头和麦克风的任何应用程序都需要这样做。)

我们在此处检查用户是否已授予权限,如果没有,对他们提出要求:

final String[] requiredPermissions = { Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO }; for (String permission : requiredPermissions) { if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { // If any permissions are missing we want to just request them all. ActivityCompat.requestPermissions(this, requiredPermissions, 0x100); break; } }

在这里,我们得到用户的响应:

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 0x100) { for (int result : grantResults) { if (result == PackageManager.PERMISSION_DENIED) { return; } } setupBroadcastSession(); } }

创建广播会话

广播接口为 com.amazonaws.ivs.broadcast.BroadcastSession。使用预设值对它进行初始化,如下所示。如果在初始化过程中出现任何错误(例如配置编解码器失败),则 BroadcastListener 将得到错误消息,并且 broadcastSession.isReady 将变为 false

重要提示:对 Amazon IVS Broadcast SDK for Android 的所有调用必须在实例化该开发工具包的线程上进行。来自不同线程的调用将导致开发工具包抛出致命错误并停止广播

// Create a broadcast-session instance and sign up to receive broadcast // events and errors. Context ctx = getApplicationContext(); broadcastSession = new BroadcastSession(ctx, broadcastListener, Presets.Configuration.STANDARD_PORTRAIT, Presets.Devices.FRONT_CAMERA(ctx));

另请参阅创建广播会话(高级版)

设置 ImagePreviewView 进行预览

如果要显示活动摄像机设备的预览,请将设备的预览 ImagePreviewView 添加到您的视图层次结构。

// awaitDeviceChanges will fire on the main thread after all pending devices // attachments have been completed broadcastSession.awaitDeviceChanges(() -> { for(Device device: session.listAttachedDevices()) { // Find the camera we attached earlier if(device.getDescriptor().type == Device.Descriptor.DeviceType.CAMERA) { 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); } } });

开启广播

您在 GetChannel 操作的 ingestEndpoint 响应字段中接收的主机名的前面应为 rtmps://,后面为 /app。完整 URL 应采用以下格式:rtmps://{{ ingestEndpoint }}/app

broadcastSession.start(IVS_RTMPS_URL, IVS_STREAMKEY);

Android 广播 SDK 仅支持 RTMPS 采集(不支持不安全的 RTMP 采集)。

停止广播

broadcastSession.stop();

发布广播会话

当不再使用广播会话时,必须调用 broadcastSession.release() 方法,以释放库使用的资源。

@Override protected void onDestroy() { super.onDestroy(); previewHolder.removeAllViews(); broadcastSession.release(); }