ffmedia如何设置帧等待时间

固件类型:官方提供的固件
固件文件名称:ROC-RK3588S-PC-EXT_Ubuntu20.04-Gnome-r2407_v1.1.1a
固件下载地址:ROC-RK3588S-PC-EXT_Ubuntu20.04-Gnome-r2407_v1.1.1a_230704
Log日志:微信图片_20230919164611.rar

我的需求是每秒钟采集一张图像识别

目前是Cv2Display里面做一个判断

    def run(self):
        while not self.is_stop:
            with self.lock:
                while not self.frame_complete:
                    self.condition.wait()
                try:
                    if self.last < (time.time() * 1000) - 1000:
                        self.last = time.time() * 1000
                        input_para = self.module.getOutputImagePara()
                        data = self.frame.getActiveData()
                        # 帧数据转换为数组形式
                        img = data.reshape((input_para.vstride, input_para.hstride, 3))
                        print('--------------------------')
                except ValueError as e:
                    print("Invalid image resolution!")
                    resolution = find_two_numbers(data.size // 3, input_para.hstride, input_para.vstride)
                    print("Try the recommended resolution: -o {}x{}".format(resolution[0], resolution[1]))
                    break
                self.frame_complete = False
                self.condition.notify()

采集一个rtsp的留CPU使用了百分之8

有什么好的解决办法

tchip_askquestions
微信图片_20230919164611.rar (43.6 KB)

回调不出去,那模块就无法处理下一帧,所以你可以在回调等待1秒,或者你用个定时器一秒再去拿帧

dengkx 发表于 2023-9-20 09:56
回调不出去,那模块就无法处理下一帧,所以你可以在回调等待1秒,或者你用个定时器一秒再去拿帧

def cv2_call_back(obj, VideoBuffer):
    time.sleep(1)
    with obj.lock:
        while obj.frame_complete:
            if not obj.condition.wait(timeout=1):
                return
        vb = obj.module.exportUseMediaBuffer(VideoBuffer, obj.frame, 0)
        if vb is not None:
            obj.frame = vb
            obj.frame_complete = True
        obj.condition.notify()

我在回调函数中做了等待,但是有时候会出现报错,请问这个是什么原因

chenll 发表于 2023-9-20 12:47
我在回调函数中做了等待,但是有时候会出现报错,请问这个是什么原因

你的是rtsp实时流,如果你阻塞了链路,那么rtsp会因为缓冲区满而丢帧,导致解码器就无法解出p帧,p帧需要参考前一帧才能解出来。如果是实时流,就不能阻塞,可以使用过滤或者隔帧推理

dengkx 发表于 2023-9-20 16:10
你的是rtsp实时流,如果你阻塞了链路,那么rtsp会因为缓冲区满而丢帧,导致解码器就无法解出p帧,p帧需要 …

请问 过滤或者隔帧推理这个有demo吗,ffmedia_release 如何隔帧推理

chenll 发表于 2023-9-20 16:53
请问 过滤或者隔帧推理这个有demo吗,ffmedia_release 如何隔帧推理

隔帧推理,每过几帧推理一帧. 最新的ffmedia初步支持了rknn,可以看下

dengkx 发表于 2023-9-20 17:24
隔帧推理,每过几帧推理一帧. 最新的ffmedia初步支持了rknn,可以看下

https://gitlab.com/firefly-linux/ffmedia_release

我在这里的主分支的demo.py文件中没有看到隔振推理的参数
不是在参数里面吗

parser.add_argument("-i", "--input_source", dest='input_source', type=str, help="input source")
    parser.add_argument("-f", "--save_file", dest='save_file', type=str, help="Enable save dec output data to file, set filename, default disabled")
    parser.add_argument("-o", "--output", dest='output', type=str, help="Output image size, default same as input")
    parser.add_argument("-b", "--outputfmt", dest='outputfmt', type=str, default="NV12", help="Output image format, default NV12")
    parser.add_argument("-e", "--encodetype", dest='encodetype', type=int, default=-1, help="Encode encode, set encode type, default disabled")
    parser.add_argument("-m", "--enmux", dest='enmux', type=str, help="Enable save encode data to file, Enable package as mp4, mkv, or raw stream files depending on the file name suffix. default disabled")
    parser.add_argument("-M", "--filemaxframe", dest='filemaxframe', type=int, default= 0, help="Set the maximum number of frames that can be saved. The default number is unlimited")
    parser.add_argument("-p", "--port", dest='port', type=int, default=0, help="Enable push stream, default rtsp stream, set push port, depend on encode enabled, default disabled\n")
    parser.add_argument("--push_type", dest='push_type', type=int, default=0, help="Set push stream type, default rtsp. e.g. --push_type 1\n")
    parser.add_argument("--rtsp_transport", dest='rtsp_transport', type=int, default=0, help="Set the rtsp transport type, default 0(udp)")
    parser.add_argument("-s", "--sync", dest="sync", type=int, default=-1, help="Enable synchronization module, default disabled. e.g. -s 1")
    parser.add_argument("-a", "--aplay", dest='aplay', type=str, help="Enable play audio, default disabled. e.g. -a plughw:3,0")
    parser.add_argument("-r", "--rotate", dest='rotate',type=int, default=0, help="Image rotation degree, default 0" )
    parser.add_argument("-d", "--drmdisplay", dest='drmdisplay', type=int, default=-1, help="Drm display, set display plane, set 0 to auto find plane")
    parser.add_argument("-c", "--cvdisplay", dest='cvdisplay', type=int, default=0, help="OpenCv display, set window number, default 0")
    parser.add_argument("-x", "--x11display", dest='x11display', type=int, default=0, help="X11 window displays, render the video using gles. default disabled")

chenll 发表于 2023-9-20 19:15
https://gitlab.com/firefly-linux/ffmedia_release

我在这里的主分支的demo.py文件中没有看到隔振推 …

demo在rknn/src下,py的只添加了接口,还没写出demo。你可以认为推理时间大于视频帧间隔,可以跳过一帧或多帧再推理一帧,后面跳过的帧继续使用这帧的推理结果直到再次推理

dengkx 发表于 2023-9-21 10:01
demo在rknn/src下,py的只添加了接口,还没写出demo。你可以认为推理时间大于视频帧间隔,可以跳过一帧或 …

等不能说一下py的接口是哪个,我看了demo.cpp 但是没有找到是哪里使用的,因看不懂C

dengkx 发表于 2023-9-21 10:01
demo在rknn/src下,py的只添加了接口,还没写出demo。你可以认为推理时间大于视频帧间隔,可以跳过一帧或 …

我在ffmedia_api.pdf 这个文档里面也没有看到跳帧或者是间隔帧

chenll 发表于 2023-9-21 12:17
等不能说一下py的接口是哪个,我看了demo.cpp 但是没有找到是哪里使用的,因看不懂C

看demo/Readme.md 在使用rknn推理的例子是仓库下的rknn/src/demo_rknn.cpp。你可以按照demo/Readme.md 编译出demo_rknn,然后按照文档运行他

dengkx 发表于 2023-9-22 15:42
看demo/Readme.md 在使用rknn推理的例子是仓库下的rknn/src/demo_rknn.cpp。你可以按照demo/Readme.md 编 …

我对照demo_rknn.cpp写了一个py版本的但是加载rknn 模型时候出现了问题

setModelData(): incompatible function arguments. The following argument types are supported:
    1. (self: ff_pymedia.ModuleInference, arg0: capsule, arg1: int) -> int

Invoked with: <ff_pymedia.ModuleInference object at 0x7fa664f0f0>, <ff_pymedia.ModuleInference object at 0x7fa664f0f0>, 'iot_firefly.rknn', 0

========================

dec.setModelData('iot_firefly.rknn', 0)
            ret = dec.init()
            if ret < 0:
                print("dec init failed")
                raise Exception
            else:
                print("dec int done")

=============demo代码=============

input_para = dec->getOutputImagePara();
        inf = make_shared<ModuleInference>(input_para);
        inf->setProductor(dec);
        inf->setInferenceInterval(1);
        if (inf->setModelData(argv[2], 0) < 0) {
            ff_error("inf setModelData fail!\n");
            break;
        }
        ret = inf->init();
        if (ret < 0) {
            ff_error("inf init failed\n");
            break;
        }

chenll 发表于 2023-9-22 19:42
我对照demo_rknn.cpp写了一个py版本的但是加载rknn 模型时候出现了问题

setModelDatac的参数类型没有转换处理,下个版本修复该问题

chenll 发表于 2023-9-22 19:42
我对照demo_rknn.cpp写了一个py版本的但是加载rknn 模型时候出现了问题

新版本可以推理了,就是不知道py那边需要的数据类型是什么,暂时将c++的推理结果数据(uint8)实例成py数组,再把这些数组合成list,所以使用模块的getOutputList()获取推理结果

dengkx 发表于 2023-10-8 14:45
新版本可以推理了,就是不知道py那边需要的数据类型是什么,暂时将c++的推理结果数据(uint8)实例成py数 …

好的,我用新版本的测试一下

dengkx 发表于 2023-10-8 14:45
新版本可以推理了,就是不知道py那边需要的数据类型是什么,暂时将c++的推理结果数据(uint8)实例成py数 …

rga_api version 1.8.1_[4]
E RKNN: [02:31:33.993] parseRKNN: rknn model is too small!
E RKNN: [02:31:33.993] parseRKNN from buffer: Invalid RKNN format!
E RKNN: [02:31:33.993] rknn_init, load model failed!
ERROR: ff_media: setModel: rknn_init fail! ret=-6
ERROR: 15ModuleInference: init: model input height=0, width=0 is incorrect

我这里出现说rknn 的模型太小了,我试了几个20Mb的也不行

要传模型路径,他应该是没找到你输入的模型文件,把他当做模型数据了。检测一下你输入的模型路径对不对,或者使用绝对路径

dengkx 发表于 2023-10-17 11:16
要传模型路径,他应该是没找到你输入的模型文件,把他当做模型数据了。检测一下你输入的模型路径对不对,或 …

这个是设置的路径dec.setModelData(‘/home/firefly/project/iot_firefly.rknn’, 1)

fireflyÄfirefly:ü/project$ pwd
/home/firefly/project
fireflyÄfirefly:ü/project$ ls
ffmedia_release iot_firefly1.rknn iot_firefly2.rknn iot_firefly.rknn main.py

用的是绝对路径路径应该是没有问题的

chenll 发表于 2023-10-17 11:25
这个是设置的路径dec.setModelData(‘/home/firefly/project/iot_firefly.rknn’, 1)

fireflyÄfire …

使用文件大小要设置0