多线程视频抽帧
程序员文章站
2022-03-25 23:31:50
...
多线程视频抽帧
使用folly 等第三方库,实现多线程视频抽帧服务:
- 从已有的rtsp文件将其分为对应的N份,
- 开启N+1个线程, 其中N个线程分别读这N个rtsp.json文件,在回调函数中将视频帧存入队列
- 第N+1个线程从队列中将视频帧解析并保存到本地
void hand_frame_func(int processNum, int frame_number)
{
int frame_count = 0;
Utils utils;
while (true)
{
if (!frame_q.empty())
{
//do something ...
//视频帧格式转换...
utils.saveImage("/home/z/workspace/Mutil_Process_Rtsp/data", string((char*)frame_info.m_userdata), bgr_frame, frame_count);
}
}
}
int main()
{
Utils util;
util.devideJson("/home/z/workspace/Mutil_Process_Rtsp/rtsp.json", 2);
InitParam init_param;
init_param.callback = reinterpret_cast<VideoCallback >(&(VideoCallBackFun));
///Init ECV
reImp_ECV_Init(&init_param);
int processNum = 2; //开启两个线程
int frame_number = 10;
for (size_t idx = 0; idx < processNum; idx++)
{
std::thread th([idx]() {
readJson("/home/z/workspace/Mutil_Process_Rtsp/rtsp/rtsp" + to_string(idx) + ".json", idx);
});
th.detach();
}
std::thread th([processNum,frame_number](){
hand_frame_func(processNum, frame_number);
});
th.detach();
getchar();
shared_ptr<char> uninit_sp(new char, [&](char* ch){
hand_frame temp;
while ( !frame_q.try_pop(temp));
if(reImp_ECV_Uninit() != ECV_SUCCEED){
cout<< "'Uninit', FAILED!";
}
});
cout<< "after 'ECV_Uninit'";
dlclose(ecv_handle);
return 0;
}
— 记录一次完整的项目过程
上一篇: Python词法结构