K230热点模式是否是连续推送rtsp流

Viewed 96

问题描述


k230开启热点模式后我在android端使用MediaPlayer控件播放rtsp流,为什么播放几秒钟之后就会监听到rtsp推送结束,导致播放中断

硬件板卡


我使用的是k230

3 Answers

你好,问题可能由网络不稳定导致客户端主动断开连接。建议先查看服务器端(K230)的输出日志,如有必要需要抓取 RTSP 通信的网络数据包,以分析完整的交互流程。

有从android端稳定接受rtsp流的案例吗

无论是 Android 还是其他平台,作为 RTSP 客户端的处理逻辑是一致的。建议下载 VLC( https://www.32r.com/app/64527.html )测试——我刚验证可正常播放。若仍存在问题,可尝试改用有线网络,以排除无线网络不稳定导致的断开。img_v3_02tu_fdfc0703-23ba-44f2-b775-02aedf88896g.jpg

我使用vlc播放也是正常的,但是我用Android的MediaPlayer控件则会监听到eof,我怀疑是我的python写的有问题,可以帮我看看吗

Android 上安装vlc,用android 上的vlc 播放试一试

android的vlc也能播。。。

import sys
import time
import os
import _thread
import gc
import uctypes
import multimedia as mm
from media.vencoder import *
from media.sensor import *
from media.media import *
from media.display import *

def start_ap(ssid, password):
    import network
    ap = network.WLAN(network.AP_IF)
    ap.active(True)
    ap.config(ssid=ssid, key=password)
    time.sleep(3)
    try:
        return ap.ifconfig()[0]
    except Exception:
        return "0.0.0.0"

class RtspServer:
    def __init__(self, session_name="video", port=8554, video_type=mm.multi_media_type.media_h264, enable_audio=False, sensor=None, initMediaManager=False):
        self.session_name = session_name
        self.video_type = video_type
        self.enable_audio = enable_audio
        self.port = port
        self.rtspserver = mm.rtsp_server()
        self.venc_chn = VENC_CHN_ID_0
        self.start_stream = False
        self.runthread_over = False
        self.sensor = sensor
        self.initMediaManager = initMediaManager

    def start(self):
        self._init_stream()
        self.rtspserver.rtspserver_init(self.port)
        self.rtspserver.rtspserver_createsession(self.session_name, self.video_type, self.enable_audio)
        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:
            time.sleep(0.1)
        self.runthread_over = False
        self._stop_stream()
        self.rtspserver.rtspserver_stop()
        self.rtspserver.rtspserver_deinit()

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

    def _init_stream(self):
        width = 512
        height = 288
        self.sensor = Sensor()
        self.sensor.reset()
        self.sensor.set_framesize(width=width, height=height, alignment=12)
        self.sensor.set_pixformat(Sensor.YUV420SP)
        self.encoder = Encoder()
        self.encoder.SetOutBufs(self.venc_chn, 8, width, height)
        self.link = None
        MediaManager.init()
        chnAttr = ChnAttrStr(self.encoder.PAYLOAD_TYPE_H264, self.encoder.H264_PROFILE_MAIN, width, height, bit_rate=100, dst_frame_rate=5, src_frame_rate=5)
        self.encoder.Create(self.venc_chn, chnAttr)

    def _start_stream(self):
        self.encoder.Start(self.venc_chn)
        self.sensor.run()

    def _stop_stream(self):
        self.sensor.stop()
        del self.link
        self.encoder.Stop(self.venc_chn)
        self.encoder.Destroy(self.venc_chn)
        MediaManager.deinit()

    def _do_rtsp_stream(self):
        try:
            streamData = StreamData()
            frame_info = k_video_frame_info()
            while self.start_stream:
                rtsp_show_img = self.sensor.snapshot()
                if rtsp_show_img == -1:
                    continue
                frame_info.v_frame.width = rtsp_show_img.width()
                frame_info.v_frame.height = rtsp_show_img.height()
                frame_info.v_frame.pixel_format = Sensor.YUV420SP
                frame_info.pool_id = rtsp_show_img.poolid()
                frame_info.v_frame.phys_addr[0] = rtsp_show_img.phyaddr()
                if rtsp_show_img.width() == 800 and rtsp_show_img.height() == 480:
                    frame_info.v_frame.phys_addr[1] = frame_info.v_frame.phys_addr[0] + frame_info.v_frame.width * frame_info.v_frame.height + 1024
                elif rtsp_show_img.width() == 1920 and rtsp_show_img.height() == 1080:
                    frame_info.v_frame.phys_addr[1] = frame_info.v_frame.phys_addr[0] + frame_info.v_frame.width * frame_info.v_frame.height + 3072
                elif rtsp_show_img.width() == 640 and rtsp_show_img.height() == 360:
                    frame_info.v_frame.phys_addr[1] = frame_info.v_frame.phys_addr[0] + frame_info.v_frame.width * frame_info.v_frame.height + 3072
                else:
                    frame_info.v_frame.phys_addr[1] = frame_info.v_frame.phys_addr[0] + frame_info.v_frame.width * frame_info.v_frame.height
                self.encoder.SendFrame(self.venc_chn, frame_info)
                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)
                self.encoder.ReleaseStream(self.venc_chn, streamData)
                gc.collect()
                time.sleep_us(10)
                os.exitpoint()
        except BaseException as e:
            print(f"Exception {e}")
        finally:
            self.runthread_over = True
            self.stop()
        self.runthread_over = True
def run_rtsp(session_name="video", port=8554):
    s = RtspServer(session_name=session_name, port=port)
    s.start()
    return s

def main():
    ssid = "DoorCam_AP"
    password = "88888888"
    ip = start_ap(ssid, password)
    if ip == "0.0.0.0":
        print("[AP] 启动失败")
        sys.exit(1)
    print("[AP] 已启动 SSID:", ssid, "IP:", ip)
    print("[RTSP] 启动中")
    server = run_rtsp()
    url = server.get_rtsp_url()
    print("[RTSP] 地址:", url)
    while True:
        time.sleep_ms(10)

if __name__ == "__main__":
    main()