双摄像头进行录像是多进程还是多线程

Viewed 52

问题描述


项目中需要使用两个摄像头进行录像,哪么是需要多线程还是多进程来处理,有没有有经验的大哥来解答一下,我使用_thread会出现直接卡死不动了

硬件板卡


庐山派

软件版本


CanMV_K230_LCKFB_micropython_v1.4-4-g5c1fd79_nncase_v2.9.0.img

2 Answers

多线程,有问题附上代码,确保代码足够精简,并能正确运行

下面是我的代码,运行后输出到frame_count = 200后直接卡死了,并且只有一个线程在跑
import _thread
import time
from media.mp4format import *
from mpp.mp4_format import *
from mpp.mp4_format_struct import *
from media.vencoder import *
from media.sensor import *
from media.media import *
import uctypes
import os

def mp4_muxer_init(file_name, fmp4_flag):
mp4_cfg = k_mp4_config_s()
mp4_cfg.config_type = K_MP4_CONFIG_MUXER
mp4_cfg.muxer_config.file_name[:] = bytes(file_name, 'utf-8')
mp4_cfg.muxer_config.fmp4_flag = fmp4_flag
handle = k_u64_ptr()
ret = kd_mp4_create(handle, mp4_cfg)
if ret:
raise OSError("kd_mp4_create failed.")
return handle.value

def mp4_muxer_create_video_track(mp4_handle, width, height, video_payload_type):
video_track_info = k_mp4_track_info_s()
video_track_info.track_type = K_MP4_STREAM_VIDEO
video_track_info.time_scale = 1000
video_track_info.video_info.width = width
video_track_info.video_info.height = height
video_track_info.video_info.codec_id = video_payload_type
video_track_handle = k_u64_ptr()
ret = kd_mp4_create_track(mp4_handle, video_track_handle, video_track_info)
if ret:
raise OSError("kd_mp4_create_track failed.")
return video_track_handle.value

def mp4_muxer_create_audio_track(mp4_handle, channel, sample_rate, bit_per_sample, audio_payload_type):
audio_track_info = k_mp4_track_info_s()
audio_track_info.track_type = K_MP4_STREAM_AUDIO
audio_track_info.time_scale = 1000
audio_track_info.audio_info.channels = channel
audio_track_info.audio_info.codec_id = audio_payload_type
audio_track_info.audio_info.sample_rate = sample_rate
audio_track_info.audio_info.bit_per_sample = bit_per_sample
audio_track_handle = k_u64_ptr()
ret = kd_mp4_create_track(mp4_handle, audio_track_handle, audio_track_info)
if ret:
raise OSError("kd_mp4_create_track failed.")
return audio_track_handle.value

def mp4_muxer_test(camera_id=0):
print("mp4_muxer_test start")
width = 1280
height = 720
# 实例化mp4 container
mp4_muxer = Mp4Container(sensor_csi_id=camera_id) # 指定探测CSI2的sensor
mp4_cfg = Mp4CfgStr(mp4_muxer.MP4_CONFIG_TYPE_MUXER)
if mp4_cfg.type == mp4_muxer.MP4_CONFIG_TYPE_MUXER:
file_name = f"/data/test{camera_id}.mp4"
mp4_cfg.SetMuxerCfg(file_name, mp4_muxer.MP4_CODEC_ID_H265, width, height, mp4_muxer.MP4_CODEC_ID_G711U)
# 创建mp4 muxer
mp4_muxer.Create(mp4_cfg)
# 启动mp4 muxer
mp4_muxer.Start()
frame_count = 0
try:
while True:
os.exitpoint()
# 处理音视频数据,按MP4格式写入文件
mp4_muxer.Process()
frame_count += 1
print("frame_count = ", frame_count)
if frame_count >= 200:
break
except BaseException as e:
import sys
sys.print_exception(e)
# 停止mp4 muxer
mp4_muxer.Stop()
# 销毁mp4 muxer
mp4_muxer.Destroy()
print("mp4_muxer_test stop")

def main_program():
print("主程序启动")
# 主程序逻辑
time.sleep(1)
print("主程序运行中...")
time.sleep(1)
print("主程序结束")

def thread_function(thread_name):
print(f"子线程 {thread_name} 启动")
# 子线程逻辑
time.sleep(1)
print(f"子线程 {thread_name} 运行中...")
time.sleep(1)
print(f"子线程 {thread_name} 结束")

if name == "main":
# 启动主程序
os.exitpoint(os.EXITPOINT_ENABLE)
main_program()
#mp4_muxer_test(2)
# 创建并启动两个子线程
_thread.start_new_thread(thread_function, ("线程1",))
_thread.start_new_thread(thread_function, ("线程2",))
# 确保主线程等待一段时间,避免资源冲突
time.sleep(2)
# 在子线程中调用MP4录制测试,分别传递camera_id=1和camera_id=2
_thread.start_new_thread(mp4_muxer_test, (1,))
_thread.start_new_thread(mp4_muxer_test, (2,))
# 主线程无限循环,确保子线程持续运行
while True:
time.sleep(1)
print("主线程运行中...")

建议优先采用更灵活的  kd_mp4_*  系列函数进行 H.264/H.265 视频的 MP4 封装,而非直接使用  Mp4Container (除非你有能力修改其源码)。

推荐实现步骤调整如下:

1. 并行采集:先完成多路摄像头的音视频采集。

2. 统一编码:待采集功能测试稳定后,再进行 H.264/H.265 编码。

3. 最后封装:编码完成后,统一使用  kd_mp4_*  函数进行 MP4 封装。

实施建议:
每个步骤独立开发并充分测试通过后,再进行下一步集成,这样可以降低复杂度,便于定位问题。

非常感谢你,我测试了几天了,也是使用的你的这个,但是基本上都是K230卡死了,非要断电,等几分钟再上电才可以,重新运行

还有一个问题就是单个摄像头没问题,两个摄像头一起就不行了,不知道是不是内存少了的原因