3.9 RTSP 模块API手册#

前言#

概述#

本文档主要介绍K230_CanMV RTSP模块API的使用。

读者对象#

本文档(本指南)主要适用于以下人员:

  • 技术支持工程师

  • 软件开发工程师

缩略词定义#

简称

说明

修订记录#

文档版本号

修改说明

修改者

日期

V1.0

初版

孙小朋

2024-07-16

1. 概述#

本文档旨在介绍K230_CanMV RTSP模块API的使用方法和功能。RTSP模块是用于创建和管理RTSP服务器以及发送视频和音频数据的模块。

2. API描述#

多媒体模块提供以下RTSP接口:

  1. multimedia.rtspserver_create:创建RTSP服务器。

  2. multimedia.rtspserver_destroy:销毁RTSP服务器。

  3. multimedia.rtspserver_init:初始化RTSP服务器。

  4. multimedia.rtspserver_deinit:反初始化RTSP服务器。

  5. multimedia.rtspserver_createsession:创建RTSP会话。

  6. multimedia.rtspserver_destroysession:销毁RTSP会话。

  7. multimedia.rtspserver_getrtspurl:获取RTSP URL。

  8. multimedia.rtspserver_start:启动RTSP服务器。

  9. multimedia.rtspserver_stop:停止RTSP服务器。

  10. multimedia.rtspserver_sendvideodata:向RTSP服务器发送视频数据。

  11. multimedia.rtspserver_sendaudiodata:向RTSP服务器发送音频数据。

这些接口可用于创建和管理RTSP服务器,创建和销毁RTSP会话,向服务器发送视频和音频数据,并获取用于流媒体的RTSP URL。

2.1 multimedia.rtspserver_create#

【描述】

创建rtsp server.

【语法】

rtspserver_create()

【参数】

【返回值】

返回值

描述

0

成功

非 0

失败

【举例】

【相关主题】

2.2 multimedia.rtspserver_destroy#

【描述】

销毁rtsp server.

【语法】

rtspserver_destroy()

【参数】

【返回值】

返回值

描述

0

成功

非 0

失败

【举例】

【相关主题】

2.3 multimedia.rtspserver_init#

【描述】

初始化RTSP服务器。

【语法】

rtspserver_init(port)

【参数】

参数名称

描述

输入/输出

port

RTSP服务器端口号

输入

【返回值】 无

【举例】

rtspserver_init(8554)

【相关主题】

2.4 multimedia.rtspserver_deinit#

【描述】

反初始化RTSP服务器。

【语法】

rtspserver_deinit()

【参数】

【返回值】

【举例】

rtspserver_deinit()

【相关主题】

2.5 multimedia.rtspserver_createsession#

【描述】

创建RTSP会话。

【语法】

rtspserver_createsession(session_name, video_type, enable_audio)

【参数】

参数名称

描述

输入/输出

session_name

会话名称

输入

video_type

视频类型

输入

enable_audio

是否启用音频

输入

【返回值】

【举例】

rtspserver_createsession("session1", "h264", True)

【相关主题】

2.6 multimedia.rtspserver_destroysession#

【描述】

销毁RTSP会话。

【语法】

rtspserver_destroysession(session_name)

【参数】

  • session_name:会话名称。

【返回值】

【举例】

rtspserver_destroysession("session1")

【相关主题】

2.7 multimedia.rtspserver_getrtspurl#

【描述】

获取RTSP URL。

【语法】

rtspserver_getrtspurl()

【参数】

【返回值】

参数名称

描述

输入/输出

url

RTSP URL

输出

【举例】

url = rtspserver_getrtspurl()
print(url)

【相关主题】

2.8 multimedia.rtspserver_start#

【描述】

启动RTSP服务器。

【语法】

rtspserver_start()

【参数】

【返回值】

【举例】

rtspserver_start()

【相关主题】

2.9 multimedia.rtspserver_stop#

【描述】

停止RTSP服务器。

【语法】

rtspserver_stop()

【参数】

【返回值】

【举例】

rtspserver_stop()

【相关主题】

2.10 multimedia.rtspserver_sendvideodata#

【描述】

发送视频数据到RTSP服务器。

【语法】

rtspserver_sendvideodata(session_name, data, size, timestamp)

【参数】

参数名称

描述

输入/输出

session_name

会话名称

输入

data

视频数据

输入

size

数据大小

输入

timestamp

时间戳

输入

【返回值】

【举例】

rtspserver_sendvideodata("session1", video_data, video_size, video_timestamp)

【相关主题】

2.11 multimedia.rtspserver_sendaudiodata#

【描述】

发送音频数据到RTSP服务器。

【语法】

rtspserver_sendaudiodata(session_name, data, size, timestamp)

【参数】

参数名称

描述

输入/输出

session_name

会话名称

