canmv是否有控制视频编码器输出帧率的功能?

Viewed 217

canmv是否有控制视频编码器输出帧率的功能?

我正在编写一个GB28181标准的设备端代码 需要25fps的帧率 但我运行demo的时候 看到显示是output 1920x1080@60 如下图 要如何去修改这个帧率? 翻阅文档并没有找到相关的函数
image.png

3 Answers

参考如下代码实现:

def vi_bind_venc_test(file_name,width=1280, height=720):
    print("venc_test start")
    venc_chn = VENC_CHN_ID_0
    width = ALIGN_UP(width, 16)
    venc_payload_type = K_PT_H264

    # 判断文件类型
    suffix = file_name.split('.')[-1]
    if suffix == '264':
        venc_payload_type = K_PT_H264
    elif suffix == '265':
        venc_payload_type = K_PT_H265
    else:
        print("Unknown file extension")
        return

    # 初始化sensor
    sensor = Sensor()
    sensor.reset()
    
    # 设置camera 输出buffer
    # set chn0 output size
    sensor.set_framesize(width = width, height = height, alignment=12)
    # set chn0 output format
    sensor.set_pixformat(Sensor.YUV420SP)
    sensor._set_chn_fps(chn = 0, fps = 25)


    # 实例化video encoder
    encoder = Encoder()
    # 设置video encoder 输出buffer
    encoder.SetOutBufs(venc_chn, 8, width, height)

    # 绑定camera和venc
    link = MediaManager.link(sensor.bind_info()['src'], (VIDEO_ENCODE_MOD_ID, VENC_DEV_ID, venc_chn))

    # init media manager
    MediaManager.init()

    if (venc_payload_type == K_PT_H264):
        chnAttr = ChnAttrStr(encoder.PAYLOAD_TYPE_H264, encoder.H264_PROFILE_MAIN, width, height,src_frame_rate=25,dst_frame_rate=25)
    elif (venc_payload_type == K_PT_H265):
        chnAttr = ChnAttrStr(encoder.PAYLOAD_TYPE_H265, encoder.H265_PROFILE_MAIN, width, height,src_frame_rate=25,dst_frame_rate=25)

    streamData = StreamData()

    # 创建编码器
    encoder.Create(venc_chn, chnAttr)

    # 开始编码
    encoder.Start(venc_chn)
    # 启动camera
    sensor.run()

    frame_count = 0
    print("save stream to file: ", file_name)
    clock = utime.clock()
    

    with open(file_name, "wb") as fo:
        try:
            while True:
                os.exitpoint()
                clock.tick()
                encoder.GetStream(venc_chn, streamData) # 获取一帧码流

                for pack_idx in range(0, streamData.pack_cnt):
                    stream_data = uctypes.bytearray_at(streamData.data[pack_idx], streamData.data_size[pack_idx])
                    fo.write(stream_data) # 码流写文件
                    print("stream size: ", streamData.data_size[pack_idx], "stream type: ", streamData.stream_type[pack_idx])

                encoder.ReleaseStream(venc_chn, streamData) # 释放一帧码流
                
                print("fps = ", clock.fps())

                frame_count += 1
                if frame_count >= 200:
                    break
        except KeyboardInterrupt as e:
            print("user stop: ", e)
        except BaseException as e:
            import sys
            sys.print_exception(e)

    # 停止camera
    sensor.stop()
    # 销毁camera和venc的绑定
    del link
    # 停止编码
    encoder.Stop(venc_chn)
    # 销毁编码器
    encoder.Destroy(venc_chn)
    # 清理buffer
    MediaManager.deinit()
    print("venc_test stop")

我在编码器的py源码中看到了对于帧率和比特率的地方 有一个疑问 这个东西都在代码中直接写死了 那我单独修改sensor的帧率的情况下 对编码器来说 会起作用么? 图在最后一楼贴上

近期已经将这几个编码参数公开了,请更新到最新版本。

已有旧版本SDK的情况下应该如何更新呢? 是否可以通过makefile的命令之类的?

您好,可以通过设置sensor的输出帧率来控制视频编码器的输出帧率。

sensor._set_chn_fps(chn=0, fps=25)

我加上了这一句 但似乎并没有生效呢 图在下方

我阅读了源码 发现这个打印是在我调用_set_chn_fps之前打印出来的 但 我在调用构造函数的时候传入了fps=25也无法让这个设置生效 依然还是按照1920*1080@60来打印的 图在下方