欢迎来到皮皮网网首页

【jdk 1.7 源码】【unity摆放源码】【茅台源码GitHub】mediaengine 源码

来源:SQL源码剖析 时间:2024-12-28 17:29:30

1.增强axmol引擎视频播放之 - Linux(Ubuntu)视频播放支持
2.unimrcpclient源码分析mrcp components
3.谈谈MediaStream

mediaengine 源码

增强axmol引擎视频播放之 - Linux(Ubuntu)视频播放支持

       本文探讨在著名的Linux发行版Ubuntu支持视频渲染到纹理播放的实现过程,重点介绍如何集成libvlc以增强axmol引擎在Linux平台上的视频播放功能。在完成对Android平台的视频纹理渲染支持后,考虑到axmol引擎支持的平台包括macos、windows、ios/tvos、jdk 1.7 源码android、linux,Linux平台的缺失成为待补之项。

       深入研究后发现,VLC播放器提供了libvlc,其LGPL-2.1授权允许在不修改源码的情况下以动态库形式免费商用,这成为集成libvlc作为后端的合适方案。

       实现MediaEngine接口的核心功能包括播放、暂停等操作,unity摆放源码同时注册媒体事件和视频NV帧事件回调。关键代码片段涉及在libvlc的锁回调中锁定内存以用于写入视频数据。通过使用libvlc的回调模式格式设置,需特别注意为NV格式指定第二个平面的pitch和lines。

       为了在Ubuntu .+系统上编译运行axmol引擎,建议下载引擎最新源码并根据指南进行编译。若遇到视频解码问题,茅台源码GitHub可安装ubuntu扩展组件以解决,使用命令:sudo apt install ubuntu-restricted-extras。

       至此,axmol引擎的ui::MediaPlayer功能实现了全部平台上的视频纹理渲染播放,这得益于MediaEngine框架的重新设计。该框架不仅在axmol引擎内运行良好,还能独立编译,相册案例源码例如作者编写的bgfx视频播放示例:bgfx-axplay。

       值得注意的是,libvlc是跨平台的,因此VlcMediaEngine实现仅需简单配置即可在其他平台如Windows上运行。若在Windows上使用,还需设置vlc插件加载地址。

unimrcpclient源码分析mrcp components

       配置样例包含六个部分。论坛布局源码

       函数unimrcp_client_components_load主要负责这六个组件的加载,下面详细解析各个组件的加载过程。

       加载resource组件时,其结构体mrcp_resource_t定义在mrcp_resource.h,字符串使用apt_str_table_item_t(定义在mrcp_resource_loader.c),mrcp_resource_loader_t和mrcp_resource_factory_t分别位于mrcp_resource_loader.c和mrcp_resource_factory.c。构造mrcp_resource_loader内部是mrcp_resource_factory_t *factory,factory通过mrcp_resource_factory_create构建,参数为MRCP_RESOURCE_TYPE_COUNT的第5个值,整型值为4。

       加载sip-uac组件时,mrcp_sofia_client_config_t结构体(mrcp_sofiasip_client_agent.c)应用于sofia sip协议栈。默认端口和名称设定如下:config->local_port = DEFAULT_SIP_PORT; 默认端口为,config->user_agent_name = DEFAULT_SOFIASIP_UA_NAME; 默认agent name为UniMRCP SofiaSIP,config->origin = DEFAULT_SDP_ORIGIN; 默认sdp origin为UniMRCPClient。IP地址配置通过unimrcp_client_ip_address_get(unimrcp_client.c)实现,可配置为“auto”或“iface”。然后使用mrcp_sofiasip_client_agent_create(mrcp_sofiasip_client_agent.c)创建sofiasip_client。

       加载rtsp-uac组件时,指代MRCPv1版本的uac组件。rtsp_client_config_t结构体(mrcp_unirtsp_client_agent.h)用于配置。组件加载通过unimrcp_client_rtsp_uac_load函数完成。

       加载media-engine组件时,配置项仅包含realtime_rate。unimrcp_client_media_engine_load函数负责加载此组件。mpf_engine_t结构体(mpf_engine.c)用于创建mpf_engine,使用mpf_engine_create函数。

       加载rtp-factory组件时,mpf_rtp_config_t结构体(mpf_rtp_descriptor.h)包含可配置项。unimrcp_client_rtp_factory_load函数用于加载此组件,并通过mpf_rtp_termination_factory_create(mpf_rtp_termination_factory.c)创建相应的工厂。

