Toybrick

标题: RK3588上Python SDK和MPP视频推流 [打印本页]

作者: sdp    时间: 2023-3-21 08:43
标题: RK3588上Python SDK和MPP视频推流
最近尝试在RK3588上使用Python和C进行视频推流遇到以下问题:
1.使用debian11预装的Python SDK python3-toybrick,首先使用cv2.VideoCapture读入usb相机视频,然后使用toy.RtspWriter推流,推流结果有1秒左右延迟,请问延迟有这么大吗?该怎么设置参数降低延迟呢?
2.使用toy.RtspCapture拉取海康威视网络相机的视频,设置好url,user,pwd等参数,toy.RtspCapture(“rtsp://xxx.xxx.x.xx:xxx/xxx/xxx”,user=“admin”, password=“admin”, use_tcp=False),read总是报错segmentation fault,似乎是没有获取到视频流,我检查过地址似乎没有错,该怎么设置参数呢?
3.使用rockchip-mpp进行C语言版视频推流,sudo apt -y install rockchip-mpp-tests只有可执行文件(路径:/usr/bin):mpi_dec_test,mpi_enc_test等吗?找不到.c源文件,只能自己去https://github.com/rockchip-linux/mpp下载源码编译才能使用tests里面的.c文件吗?另外也找不到这个开发文档:开发指导详见:边缘计算SDK工程的docs/common/MPP/目录下文档。具体网址是什么呢?



作者: jefferyzhang    时间: 2023-3-21 08:52
1. 延迟一般是客户端播放缓存
2. 造成段错误的代码可以发出来我们试试,或者gdb跟踪下段错误的堆栈发给我们
3. https://github.com/rockchip-toybrick/edge/tree/main/docs/edge/mpp  这些东西wiki都有地址.
作者: sdp    时间: 2023-3-21 11:17
本帖最后由 sdp 于 2023-3-21 11:33 编辑
jefferyzhang 发表于 2023-3-21 08:52
1. 延迟一般是客户端播放缓存
2. 造成段错误的代码可以发出来我们试试,或者gdb跟踪下段错误的堆栈发给我们 ...

感谢大佬回复这么即时!
代码如下:
rtspcap=toy.RtspCapture(url='rtsp://admin:admin@192.168.1.64:554/h264/ch1/main/av_stream', user='admin', password='admin', use_tcp=False)
或者
rtspcap=toy.RtspCapture(url='rtsp://192.168.1.64:554/h264/ch1/main/av_stream', user='admin', password='admin', use_tcp=False)这样??
while(True):
ret, img = rtspcap.read(width=1920, height=1080, gformat=toy.FMT_RGB888)
错误如下:
[attach]2625[/attach]
另外,我参考这篇博客https://blog.csdn.net/weixin_41247701/article/details/113926273使用cv2.VideoCapture('rtsp://admin:admin@192.168.1.64:554/h264/ch1/main/av_stream')是可以获取视频的。



作者: jefferyzhang    时间: 2023-3-21 14:27
请用GDB跟下看下错误堆栈,这里除了那个段错误看不出任何问题。
作者: sdp    时间: 2023-3-21 15:30
本帖最后由 sdp 于 2023-3-21 15:33 编辑

[attach]2626[/attach]
No such file or directory, 似乎是没有获取到视频流?

jefferyzhang 发表于 2023-3-21 14:27
请用GDB跟下看下错误堆栈,这里除了那个段错误看不出任何问题。


作者: jefferyzhang    时间: 2023-3-22 08:51
感谢你的堆栈信息,该问题已经修复。这个是工程师在析构时候没有判空造成的。
但这个跟你的代码没有什么关系,如果你正常写代码是不会进到析构的。你代码贴出来,你的代码逻辑还是有问题的。
作者: sdp    时间: 2023-3-22 09:58
本帖最后由 sdp 于 2023-3-23 08:14 编辑
jefferyzhang 发表于 2023-3-22 08:51
感谢你的堆栈信息,该问题已经修复。这个是工程师在析构时候没有判空造成的。
但这个跟你的代码没有什么关 ...

if __name__ == '__main__':

    # Create RKNN object
    host_name = get_host()
    if host_name == 'RK3588':
        rknn_model = RKNN_MODEL
    else:
        print("This demo cannot run on the current platform: {}".format(host_name))
        exit(-1)

    rknn = RKNNLite()

    # load RKNN model
    print('--> Load RKNN model')
    ret = rknn.load_rknn(rknn_model)
    if ret != 0:
        print('Load RKNN model failed')
        exit(ret)
    print('done')

    # init runtime environment
    print('--> Init runtime environment')
    # run on RK356x/RK3588 with Debian OS, do not need specify target.
    if host_name == 'RK3588':
        ret = rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2)
        #ret = rknn.init_runtime()
        print("use npu!")
    else:
        ret = rknn.init_runtime()
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print('done')

    videopath = 'data/video/' + 'test1' + '.mp4' #WORK_MODEL
    #capture=cv2.VideoCapture(videopath)  # test.mp4
    #capture=cv2.VideoCapture(41)
    #capture=cv2.VideoCapture('rtsp://admin:admin@192.168.1.64:554/h264/ch1/main/av_stream')
    #rtspcap = toy.RtspCapture(url='rtsp://admin:admin@192.168.1.64:554/h264/ch1/main/av_stream', user='admin', password='admin', use_tcp=False)
    rtspcap = toy.RtspCapture(url='rtsp://192.168.1.64:554/h264/ch1/main/av_stream', user='admin', password='admin', use_tcp=False)
    #ISPcap = toy.CameraCapture(41, 1920, 1080)
   
    font = cv2.FONT_HERSHEY_SIMPLEX
    accum_time=0
    curr_fps=0
    prev_time=timer()
    Obj="Objects:"
    fps="FPS:"
    flag=0
    savepath = 'data/video/' + '111' + '.mp4' #WORK_MODEL
    vid_writer = cv2.VideoWriter(savepath, cv2.VideoWriter_fourcc(*'mp4v'), 30, (IMG_SIZE, IMG_SIZE))
    rtsps = toy.RtspWriter("/live", encoder=toy.FMT_H264, port=8554)
    # rtsp://127.0.0.1:8554/live
    try:
        while(True):
            #ret1, img=capture.read()
            ret1, img = rtspcap.read(width=1920, height=1080, gformat=toy.FMT_RGB888)
            #ret1, img = ISPcap.read(1920, 1080)
            if ret1 == True:
                flag+=1
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
                cv2.imshow("res", img)
                cv2.waitKey(1)
            else:
                break
    except KeyboardInterrupt:
        cv2.destroyAllWindows()
        rknn.release()
        vid_writer.release()

作者: jefferyzhang    时间: 2023-3-22 10:54
#ret1, img=capture.read()
            ret1, img = rtspcap.read(width=1920, height=1080, gformat=toy.FMT_RGB888)
            #ret1, img = ISPcap.read(1920, 1080)
            if ret1 == True:
                flag+=1
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
                cv2.imshow("res", img)
                cv2.waitKey(1)
            else:
                break

运行一次就break掉了,你代码自己不调试下先么?
作者: sdp    时间: 2023-3-22 11:24
本帖最后由 sdp 于 2023-3-22 11:26 编辑
jefferyzhang 发表于 2023-3-22 10:54
#ret1, img=capture.read()
            ret1, img = rtspcap.read(width=1920, height=1080, gformat=toy ...

ret1有返回值应该就不会break吧?我continue打印出了ret1和img,ret1=28673,img=None,就是一直获取不到视频流,使用opencv可以获取。




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3