Android|使用阿里云推流 SDK 实现双路推流不同画面

简介: 本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。

本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。

需求

项目上有一个用于直播的 APP,可以在 Android 平板上录屏进行推流直播,然后通过阿里云的直播转 VOD 方式形成录播视频。屏幕上的内容分为 A、B 两个区域,如图所示:

图片

原本是只推送 A 区域的画面,也就是用户观看直播和录播时,都只能看到 A 区域。

现在要求变成用户观看直播时,可以看到 A 区域的内容;而观看录播时,可以同时看到 A 区域和 B 区域的内容。

思路

大致思考后,有两种思路:

一种是推流时,推送 A 区域 加 B 区域的画面,然后在观看直播时,将画面进行截取展示,在录播时则直接展示完整画面;

另一种是推流时,分别推送两路流,一路只推送 A 区域,另一路则推送 A 区域 加 B 区域,观看直播时拉第一路流,观看录播时展示第二路流转的 VOD 视频。

基于项目的现状——推流只有一个 Android 端,而播放则需要适配 Web PC、Web Mobile、Android 和 iOS,所以选择了第二种方案,这样只需对推流端进行改造,然后服务端接口进行简单调整即可。

方案

一个残酷的现实是,阿里云推流 Android SDK 并没有原生支持多路推流的功能,官方文档有提到:

AlivcLivePusher目前不支持多实例

经过尝试,发现在一个进程里创建两个 AlivcLivePusher 实例,确实无法同时正常使用。

那只能自己想点黑科技了……

最终的实现方案:

图片

简单来讲,就是在推流时,启动位于另一个进程的 Service,初始化另一个 AlivcLivePusher,进行第二路推流。

每当有新的视频帧时,写入 MemoryFile,然后通过 AIDL 调用将 ParcelFileDescriptor 传递给 Service,Service 读取 MemoryFile,进行处理后推给第二路流。

音频帧同理。

小结

经过一些调试和优化,最终实现了需求里想要的双路推流不同画面的效果。

这种方式虽然有点绕,但是在没有原生支持的情况下,也算是一种可用的方案了。

如果没有项目和业务的历史包袱,可以优先考虑使用原生支持多路推流的 SDK,比如大牛直播等,这样可能会更加方便和稳定。


如果读完文章有收获,可以关注我的微信公众号「闷骚的程序员」并🌟设为星标🌟,随时阅读更多内容。

目录
相关文章
|
3月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
79 0
|
5天前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
26 1
|
14天前
|
Java 程序员 开发工具
Android|修复阿里云播放器下载不回调的问题
虽然 GC 带来了很多便利,但在实际编码时,我们也需要注意对象的生命周期管理,该存活的存活,该释放的释放,避免因为 GC 导致的问题。
26 2
|
3月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
164 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
3月前
|
Java 开发工具
通过Java SDK调用阿里云模型服务
在阿里云平台上,可以通过创建应用并使用模型服务完成特定任务,如生成文章内容。本示例展示了一段简化的Java代码,演示了如何调用阿里云模型服务生成关于“春秋战国经济与文化”的简短文章。示例代码通过设置系统角色为历史学家,并提出文章生成需求,最终处理并输出生成的文章内容。在实际部署前,请确保正确配置环境变量中的密钥和ID,并根据需要调整SDK导入语句及类名。更多详情和示例,请参考相关链接。
|
3月前
|
开发工具 Android开发
Flutter: Android SDK not found at this location,Android Studio not found at xxx
Flutter: Android SDK not found at this location,Android Studio not found at xxx
150 2
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
37 0
|
3月前
|
Java API 开发工具
Android项目架构设计问题之为SDK添加新的回调支持如何解决
Android项目架构设计问题之为SDK添加新的回调支持如何解决
23 0
|
XML Android开发 数据格式
从零开始学Xamarin.Forms(三) Android 制作启动画面
原文: 从零开始学Xamarin.Forms(三) Android 制作启动画面     Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1.
1310 0
|
8天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
下一篇
无影云桌面