谈谈MediaStream

       MediaStream 是连接 WebRTC API 和底层物理流的中间层,webRTC将音视频经过Vocie / Video engine进行处理后,再通过MediaStream API给暴露给上层使用。

        MediaStreamTrack是WebRTC中的基本媒体单位,一个MediaStreamTrack包含一种媒体源(媒体设备或录制内容)返回的单一类型的媒体(如音频,视频)。单个轨道可包含多个频道,如立体声源尽管由多个音频轨道构成,但也可以看作是一个轨道。

        WebRTC并不能直接访问或者控制源,对源的一切控制都可以通过轨道控制 MediaTrackConstraints 进行实施。

        MediaStreamTrack MDN文档

        MediaTrackConstraints MDN文档

        MediaStream是MediaStreamTrack的合集,可以包含 >=0 个 MediaStreamTrack。MediaStream能够确保它所包含的所有轨道都是是同时播放的,以及轨道的单一性。

        MediaStream MDN文档

        再MediaTrack的源码中,MediaTrack都是由对应的source和sink组成的。

        浏览器中存在从source到sink的媒体管道,其中source负责生产媒体资源,包括多媒体文件,web资源等静态资源以及麦克风采集的音频,摄像头采集的视频等动态资源。而sink则负责消费source生产媒体资源,也就是通过<img>,<video>,<audio>等媒体标签进行展示,或者是通过RTCPeerConnection将source通过网络传递到远端。RTCPeerConnection可同时扮演source与sink的角色,作为sink,可以将获取的source降低码率,缩放,调整帧率等,然后传递到远端,作为source,将获取的远端码流传递到本地渲染。

        source 与sink构成一个MediaTrack,多个MeidaTrack构成MediaStram。

        MediaTrackConstraints 描述MediaTrack的功能以及每个功能可以采用的一个或多个值,从而达到选择和控制源的目的。 MediaTrackConstraints 可作为参数传递给 applyConstraints() 以达到控制轨道属性的目的,同时可以通过调 getConstraints() 用来查看最近应用自定义约束。

        可将MediaStream对象直接赋值给 HTMLMediaElement 接口的 srcObject 属性。

        srcObject MDN文档

        可通过调用 MediaDevices.getUserMedia() 来访问本地媒体,调用该方法后浏览器会提示用户给予使用媒体输入的许可,媒体输入会产生一个 MediaStream ,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D转换器等等),也可能是其它轨道类型。

        通过 MediaDevices.enumerateDevices() 我们可以得到一个本机可用的媒体输入和输出设备的列表,例如麦克风,摄像机,耳机设备等。

        列表中的每个媒体输入都可作为MediaTrackConstraints中对应类型的值,如一个音频设备输入audioDeviceInput可设置为MediaTrackConstraints中audio属性的值

        将该constraint值作为参数传入到 MediaDevices.getUserMedia(constraints) 中,便可获得该设备的MediaStream。

        MediaDevices.enumerateDevices() MDN文档

        MediaDevices.getUserMedia() MDN文档

        使用 MediaDevices.getDisplayMedia() 方法,可以提示用户去选择和授权捕获展示的内容或部分内容(如一个窗口),并将录制内容在一个 MediaStream 里。

        MediaDevices.getDisplayMedia() MDN文档

        使用 HTMLCanvasElement.captureStream() 方法返回的 CanvasCaptureMediaStream 是一个实时捕获的canvas动画流。

        HTMLCanvasElement.captureStream() MDN文档

        CanvasCaptureMediaStream MDN文档

        可通过构造函数 MediaStream() 返回新建的空白的 MediaStream 实例

        MediaRecorder MDN文档