全部手册
SIMTUTAI / DOCUMENTATION

开发手册

开发手册、使用视频,应用案例。

单个视频控件的截图,只要调用其saveJpg方法即可。若视频上叠加了控件,要一起截图保存,思路如下

1.将要截图的控件全部放在一个父panel中,对panel调用snapToPng截图即可

2.由于视频只能由saveJpg方法截图:

2.1在视频上叠加一个临时的panel(tmp_panel)

2.2把视频的saveJpg得到的图片,设给tmp_panel的背景

2.3把其他控件设到顶层,要不然被tmp_panel给盖住了

2.4 父panel->snapToPng截图

2.5删掉tmp_panel

具体代码如下:

/**  * @brief 视频截图,含其内部的控件  * 注:这是对视频控件父控件进行截图,故要将视频控件放到panel中,否则将整个页面截图  * @param path 截图保存路径  * @param isBGR RGB还是BGR  * @param v1 视频控件  * @param vecWidget 视频控件内要包含在截图内的控件  */ static void mysnapToPng(const string& path, bool isBGR, SttFFmpeg v1,vector<STTWidget*>* vecWidget) { //1.先清掉缓存 STTImage::cacheInvalidateSrc(NULL); //2.视频上创建一个panel SttPanel p = new STTPanel(getRuntime(), v1->getParentWidget(), "ffpanel"); p->setMainArg(v1->mSettedX, v1->mSettedY, v1->mSettedwidth,v1->mSettedheight, 0); p->setMainStyle(0, 0xffffff, 0xffffff, GradDir::NONE, 255, 1, 0xc0c0c0); //3.隐藏panel p->setHidden(true); //4.视频截图 string tmpsnap = "./data/tmpsnap.jpg"; v1->saveJpg(tmpsnap); //等待截图完成 while(!FileUtil::fileExists(tmpsnap))Util::sleepfor(10); //5.设给panel背景 p->setBgImg(tmpsnap); //6.显示出来 p->setHidden(false); //7.视频中的控件置顶 if(vecWidget) { for(STTWidget* wid: *vecWidget) { wid->moveToIndex(v1->getParentWidget()->getChildCnt() - 1); } } //8.刷新 v1->getParentWidget()->invalidate(); //9.最后截图 v1->getParentWidget()->snapshotToPng(path, isBGR); //10.删除panel delete p; //11.删除临时图片 #if __arm__ Util::exe("rm "+tmpsnap, "r"); #endif }   void Frm12::wMButton3_clk_cb(uint16_t code, LvEvent e) { //截图调用 vector<STTWidget*> vecWidget; //放入视频内要一起截图的控件 vecWidget.push_back(wMCanvas1);//本例是用画布写的文字。你也可以用标签,如果有多个控件,逐一加入 mysnapToPng("./data/mysnap.png",true,wMVideo1,&vecWidget); }