嘉楠科技
直播中

悬崖勒马2

9年用户 969经验值
擅长:EMC/EMI设计
私信 关注
[问答]

K230开发板如何用Micropython把视频推流到远程RTSP服务器?

打算使用K230开发类似安防摄像头的应用,可以通过互联网远程查看开发板摄像头拍摄的视频,需要把开发板摄像头获取的视频推流到远程的RTSP服务器上,但开发文档中提供的Micropython示例是开发板自建RTSP服务器,并向局域网提供一个RTSP视频流地址,供局域网中设备拉流使用,与需求不同,请问这个需求应该如何解决?
        你的需求目前只有C的接口(参照/src/rtsmart/mpp/middleware/sample/sample_rtsppusher),micropython的接口还未做封装。
你可以自行调用C的接口来封装micropyton接口,参照开发板自建RTSP服务器接口。

回帖(1)

cherry1989

2025-6-24 17:56:27

要在K230开发板上使用MicroPython实现RTSP推流到远程服务器,需要结合C语言底层接口进行功能扩展。以下是完整解决方案:


一、根本原因分析



  1. MicroPython SDK目前仅支持RTSP拉流服务端模式(摄像头->开发板RTSP服务器)

  2. 推流到远程RTSP服务器需要的客户端模式仅存在于C语言示例中(sample_rtsppusher)


二、解决步骤


方案A:通过C扩展增强MicroPython(推荐)


/* 步骤1:创建MicroPython C扩展 */
#include "py/obj.h"
#include "libavformat/avformat.h"

// 包装推流函数
STATIC mp_obj_t rtsp_push(mp_obj_t url_obj, mp_obj_t cam_id_obj) {
    const char *rtsp_url = mp_obj_str_get_str(url_obj);
    int cam_id = mp_obj_get_int(cam_id_obj);

    // 调用底层推流接口(需实现)
    int ret = k230_push_stream(rtsp_url, cam_id);

    return mp_obj_new_int(ret);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(rtsp_push_obj, rtsp_push);

// 模块注册
STATIC const mp_rom_map_elem_t rtsp_module_globals[] = {
    { MP_ROM_QSTR(MP_QSTR_push), MP_ROM_PTR(&rtsp_push_obj) },
};
STATIC MP_DEFINE_CONST_DICT(rtsp_module_globals, rtsp_module_globals);

const mp_obj_module_t rtsp_pusher_module = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t*)&rtsp_module_globals,
};

MP_REGISTER_MODULE(MP_QSTR_rtsp, rtsp_pusher_module);

# 步骤2:MicroPython调用示例
import rtsp

# 推流到远程服务器
rtsp.push("rtsp://your-server.com/live/stream", 0)  # 0号摄像头

方案B:使用子进程调用C程序(临时方案)


import uos

def start_rtsp_push(rtsp_url):
    # 调用预编译的C可执行文件
    cmd = f"sample_rtsppusher {rtsp_url} &"
    uos.system(cmd)

# 启动推流
start_rtsp_push("rtsp://192.168.1.100:554/live.stream")

三、开发环境配置




  1. 修改SDK编译配置:


    # 在SDK根目录
    make menuconfig
    > Select MicroPython
    → Enable RTSP Push Extension



  2. 编译自定义固件:


    make clean
    make mpyr-pusher -j   # 编译MicroPython扩展
    make k230-image       # 生成完整固件



四、远程服务器配置要点




  1. RTSP服务器选择



    • 推荐使用Mediamtx(原rtsp-simple-server)

    • 或专业流媒体服务器(Wowza, Nimble)




  2. 安全验证


    # 带认证的推流地址
    rtsp.push("rtsp://user:pass@server.com:554/stream?encrypt=1", 0)



五、故障排查指南


# 查看推流状态
netstat -nt | grep 554

# 调试工具
ffmpeg -i rtsp://your-server/stream  # 测试流可访问性
v4l2-ctl --list-devices             # 验证摄像头识别

六、性能优化建议



  1. k230_push_stream()中实现:

    // 降低延迟参数
    av_dict_set(&options, "tune", "zerolatency", 0);
    av_dict_set(&options, "preset", "ultrafast", 0);


// 分辨率设置(根据带宽调整)
video_params = {
.width = 1280,
.height = 720,
.bitrate = 500000  // 500Kbps
};



### 替代方案参考
1. **GB28181协议**:
   ```python
   import onvif
   camera = onvif.ONVIFCamera('IPC_ADDR', 80, 'user', 'pass')
   camera.create_push_target('gb_server.com', 5060)


  1. WebRTC直推(需额外实现):
    from webrtc import RTCPeerConnection
    pc = RTCPeerConnection()
    pc.add_stream(camera.source)
    pc.connect("wss://signaling.server.com")



关键提醒:实现推流核心需调用avformat_write_header()av_interleaved_write_frame()等FFmpeg API,具体参考sdk/mpp/middleware/avstream底层实现



建议优先采用C扩展方案,可参考SDK中samples/media/rtsp_pusher_demo.c的实现逻辑,封装成MicroPython可调用接口。对于紧急需求,可先用方案B通过系统命令调用预编译的C程序实现基本功能。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分