技术背景Unity平台下,RTSP、RTMP播放和RTMP推送,甚至包括轻量级RTSP服务这块都不再赘述,今天探讨的一位开发者提到的问题,如果在Unity下,实现RTSP播放的同时,随时转RTMP推送出去 RTSP转RTMP,在原生环境下老早已经有了,这里,其实就是把原生的挪到Unity即可,相关流程如下:图片技术实现本文以Windows平台为例,在RTSP播放模块的基础上,加个RTSP转RTMP推送模块 push_handle_ == IntPtr.Zero) return; //新接口 NTSmartPublisherSDK.NT_PB_PostVideoEncodedDataV2( audio_info.parameter_info_, audio_info.parameter_info_size_); }}总结实际上,Unity 环境下的RTSP转RTMP推送,相对RTMP、RTSP播放或推流,对接更容易,因为基本不涉及到页面交互,感兴趣的开发者可以尝试看。
Unity下RTMP直播背景方面不再赘述,今天主要讨论的是,Unity环境下,如何实现Camera高帧率RTMP推送,这里提到的高帧率,不再局限于常规环境下的30帧,以VR头显为例,更高的帧率(比如50 图片图片之前,我们老早实现了Unity环境下的RTMP低延迟推送,原生环境下,比如windows下,可轻松实现50帧+的编码和RTMP推送(需要播放端也有高帧率播放的能力)。 内部音频、麦克风+unity内部音频混音或Unity下2路内部音频混音,麦克风的话,可以原生实现,然后直接调用即可,Unity内部音频可以通过AudioClip读取数据,编码的话,考虑到通用性,一般建议 https://github.com/daniulive/SmarterStreaming*/public class FrameTexture { public FrameTexture(Texture2D 环境下高帧率RTMP推送一点抛砖引玉的介绍,实际开发过程中,可能还需要考虑多实例、异常网络环境处理等各种情况,如果原生开发这块,有很好的积累,这块都不难。
像Unity3D下的RTMP或RTSP播放器一样,好多开发者苦于在Unity环境下,如何高效率低延迟的把数据采集并编码实时推送到流媒体服务器,实现Unity场景下的低延迟推拉流方案。 如果只需要拿到Unity的窗体或摄像机数据推出去,可在Unity下获取到需要推送的原始数据,然后封装原生的RTMP推流接口,调用原生SDK实现数据推送,这种做法的好处是,可以自定义需要采集的数据内容,只要按照原生 ,介绍下Unity环境下的Android平台RTMP推流,数据采集在Unity完成,数据编码推送,调用大牛直播SDK(官方)Android平台RTMP直播推送SDK原生库对外二次封装的接口,高效率的实现 下图系Android平台Unity环境下采集屏幕,编码推送到RTMP服务器,然后Windows平台播放器拉取RTMP流播放,为了方便看到延迟效果,特地在Android端的Unity窗口显示了当前时间,可以看到 } 总结 通过以上流程,可以实现Unity环境下屏幕或摄像机数据,毫秒级体验的RTMP推送和播放,感兴趣的开发者可酌情参考。
像Unity3D下的RTMP或RTSP播放器一样,好多开发者苦于在Unity环境下,如何高效率低延迟的把数据采集并编码实时推送到流媒体服务器,实现Unity场景下的低延迟推拉流方案。 直接封装Android原生的屏幕采集工程,在unity提供接口,拿到屏幕权限后,获取屏幕数据并推送; 2. 如果只需要拿到Unity的窗体或摄像机数据推出去,可在Unity下获取到需要推送的原始数据,然后封装原生的RTMP推流接口,调用原生SDK实现数据推送,这种做法的好处是,可以自定义需要采集的数据内容,只要按照原生 本文以Android平台为例,介绍下Unity环境下的Android平台RTMP推流,数据采集在Unity完成,数据编码推送,调用大牛直播SDKAndroid平台RTMP直播推送SDK原生库对外二次封装的接口 下图系Android平台Unity环境下采集屏幕,编码推送到RTMP服务器,然后Windows平台播放器拉取RTMP流播放,为了方便看到延迟效果,特地在Android端的Unity窗口显示了当前时间,可以看到
Camera2简介 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用的API1 Camera API2相较于API1有很大不同, 并且API2是为了配合HAL3进行使用的, API2有很多API1不支持的特性, 比如: 更先进的API架构; 可以获取更多的帧(预览/拍照)信息以及手动控制每一帧的参数 获取数据后对接RTMP推送: 通过OnImageAvailableListenerImpl 获取到原始数据,推送端以大牛直播SDK https://github.com/daniulive/SmarterStreaming / 的万能推送接口为例,获取数据后,调用SmartPublisherOnImageYUV420888() 完成数据传送,底层进行二次处理后,编码后传输即可。 ,和RTMP调用流程,感兴趣的可以自行学习。
技术实现 Unity平台下的RTMP推流、RTMP、RTSP播放前几年已经覆盖了Windows、Linux、Android、iOS平台。 音视频原始数据采集到后,编码注入RTSP服务和RTMP推送模块。二者可以单独使用,也可同时使用。其中轻量级RTSP服务,可实时查看链接的RTSP会话数。 推送、停止推送: public void btn_start_rtmp_pusher_Click() { if (publisher_wrapper_.IsPushingRtmp()) { StopPushRTMP(); btn_rtmp_pusher_.GetComponentInChildren<Text>().text = "推送RTMP"; 推送的区别在于,轻量级RTSP服务不需要单独部署流媒体服务器(类似于网络摄像头),在内网小并发场景下,使用起来非常方便,如果需要上公网,还是需要用RTMP推送,感兴趣的开发者可酌情参考。
关于Unity实现RTMP直播推送技术方案,之前零散的写过几篇介绍,得到了好多开发者的关注。 以Android平台为例,目前视频这块,我们demo实现的是Camera数据的采集,然后编码投递到底层,如果设备没有性能瓶颈,可达到高帧率(60帧)均匀的RTMP推送效果。 麦克风的数据采集,我们是直接基于原生的Android,通过Unity调用Android实现数据采集推送,外部PCM数据,我们以AudioClip为例,读取到数据,每隔10ms传下去,两路外部PCM也就是两路 数据有了,实现RTMP推送这块,小菜一碟了,由于我们有多年的RTMP推送方面的技术积累,对我们来说,无非就是多一种类型的数据源而已。 经过实际测试,配合我们自研的RTMP播放器,轻松实现超过50帧的RTMP毫秒级延迟的体验,足够应对大多数行业场景了。
Unity3D使用场景Unity3D是非常流行的游戏开发引擎,可以创建各种类型的3D和2D游戏或其他互动应用程序。 如何获取Camera场景数据Unity3D获取摄像机数据通常用RenderTexture和RenderTexture.GetPixel方法来获取数据,把捕获屏幕的图像,存储在一个Texture2D实例中 推送服务本文以大牛直播SDK开发的Unity3D下Android平台的RTMP推送camera场景的demo为例,结合Unity和原生模块交互,大概介绍下核心实现逻辑。 图片开始推送RTMP服务: public bool StartRtmpPusher() { if (is_pushing_rtmp_) { _ = false; }技术总结Unity3D下采集camera场景并推送RTMP具有重要的意义,可以为实时监控、在线直播、视频教程制作、增强现实和虚拟现实应用以及数据记录和分析等领域提供有力的支持
技术背景我们在对接Unity平台camera场景采集的时候,除了常规的RTMP推送、录像外,还有一些开发者,需要能实现轻量级RTSP服务,对外提供个拉流的RTSP URL。 :RTMP直播推送;轻量级RTSP服务;实时录像、暂停|恢复录像;实时预览。 技术实现实际上,在实现Unity平台音视频能力之前,我们原生模块已经有非常成熟的技术积累,Unity下还是调用的原生的推送模块,不同的是,数据源需要采集Unity的audio、video,然后高效的投递到底层模块 { StopPushRTMP(); btn_rtmp_pusher_.GetComponentInChildren<Text>().text = "推送RTMP 平台下RTMP推送、录像、轻量级RTSP服务,在虚拟仿真、医疗、教育等场景下,应用非常广泛。
实现 大多数头显设备,基于Android平台,本文以Unity环境下的窗体采集、麦克风、和Unity内部音频采集为例,介绍下具体实现思路,其中,音频采集可分为:采集麦克风、采集Unity音频、麦克风和Unity 音频混音、2路Unity音频混音。 ,设置推送参数和RTMP URL,采集音视频数据,推送到RTMP服务,如需推送麦克风,启动麦克风,并设定采样率和通道数,如需混音: public void Push() { if (is_running 【最先调用】NT_PB_U3D_Init,推送实例初始化,目前预留; 2.【最后调用】NT_PB_U3D_UnInit,UnInit推送SDK,最后调用。 3. 【推送URL】NT_PB_U3D_SetPushUrl,设置推送的RTMP URL; 40.【开始RTMP推流】NT_PB_U3D_StartPublisher,开始RTMP推流; 41.
好多开发者提到,苦于在unity3d下实现RTMP直播推送,本次以大牛直播SDK(Github)的Windows平台RTMP推送模块(以推摄像头为例,如需推屏幕数据,设置相关参数即可)为例,介绍下unity3d 的RTMP推送集成。 1 : 2); SetVideoQualityV2(CalVideoQuality(cap.width_, cap.height_, is_h264_encoder)); handle, IntPtr user_data, UInt32 event_id, Int64 param1, Int64 param2, 上层刷下即可,如下图: 经测试,unity3d下,RTMP推送,配合RTMP播放端,依然可以实现毫秒级延迟的推拉流体验。
Camera2架构 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用的API1 Camera API2相较于API1有很大不同, 并且API2是为了配合HAL3进行使用的, API2有很多API1不支持的特性, 比如: 更先进的API架构; 可以获取更多的帧(预览/拍照)信息以及手动控制每一帧的参数 2. 如何实现camera2数据对接RTMP推送: 通过OnImageAvailableListenerImpl 获取到原始数据,推送端以大牛直播SDK https://github.com/daniulive /SmarterStreaming/ 的万能推送接口为例,获取数据后,调用SmartPublisherOnImageYUV420888() 完成数据传送,底层进行二次处理后,编码后传输即可。
技术实现本文以大牛直播SDK的Windows平台RTMP直播推送和RTMP直播播放模块为例,考虑到老的扩展CodecID 12的场景依然使用,我们添加了个设置接口:RTMP推送端,对应文件为SmartPublisherSDK RTMP推送端生成HEVC的FLV VideoTagHeader,对应的sample判断代码如下:/** Author:daniusdk.com*/*p = 0x80;if (key)*p |= (1< <4);else*p |= (2 << 4); if (pts ! 推流URL,实现Enhanced RTMP推送,播放端拉流播放,整体延迟如下:可以看到,尽管开启了Enhanced RTMP,整体延迟还在毫秒级。 技术总结鉴于目前RTMP扩展265这块,大多还是用的老的CodecID设置为12的模式,如果需要支持新的Enhanced RTMP,除了推送端和播放端外,RTMP服务端也需要做响应的调整,来适配这种情况
背景 好多开发者在做Android平台RTMP推送对接的同时,除了编码前的数据外,还有些外部编码数据推送诉求,他们希望外部的编码音视频数据不止可以实现RTMP推送,还可以同时在推送端实时录制下来,本文以我们 (官方)Android平台RTMP直播推送模块为例,介绍下外部数据对接流程和数据录制流程。 对接流程 开始推送 private boolean StartPush() { if (isPushing) return false; //relayStreamUrl = "rtmp = 0) { return true; } int audio_opt = 2; int video_opt = 2; int videoWidth = 640; int publisherHandle, new EventHandePublisherV2()); return true; } 停止推送 public void StopPush() {
做好了RTMP推送模块,发现现有的RTMP播放都不足以满足我们毫秒级的延迟诉求,继续自研框架,做了RTMP的直播播放器。本文以大牛直播SDK的Android平台RTMP直播推送模块为例。 支持RTMP扩展H.265(需设备支持H.265特定机型硬编码)和Enhanced RTMP;支持实时音量调节;支持扩展录像模块;支持Unity接口;支持H.264扩展SEI发送模块;支持Android 事件回调:SetSmartPublisherEventCallbackV2设置事件回调,用于处理推送过程中的各种事件。 RTMP推送: 设置推送URL:通过SmartPublisherSetURL接口设置RTMP推送的URL。推送控制:提供startPush、stopPush等接口控制推送的开始和停止。 实现示例: Camera2对接示例:在onCreate方法中初始化SmartPublisherJniV2实例,并设置相关参数和回调。
Windows平台推送端(以C#为例): /* *设置输入音量, 这个接口一般不建议调用, 在一些特殊情况下可能会用, 一般不建议放大音量 *index: 一般是0和1, 如果没有混音的只用 UInt32 NT_PB_SetInputAudioVolume(IntPtr handle, Int32 index, float volume); 对应界面如下: audio_volume.png 2. Android推送端: /** * 设置输入音量, 这个接口一般不建议调用, 在一些特殊情况下可能会用, 一般不建议放大音量 * * @param index: 一般是0和1, 如果没有混音的只用 final String[] in_audio_volume_sel = new String[]{ "0", "0.2", "0.5", "0.8","1", "1.5", "2"
RTMP推送。 win_publisher_unity2.png 需要注意的地方有几点: 1. 数据采集投递,确保高效率; 2. 屏幕分辨率发生变化,可实时适配; 3. 相关博客: Windows平台实现Unity下窗体|摄像头|屏幕采集推送 https://cloud.tencent.com/developer/article/1833835 Android平台实现Unity3D 下RTMP推送 https://cloud.tencent.com/developer/article/1832046 2. 多实例支持:播放端和推送不一样,比如智慧城市,播放端有多路场景,所以多实例支持是必备功能,多实例环境下,需要能有好的区分event状态回调等; 2.
RTMP header的长度不固定,可能的长度为12字节,8字节,4字节,1字节。具体长度为多少个字节,由RTMP header数据包的第一个字节的高2位决定。 ? 如下方表格,Format决定了RTMP header的长度为多少个字节: Format取值(2bits) header的长度 说明 0(二进制00) 12字节 onMetaData流开始的绝对时间戳控制消息 第一个字节,高2位为01,所以RTMP Header的长度为8字节,接下来是时间戳的delta,简单讲就是时间戳的变化量,BodySize不多说,后面6个字节也比较赤裸裸。 可以看到,第一个字节为0xa2,所以高2位的值为10,所以,RTMP Header占用4个字节,后面跟着的时间戳的增量。 1字节的RTMP Header ? 抓个包,好奇的看一下。 ? 一个字节,就是第一个字节,后面啥也没有喽,高2位为11,所以,RTMP Header占用1个字节,只包含Format 和chunk stream ID。
技术背景大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器 enhanced RTMP, SDK默认是开启enhanced RTMP的RTMP推送URL设置SmartPublisherSetURL设置RTMP推送url编码前实时视频数据camera数据SmartPublisherOnCaptureVideoData 推送开始推送RTMPSmartPublisherStartPublisher启动RTMP推送停止推送RTMPSmartPublisherStopPublisher停止RTMP推送关闭推送实例关闭实例SmartPublisherClose (需设备支持H.265特定机型硬编码)和Enhanced RTMP;支持实时音量调节;支持扩展录像模块;支持Unity接口;支持H.264扩展SEI发送模块;支持Android 5.1及以上版本。 接口调用详解本文以大牛直播SDK Android平台Camera2Demo为例,推送RTMP之前,可以先选择视频分辨率、软编还是硬编码,音频是AAC、SPEEX还是PCMA编码等基础设置,其他参数的设置
不久前刚实现SkeyeRTMPPusher扩展支持h265推送,当时在网上也查找了很多资料,发现都不尽详细,而官方也没有更新对HEVC(H265,后文统称HEVC)tag的支持,反正是走了不少弯路,当然 ,在广大网友以及ffmpeg代码的帮助下我最终实现了通过SkeyeRTMPPusher推送HEVC视频帧数据到SkeyeSMS,这里我将把实现过程详细的记录下来,供广大网友参考。 首先, RTMP头部信息封装并没有定义HEVC,我们采用CDN联盟的HEVC扩展标准,将HEVC的VideoTagHeader定义为12,详见下图: 图片 然后,我们在H264封装的基础上进行改进,以支持 if (m_bWaitingKeyFrame) { m_bWaitingKeyFrame = false; } } else { //body[i++] = 0x27;// 2: 0x2C:0x27;// 1:Iframe 7:AVC 12:HEVC } body[i++] = 0x01;// AVC NALU body[i++] = 0x00; body[i++] =