随着互联网的不断快速发展,人们的日常生活和娱乐内容也越来越丰富精彩。如今,人类已经全面进入视频直播时代,身边到处是大大小小的摄像头和直播设备。那么是不是可以用MCU来实现视频直播呢?答案是肯定的。
MJPEG-Streamer是一个开源的实时视频流服务器,专门用于处理Motion JPEG(MJPEG)格式的视频数据。它将视频分解为连续的JPEG图像帧序列,适合于网络视频监控和其他实时流应用,提供流畅的视频体验,同时占用较小的存储空间。说句题外话,MJPG和MJPEG是一个术语,不存在差异,有时候大家会混合一起使用。
MJPEG-Streamer的主要功能包括:
• 实时视频源采集:从摄像头或视频文件等来源的实时采集视频数据。
• MJPEG编码:对视频进行MJPEG编码,将其分割成多个JPEG图像帧。通常情况下,可使用UVC摄像头进行MJPEG编码工作。
• 流式传输:通过HTTP、RTSP(Real-Time Streaming Protocol)等,以流的形式将编码后的JPEG帧发送到客户端,实现实时的视频流传输。
• 编码质量和分辨率设置:支持多种编码质量和分辨率设置,适应不同的网络环境和终端设备。
在此,选用了RA8系列的MCU来实现上述的MJPEG-Streamer。这是因为:
• 摄像头输入接口多样性:CEU(并口摄像头处理单元),UVC(USB Video Camera USB摄像头)。
• 高速的CPU处理能力:能够有效处理和管理视频流数据,保证系统运行的稳定性和流畅性。
• 以太网及网络协议栈,USB协议栈支持:集成了以太网接口和完整的网络协议栈,能够方便地实现网络连接和数据传输。同时,集成了USB协议栈,使其可以与USB设备进行稳定的数据交换,增强了其外设连接的灵活性和扩展性。
RA8D1/M1通过高速USB 2.0接口读取UVC camera中的MJPEG数据流(1280*720 10FPS),图像分辨率和帧率,大家可以根据使用情况来适配和优化。USBX中的UVC协议栈支持MJPG和YUV格式数据。RA8D1/M1工作在HTTP服务器模式下,实时响应和处理来自客户端的浏览器的HTTP请求。
系统框图
PC的浏览器中显示RA8 MJPEG Streamer发送的
MJPEG数据流实例图
本项目使用的是瑞萨电子FSP(灵活软件配置包)来进行开发的。FSP是用于嵌入式系统设计的高质量增强型软件包,支持瑞萨电子RA产品家族ARM微控制器,提供用户友好的界面且可灵活扩展,确保从入门级到高性能的整个RA 微控制器的软件兼容性。在全新Arm®TrustZone®和其他高级安全功能的支持下,FSP提供一种快速、通用的方式,使用驱动程序、Azure RTOS、FreeRTOS™和其他中间件协议栈来构建安全、互联的物联网设备。
FSP使用开放式软件生态系统,并且也为裸机编程提供了灵活性,客户可以选择使用Azure RTOS或FreeRTOS、其他自选RTOS、现有代码和第三方生态系统解决方案。FSP和e2 studio可以在任何瑞萨的器件上免费使用。
瑞萨电子FSP总览图
本项目软件架构简单,使用FSP轻松快速的建立工程软件框架,软件架构一共分为应用层,OS(操作系统)层,驱动层。驱动层负责实现RA8 MCU相关的底层外设驱动,如GPIO,定时器,USB,Ethernet(以太网)等驱动,中间的OS层已经完美的移植ThreadX系统,与之相关的中间件和USBX(USB协议栈,NetX(Ethernet协议栈无缝使用。顶层的应用层,用户只需要将采集到的UVC MJPEG数据通过HTTP协议发送即可。
USB协议栈
https://renesas.github.io/fsp/group___u_s_b_x.html
Ethernet协议栈
https://renesas.github.io/fsp/group___r_m___n_e_t_x_d_u_o___e_t_h_e_r.html
软件架构图
工程建立rtt_thread,network_thread,uvc_thread3个线程。
• rtt_thread是负责接收其他两个线程的调试数据,进行解析和处理后发送到J-Link RTT viewer显示。
• network_thread负责初始化网络NetX协议栈相关功能,并进行DHCP来获取IP地址,建立TCP socket,监听80端口,等待客户端连接,进行HTTP通信协议交互。一旦客户端连接成功并发送HTTP请求,则等待uvc_thread发送的信号量去缓存数据中读取MJPEG数据,封装成HTTP协议数据发送给客户端。
• uvc_thread负责初始化USBX中HUVC相关配置和功能,设置已经连接的UVC摄像头中的图像格式,分辨率和帧率等,最后循环读取MJPEG流数据,每读取成功一帧数据,将数据写入到缓存中,同时会通过信号量的方式,通知network_thread一帧数据已经完成,可以进行发送。
软件流程图
工程代码地址
https://gitee.com/recn-mcu-ae/ra8d1cpkhmiusbxmjpgstreamer
来源:瑞萨嵌入式小百科
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。