欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程视频抽帧

程序员文章站 2022-03-25 23:31:50
...

多线程视频抽帧

使用folly 等第三方库,实现多线程视频抽帧服务:

  1. 从已有的rtsp文件将其分为对应的N份,
  2. 开启N+1个线程, 其中N个线程分别读这N个rtsp.json文件,在回调函数中将视频帧存入队列
  3. 第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;
}

— 记录一次完整的项目过程

相关标签: folly c++