您好,使用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;
补充材料