LCKFB开发板通过CanMV取的MJPEG码流,图像像素颗粒感很大

Viewed 34

您好,使用26(MJPEG)格式:chnAttr1 = ChnAttrStr(26, encoder1.H264_PROFILE_MAIN, width, height)
能明显感觉到像素的颗粒感,请问如何解决?

def thread_camera_enter(name):
    width=1280
    height=720
    width = ALIGN_UP(width, 16)

    # 初始化sensor
    sensor1 = Sensor(id=0, fps=30)
    sensor1.reset()
    sensor2 = Sensor(id=1, fps=30)
    sensor2.reset()
    sensor3 = Sensor(id=2, fps=30)
    sensor3.reset()

    # 设置camera 输出buffer
    sensor1.set_framesize(width = width, height = height, alignment=12)
    sensor1.set_pixformat(Sensor.YUV420SP)
    sensor2.set_framesize(width = width, height = height, alignment=12)
    sensor2.set_pixformat(Sensor.YUV420SP)
    sensor3.set_framesize(width = width, height = height, alignment=12)
    sensor3.set_pixformat(Sensor.YUV420SP)

    # 实例化video encoder
    encoder1 = Encoder()
    encoder1.SetOutBufs(VENC_CHN_ID_0, 8, width, height)
    encoder2 = Encoder()
    encoder2.SetOutBufs(VENC_CHN_ID_1, 8, width, height)
    encoder3 = Encoder()
    encoder3.SetOutBufs(VENC_CHN_ID_2, 8, width, height)

    # 绑定camera和venc
    link1 = MediaManager.link(sensor1.bind_info()['src'], (VIDEO_ENCODE_MOD_ID, VENC_DEV_ID, VENC_CHN_ID_0))
    link2 = MediaManager.link(sensor2.bind_info()['src'], (VIDEO_ENCODE_MOD_ID, VENC_DEV_ID, VENC_CHN_ID_1))
    link3 = MediaManager.link(sensor3.bind_info()['src'], (VIDEO_ENCODE_MOD_ID, VENC_DEV_ID, VENC_CHN_ID_2))

    # init media manager
    MediaManager.init()

    chnAttr1 = ChnAttrStr(26, encoder1.H264_PROFILE_MAIN, width, height)
    chnAttr2 = ChnAttrStr(26, encoder2.H264_PROFILE_MAIN, width, height)
    chnAttr3 = ChnAttrStr(26, encoder3.H264_PROFILE_MAIN, width, height)

    streamData1 = StreamData()
    streamData2 = StreamData()
    streamData3 = StreamData()

    # 创建编码器
    encoder1.Create(VENC_CHN_ID_0, chnAttr1)
    encoder2.Create(VENC_CHN_ID_1, chnAttr2)
    encoder3.Create(VENC_CHN_ID_2, chnAttr3)

    # 开始编码
    encoder1.Start(VENC_CHN_ID_0)
    encoder2.Start(VENC_CHN_ID_1)
    encoder3.Start(VENC_CHN_ID_2)
    print("start encoder init ok")

    # 配置网络传输通道

    # 启动camera
    sensor1.run()
    sensor2.run()
    sensor3.run()
    print("sensor run ...")

    switch = 1
    frame_count = 0
    while (True):
        os.exitpoint()
        encoder1.GetStream(VENC_CHN_ID_0, streamData1) # 获取一帧码流
        for pack_idx in range(0, streamData1.pack_cnt):
            if (switch == 1):
                stream_data = bytes(uctypes.bytearray_at(streamData1.data[pack_idx], streamData1.data_size[pack_idx]))
                network_camera.send(stream_data, 1)
                print("camera1", len(stream_data));
        encoder1.ReleaseStream(VENC_CHN_ID_0, streamData1) # 释放一帧码流

        encoder2.GetStream(VENC_CHN_ID_1, streamData2) # 获取一帧码流
        for pack_idx in range(0, streamData2.pack_cnt):
            if (switch == 2):
                stream_data = bytes(uctypes.bytearray_at(streamData2.data[pack_idx], streamData2.data_size[pack_idx]))
                network_camera.send(stream_data, 2)
                print("camera2", len(stream_data));
        encoder2.ReleaseStream(VENC_CHN_ID_1, streamData2) # 释放一帧码流

        encoder3.GetStream(VENC_CHN_ID_2, streamData3) # 获取一帧码流
        for pack_idx in range(0, streamData3.pack_cnt):
            if (switch == 3):
                stream_data = bytes(uctypes.bytearray_at(streamData3.data[pack_idx], streamData3.data_size[pack_idx]))
                network_camera.send(stream_data, 3)
                print("camera3", len(stream_data));
        encoder3.ReleaseStream(VENC_CHN_ID_2, streamData3) # 释放一帧码流

        frame_count += 1
        if (frame_count >= 10):
            frame_count = 0
            switch += 1
            if (switch > 3):
                switch = 1;

补充材料

732b2f057b1ff4761941a1e0224bfba4.png

1 Answers

您好,请先下载最新固件后再尝试:请获取最新固件(https://github.com/kendryte/canmv_k230/releases/tag/PreRelease )。新版本中新增了 JPEG 图像编码控制功能。
若要使用 JPEG 编码功能,请在创建编码器时指定 PAYLOAD_TYPE_JPEG 类型。若默认输出质量无法满足需求,您可以通过修改 ChnAttrStr 结构体中的 mjpeg_quality_factor 参数(取值范围 1-100,数值越大质量越高)进行精细化调整。