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的制作及引用
88 0
|
16天前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
48 1
|
3月前
|
Java 开发工具
通过Java SDK调用阿里云模型服务
在阿里云平台上,可以通过创建应用并使用模型服务完成特定任务,如生成文章内容。本示例展示了一段简化的Java代码,演示了如何调用阿里云模型服务生成关于“春秋战国经济与文化”的简短文章。示例代码通过设置系统角色为历史学家,并提出文章生成需求,最终处理并输出生成的文章内容。在实际部署前,请确保正确配置环境变量中的密钥和ID,并根据需要调整SDK导入语句及类名。更多详情和示例,请参考相关链接。
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
40 0
|
XML Android开发 数据格式
从零开始学Xamarin.Forms(三) Android 制作启动画面
原文: 从零开始学Xamarin.Forms(三) Android 制作启动画面     Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1.
1312 0
|
7天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
9天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
11天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
9天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
10天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
22 2