问题描述
k230开启热点模式后我在android端使用MediaPlayer控件播放rtsp流,为什么播放几秒钟之后就会监听到rtsp推送结束,导致播放中断
硬件板卡
我使用的是k230
k230开启热点模式后我在android端使用MediaPlayer控件播放rtsp流,为什么播放几秒钟之后就会监听到rtsp推送结束,导致播放中断
我使用的是k230
你好,问题可能由网络不稳定导致客户端主动断开连接。建议先查看服务器端(K230)的输出日志,如有必要需要抓取 RTSP 通信的网络数据包,以分析完整的交互流程。
有从android端稳定接受rtsp流的案例吗
无论是 Android 还是其他平台,作为 RTSP 客户端的处理逻辑是一致的。建议下载 VLC( https://www.32r.com/app/64527.html )测试——我刚验证可正常播放。若仍存在问题,可尝试改用有线网络,以排除无线网络不稳定导致的断开。
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()