设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 79204|回复: 0

移动端音视频跨平台开发技术概论

[复制链接]

68

主题

0

回帖

216

积分

中级会员

Rank: 3Rank: 3

积分
216
发表于 2022-3-26 10:34:13 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
严格来说,具体到移动端音视频这个细分领域,除非你不依赖任何平台硬件加速能力(比如硬件编解码),否则我们可以大胆的说:根本不存在彻底的跨平台。
我们可以从更狭义的角度来说,移动端音视频领域的跨平台,其实是编译工具链和数据流程上的跨平台,基于这两个底座,接入依赖平台特性的功能模块,最终封装为多平台统一的native接口。
这里所谓的数据流程,或者叫pipeline,我们可以说它还包含了线程管理、内存管理、数据统计、日志管理等附属模块。
此外,如果要封装应用层面的API,则又要基于统一的native接口,依据各平台的语言特性,分别编写了。
用一张图来描述前面的思想,如下

下面我们用两个大家都熟知的开源项目ijkplayer和webrtc,看看他们的结构,来印证我们的想法。
ijkplayer

在ijkplayer中,对应数据流程的模块就是核心的ff_ffplay.c,我们知道它其实就脱胎于ffmpeg的ffplay.c,所以我们也可以说它直接用了ffmpeg的编译工具链、内存管理、日志管理等附属模块。
ff_ffplay.c中定义的两个核心队列,FrameQueue和PacketQueue驱动了音视频数据从读取、解封装、解码到渲染的流程。
截止目前的实现我们都可以说它是彻底跨平台的。但是具体到硬件解码,则完全呈现为平台相关。渲染方面,如果都选择用OpenGL进行渲染,那么也可以说是跨平台的,但对于Android平台,我们还需要做nativewindow(surface)渲染的支持,只能说是部分跨平台的。
但是注意,无论是Android MediaCodec解码还是ios VideoToolbox解码,都要配合ff_ffplay.c中的两个队列,也就是跨平台的底座,才能完成播放工作。
到了上层的接口方面,则对应ijkplayer.c,这里编写了一套双端统一的native接口,将一个播放器应有的常见接口都封装暴露出来。
在往上走,则分别对应Android平台的API:ijkMediaPlayer.java和ios平台的API:IJKFFMoviePlayerController.m。
WebRTC

在webrtc中,就更简单了,代码目录就代表着项目架构。
peer_connection串联起module目录下的音视频组件、网络组件,rtc_base、logging、stats目录下对应着线程管理、内存管理、日志管理、数据统计等组件。
至于编译工具链则以Ninja+GN的形式存在。
api目录下是双端统一的native api,sdk目录下则为各端对应的上层接口。

除此之外,在其他的开源项目中,例如VLC,也能看到类似的架构。
理解了跨平台架构的主线,也就不会再觉得所谓跨平台是什么高深的东西了。
在下一篇文章中,我们尝试编写一个跨平台的hello world项目,自己动手从代码角度更深刻地理解移动端跨平台开发的概念。

欢迎关注我的公众号,分享各类音视频、移动开发知识,以及名企内推信息~

文章帮到你了?可以扫描如下二维码进行打赏,打赏多少您随意~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表