如何在iOS的浏览器环境内实现 “真·实时视频播放”

iOS的浏览器环境,当然就包括微信,QQ内打开。目前实现直播的协议一般都是HLS, 延迟大可想而知,“真·实时” 当然指的是2秒以内的延迟。

浏览器环境下支持常见的低延迟直播,首选的是flv.js。它支持多种数据获取方式(fetch,websocket,xhr),兼容性很好。解析flv流后再封装为mp4数据,使用Media Source Extensions 特性,将数据投喂给播放器以实现实时的解码播放。按浏览器支持情况,具有硬件加速的性能。

而iOS是目前无法实现的平台,https://caniuse.com/#search=mediasource 可以看到,到目前为止系统11.2仍然不支持该特性。

但通过websocket+WebAssembly技术,可以曲线救国。我已经实现了一个初版https://github.com/illuspas/NodePlayer.js

使用emscripten技术,完全采用c++编写,最终编译为js代码。只使用到ffmpeg的libavcodec,libavutil,libswresample库。只编译了h264,hevc,mp3,aac,nellymoser解码器。最终-Os级编译出2.9M的js代码,经测试,基本兼容windows,linux,mac,android,ios。视频渲染完全由WebGL实现,性能较其他js解码器的YUV转RGB更高。经测试,640×480@30 纯h264视频在iphone5s上能流畅播放。

目前不清楚实际应用场景,或许针对微信,QQ内的实时视频监控可以用上。解码器也可以尝试使用openh264,并且无需支持音频的场景,也能达到理想的720p软件解码性能,体积也可以做的很小,1M以内。通过CDN加速基本上也能达到不错的首屏启动速度。

由于emscripten对TCP的支持是以websocket为前端的,所以传输协议也只能是websocket,媒体格式使用最常见也非常适合做低延迟直播的flv格式,我开发的开源流媒体服务器 Node-Media-Server正好支持该特性。emscripten也支持fetch,但看样子是xhr的,兼容度还需要完善。emscripten好像也是支持UDP的,但我还没有尝试,看代码貌似是使用webrtc作为前端,也并不确定。如果能支持传统的UDP传输,那对服务端的要求就可以降低。只是模拟c层的BSD socket接口,仍然是websocket传输。

如果你有这方面的需求或者建议,可以留言或发邮件和我联系。

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: 如何在iOS的浏览器环境内实现 “真·实时视频播放”

1 评论

回复 栗城 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据