输入

data

视频数据

输入

size

数据大小

输入

timestamp

时间戳

输入

【返回值】

【举例】

rtspserver_sendaudiodata("session1", audio_data, audio_size, audio_timestamp)

【相关主题】

3. 示例程序#

# Description: This example demonstrates how to stream video and audio to the network using the RTSP server.
#
# Note: You will need an SD card to run this example.
#
# You can run the rtsp server to stream video and audio to the network

from media.vencoder import *
from media.sensor import *
from media.media import *
import time, os
import _thread
import multimedia as mm
from time import *

class RtspServer:
    def __init__(self,session_name="test",port=8554,video_type = mm.multi_media_type.media_h264,enable_audio=False):
        self.session_name = session_name # session name
        self.video_type = video_type  # 视频类型264/265
        self.enable_audio = enable_audio # 是否启用音频
        self.port = port   #rtsp 端口号
        self.rtspserver = mm.rtsp_server() # 实例化rtsp server
        self.venc_chn = VENC_CHN_ID_0 #venc通道
        self.start_stream = False #是否启动推流线程
        self.runthread_over = False #推流线程是否结束

    def start(self):
        # 初始化推流
        self._init_stream()
        self.rtspserver.rtspserver_init(self.port)
        # 创建session
        self.rtspserver.rtspserver_createsession(self.session_name,self.video_type,self.enable_audio)
        # 启动rtsp server
        self.rtspserver.rtspserver_start()
        self._start_stream()

        # 启动推流线程
        self.start_stream = True
        _thread.start_new_thread(self._do_rtsp_stream,())


    def stop(self):
        if (self.start_stream == False):
            return
        # 等待推流线程退出
        self.start_stream = False
        while not self.runthread_over:
            sleep(0.1)
        self.runthread_over = False

        # 停止推流
        self._stop_stream()
        self.rtspserver.rtspserver_stop()
        #self.rtspserver.rtspserver_destroysession(self.session_name)
        self.rtspserver.rtspserver_deinit()

    def get_rtsp_url(self):
        return self.rtspserver.rtspserver_getrtspurl(self.session_name)

    def _init_stream(self):
        width = 1280
        height = 720
        width = ALIGN_UP(width, 16)
        # 初始化sensor
        self.sensor = Sensor()
        self.sensor.reset()
        self.sensor.set_framesize(width = width, height = height, alignment=12)
        self.sensor.set_pixformat(Sensor.YUV420SP)
        # 实例化video encoder
        self.encoder = Encoder()
        self.encoder.SetOutBufs(self.venc_chn, 8, width, height)
        # 绑定camera和venc
        self.link = MediaManager.link(self.sensor.bind_info()['src'], (VIDEO_ENCODE_MOD_ID, VENC_DEV_ID, self.venc_chn))
        # init media manager
        MediaManager.init()
        # 创建编码器
        chnAttr = ChnAttrStr(self.encoder.PAYLOAD_TYPE_H264, self.encoder.H264_PROFILE_MAIN, width, height)
        self.encoder.Create(self.venc_chn, chnAttr)

    def _start_stream(self):
        # 开始编码
        self.encoder.Start(self.venc_chn)
        # 启动camera
        self.sensor.run()

    def _stop_stream(self):
        # 停止camera
        self.sensor.stop()
        # 接绑定camera和venc
        del self.link
        # 停止编码
        self.encoder.Stop(self.venc_chn)
        self.encoder.Destroy(self.venc_chn)
        # 清理buffer
        MediaManager.deinit()

    def _do_rtsp_stream(self):
        try:
            streamData = StreamData()
            while self.start_stream:
                os.exitpoint()
                # 获取一帧码流
                self.encoder.GetStream(self.venc_chn, streamData)
                # 推流
                for pack_idx in range(0, streamData.pack_cnt):
                    stream_data = bytes(uctypes.bytearray_at(streamData.data[pack_idx], streamData.data_size[pack_idx]))
                    self.rtspserver.rtspserver_sendvideodata(self.session_name,stream_data, streamData.data_size[pack_idx],1000)
                    #print("stream size: ", streamData.data_size[pack_idx], "stream type: ", streamData.stream_type[pack_idx])
                # 释放一帧码流
                self.encoder.ReleaseStream(self.venc_chn, streamData)

        except BaseException as e:
            print(f"Exception {e}")
        finally:
            self.runthread_over = True
            # 停止rtsp server
            self.stop()

        self.runthread_over = True

if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    # 创建rtsp server对象
    rtspserver = RtspServer()
    # 启动rtsp server
    rtspserver.start()
    # 打印rtsp url
    print("rtsp server start:",rtspserver.get_rtsp_url())
    # 推流60s
    sleep(60)
    # 停止rtsp server
    rtspserver.stop()
    print("done")