【热闻】AMCAP程序详解:AMCeGraphBuilder
AMCAP程序详解
DirectShow提供了用应用程序从适当的硬件中捕捉和预览音/视频的能力。数据源包括:VCR,Camera,TVTuner,Microphone,或其他的数据源。一个应用程序可以立刻显示捕捉的数据(预览),或是保存到一个文件中。
(资料图)
在这个例子中,ICaptureGraphBuilder接口是处理捕捉工作的主要接口。你可以在你自己的捕捉程序中使用同样的方法和接口。在这里主要讨论ICaptureGraphBuilder如何执行音/视频的捕捉。我们假设你已经熟悉了DirectShow的filtergraph的体系和一般的capturefiltergraph的结构(可以参考DirectShow基础指南)。
ICaptureGraphBuilder接口提供了一个filtergraph builder对象,让你的应用程序在建立capture filtergraph时,省去处理很多单调乏味的工作,集中精力于捕捉中。它提供的方法满足了基本的捕捉和预览功能的要求。
FindInterface方法,在filtergraph中查找一个与捕捉有关的详细的接口。使得你可以访问一个详细接口的功能,而不需要你去列举filtergraph中的pins和filters。 RenderStream方法,连接源过滤器和渲染过滤器,选择添加一些中间的过滤器。ControlStream方法,独立地精确地控制graph的开始和结束帧。
既然是硬件捕捉,当然要和硬件打交道,接着介绍设备列举和捕捉接口。
通过ICreateDevEnum::CreateClassEnumerator方法列举捕捉系统中的设备。之后,实例化一个DirectShow的filter去使用这个设备。用ICaptureGraphBuilder::FindInterface去获得与捕捉相关的接口指针IAMDroppedFrames,IAMVideoCompression, IAMStreamConfig,以及 IAMVfwCaptureDialogs。因为设备列举和捕捉接口比较长,放在这会打乱结构,所有专门写了一篇(参考设备列举和捕捉接口)。
NOTE: 这个示例是DirectShow自带的例子。你可以在DirectShowSDK的目录Sample\DS\Caputre看这个例子代码(AMCap.cpp)。这里只是他的一些片断代码。可以说是他的中文模块的说明。AMCap例子中,把所有的接口指针和一些成员变量保存在一个全局结构gcap中了。
当不在需要保存在gcap中的接口指针是,一定要释放这些接口指针,一般是在程序的析构函数中,或是在别的同等功能函数中。如下:
if (gcap.pBuilder) gcap.pBuilder->Release(); gcap.pBuilder = NULL; if (gcap.pSink) gcap.pSink->Release(); gcap.pSink = NULL; if (gcap.pConfigAviMux) gcap.pConfigAviMux->Release(); gcap.pConfigAviMux = NULL; if (gcap.pRender) gcap.pRender->Release(); gcap.pRender = NULL; if (gcap.pVW) gcap.pVW->Release(); gcap.pVW = NULL; if (gcap.pME) gcap.pME->Release(); gcap.pME = NULL; if (gcap.pFg) gcap.pFg->Release(); gcap.pFg = NULL;
设置文件名
使用普通的OpenFileDialog获得捕捉文件的信息。通过调用AllocCaptureFile函数为捕捉文件分配空间。这一点是重要的,因为这是个巨大的空间。这样可以提高捕捉操作的速度。ICaptureGraphBuilder::AllocCapFile执行实际的文件分配,IFileSinkFilter::SetFileName指示file writerfilter使用用户选择的文件名保存数据。ICaptureGraphBuilder::SetOutputFileName把filewriter filter加入filter graph(后面会介绍,它是ICaptureGraphBuilderd自代的)。
SetCaptureFile 和 AllocCaptureFile 函数如下:
BOOL SetCaptureFile(HWND hWnd) {if(OpenFileDialog(hWnd, gcap.szCaptureFile, _MAX_PATH)) {OFSTRUCTos;//We have a capture file nameif(OpenFile(gcap.szCaptureFile, &os, OF_EXIST) ==HFILE_ERROR) {//Bring up dialog, and set new file size BOOLf = AllocCaptureFile(hWnd); if(!f) returnFALSE; } } else{returnFALSE; }SetAppCaption();// need a new app caption//Tell the file writer to use the new file name if(gcap.pSink) {WCHARwach[_MAX_PATH]; MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED, gcap.szCaptureFile, -1, wach, _MAX_PATH); gcap.pSink->SetFileName(wach,NULL); } return TRUE; }// Preallocate the capturefile // BOOL AllocCaptureFile(HWND hWnd) {// We"ll get into an infinite loop in the dlgproc setting a value if (gcap.szCaptureFile[0] == 0) returnFALSE;if (DoDialog(hWnd, IDD_AllocCapFileSpace, AllocCapFileProc, 0)){//Ensure repaint after dismissing dialog before //possibly lengthy operation UpdateWindow(ghwndApp);//User has hit OK. Alloc requested capture file space BOOLf = MakeBuilder(); if(!f) returnFALSE; WCHARwach[_MAX_PATH]; MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED, gcap.szCaptureFile, -1, wach, _MAX_PATH); if(gcap.pBuilder->AllocCapFile(wach,gcap.wCapFileSize* 1024L * 1024L) != NOERROR) {MessageBoxA(ghwndApp, "Error","Failed to pre-allocate capture filespace",MB_OK | MB_ICONEXCLAMATION); return FALSE; } returnTRUE; } else {returnFALSE; } }
建立GraphBuilder对象
AMCap的MakeBuilder函数建立了一个capturegraph builer对象,通过调用 CoCreateInstance获得了ICaptureGraphBuilder接口指针。AMCap把他存储到gcap结构的pBuilder中。
// Make a graph builderobject we can use for capture graph building // BOOL MakeBuilder() {//We have one already if(gcap.pBuilder) returnTRUE;HRESULThr = CoCreateInstance((REFCLSID)CLSID_CaptureGraphBuilder, NULL,CLSCTX_INPROC, (REFIID)IID_ICaptureGraphBuilder,(void**)&gcap.pBuilder); return(hr == NOERROR) ? TRUE : FALSE; }
建立Graph的渲染部分,并告诉它写文件(用先前决定的文件)
这包括一个multiplexerfilter 和 file writer。DirectShow 提供了一个AVIMUX(multiplexer)filter。在这里ICaptureGraphBuilder::SetOutputFileName是一个关键的方法。它把multiplexer 和 file writer添加到filtergraph中,连接他们,并设置文件的名字。第一个参数MEDIASUBTYPE_Avi,指出capture graph builder对象将插入一个AVI multiplexer filter,因此,filewriter将以AVI文件格式记录捕捉的数据。第二个参数(wach)是文件名。最后的两个参数指出multiplexer filter(gcap.pRender) 和file writer filter(gcap.pSink),这两个是通过SetOutputFileName函数初始化的。AMCap存储这些指针到全局结构gcap中。capture graph builder 对象建立了一个filtergraph对象(IGraphBuilder),把这两个filter加入到filter graph中去。他告诉filewriter使用指定的文件保存数据。下面的例子演示了如何调用SetOutputFileName。
// // We need a rendering section that will write the capture file outin AVI // file format //WCHAR wach[_MAX_PATH]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, gcap.szCaptureFile, -1,wach, _MAX_PATH); GUID guid = MEDIASUBTYPE_Avi; hr =gcap.pBuilder->SetOutputFileName(&guid,wach, &gcap.pRender,&gcap.pSink); if (hr != NOERROR) {ErrMsg("Error%x: Cannot set output file", hr); gotoSetupCaptureFail; }
获得当前的FilterGraph
因为在调用SetOutputFileName中,capturegraph builder 对象建立了一个filter graph,所以你必须把需要的filter加入同一个filter graph中。通过ICaptureGraphBuilder::GetFiltergraph获得新建立的filtergraph。返回的指针是参数gcap.pFg。
// // The graph builder created a filter graph to do that. Find outwhat it is, // and put the video capture filter in the graph too. //hr =gcap.pBuilder->GetFiltergraph(&gcap.pFg); if (hr != NOERROR) {ErrMsg("Error%x: Cannot get filtergraph", hr); gotoSetupCaptureFail; }
添加音/视频过滤器到当前的Filter Graph
hr =gcap.pFg->AddFilter(gcap.pVCap, NULL); if (hr != NOERROR) {ErrMsg("Error%x: Cannot add vidcap to filtergraph", hr); gotoSetupPreviewFail; }hr =gcap.pFg->AddFilter(gcap.pACap, NULL); if (hr != NOERROR) {ErrMsg("Error%x: Cannot add audcap to filtergraph", hr); gotoSetupCaptureFail; }
渲染视频捕捉过滤器的CapturePin和音频捕捉的Capture Pin
ICaptureGraphBuilder::RenderStream连接源过滤器的pin到渲染过滤器。pin的类别是可选的,capture pin (PIN_CATEGORY_CAPTURE) 或preview pin (PIN_CATEGORY_PREVIEW)。下面的例子演示了连接video capture filter(gcap.pVCap) 的capture pin到渲染gcap.pRender中。
// // Render the video capture and preview pins - we may not havepreview, so // don"t worry if it doesn"t work //hr =gcap.pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, gcap.pVCap, NULL, gcap.pRender); // Error checking// // Render the audio capture pin? //if (gcap.fCapAudio) {hr =gcap.pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,NULL, gcap.pACap, NULL, gcap.pRender); // Error checking
渲染Video CaptureFilter的 Preview Pin
再次调用ICaptureGraphBuilder::RenderStream,从capture filter的previewpin到video renderer。代码如下:
hr =gcap.pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, gcap.pVCap, NULL, NULL);
获得访问Video PreviewWindow的接口指针
缺省的,videopreview window是一个独立的窗口。如果你想改变默认的行为,先调用ICaptureGraphBuilder::FindInterface获得IVideoWindow接口。第二个参数通过gcap.pVCap指定,描述video capturefilter,第三个参数是想得到的接口(IVideoWindow),最后的是返回的接口。当你得到IVideoWindow接口后,你可以调用IVideoWindow的方法象put_Owner,put_WindowStyle, or SetWindowPosition 去获得video previewwindow的handle,设置窗口属性,或把他放到想要的位置。
// This will go through apossible decoder, find the video renderer it"s // connected to, and get the IVideoWindow interface onit hr =gcap.pBuilder->FindInterface(&PIN_CATEGORY_PREVIEW,gcap.pVCap, IID_IVideoWindow, (void**)&gcap.pVW); if (hr != NOERROR) {ErrMsg("Thisgraph cannot preview"); } else {RECTrc; gcap.pVW->put_Owner((long)ghwndApp);// We own the window now gcap.pVW->put_WindowStyle(WS_CHILD);// you are now a child //give the preview window all our space but where the status baris GetClientRect(ghwndApp,&rc); cyBorder= GetSystemMetrics(SM_CYBORDER); cy= statusGetHeight() + cyBorder; rc.bottom-= cy; gcap.pVW->SetWindowPosition(0,0, rc.right, rc.bottom); // be thisbig gcap.pVW->put_Visible(OATRUE); }
现在你已经建立完整的capture filtergraph了,你可以预览音频,视频,或捕捉数据。
控制 Capture FilterGraph
因为通过ICaptureGraphBuilder接口构造的capturefilter graph 只是一个简单的专门用途的filter graph,所以,控制它就象控制其他类型的filtergraph一样。你可以使用IMediaControl interface的 Run, Pause,和Stop方法,你也可以使用CBaseFilter::Pause的方法。另外ICaptureGraphBuilder 提供了ControlStream 方法去来控制 capture filter graph的流媒体的开始和结束时间。ControlStream调用IAMStreamControl::StartAt 和IAMStreamControl::StopAt控制filter graph的捕捉和预览的开始和结束的位置。
注意:不是所有的capture filter都可以,因为不是每一个capturefilter都支持IAMStreamControl。
ICaptureGraphBuilder::ControlStream方法的第一个参数(pCategory)是一个输出pin类的GUID。这个变量通常是PIN_CATEGORY_CAPTURE或 PIN_CATEGORY_PREVIEW。指定为NULL则控制所有的capture filter。第二个参数在(pFilter)指出那个filter控制。NULL说明为控制所有的filtergraph。如果只是预览(防止捕捉)的话,可以调用ICaptureGraphBuilder::ControlStream,参数用capturepin类型,MAX_TIME作为开始时间(第三个参数,pstart)。再次调用该方法,参数用previewpin类型,NULL作为开始时间则立即开始预览。第四参数指出结束的时间(pstop),含义和第三个参数一样(NULL意味着立刻)。MAX_TIME在DirectShow中定义为最大的参考时间。在这里意味着忽略或取消指定的操作。最后的参数,wStartCookie和wStopCookie分别是开始和结束的cookies(不知道该怎么翻译,因为我也不理解这个参数的含义)。下面的代码设置立刻开始预览,但是忽略捕捉。
// Let the preview sectionrun, but not the capture section // (There might not be a capture section) REFERENCE_TIME start = MAX_TIME, stop = MAX_TIME; // show us a preview first? but don"t capturequite yet... hr =gcap.pBuilder->ControlStream(&PIN_CATEGORY_PREVIEW,NULL, gcap.fWantPreview ? NULL : &start, gcap.fWantPreview ? &stop : NULL, 0, 0); if (SUCCEEDED(hr)) hr=gcap.pBuilder->ControlStream(&PIN_CATEGORY_CAPTURE,NULL, &start, NULL, 0, 0);
同样的,如果你只想要捕捉而不要预览,设置捕捉的开始时间为NULL,设置捕捉的结束时间为MAX_TIME。设置预览的开始时间为MAX_TIME,NULL为结束时间。下面的例子告诉filtergraph开始预览(第三个参数:开始时间为NULL)。结束时间指定为MAX_TIME意味着忽视停止时间(永远放下去)。 gcap.pBuilder->ControlStream(&PIN_CATEGORY_PREVIEW,NULL, NULL, MAX_TIME, 0, 0);
调用IMediaControl::Run 运行 graph
// Run the graph IMediaControl *pMC = NULL; HRESULT hr =gcap.pFg->QueryInterface(IID_IMediaControl, (void**)&pMC); if (SUCCEEDED(hr)) {hr= pMC->Run(); if(FAILED(hr)) {//Stop parts that ran pMC->Stop(); } pMC->Release(); } if (FAILED(hr)) {ErrMsg("Error%x: Cannot run preview graph", hr); returnFALSE;
如果graph已经运行,通过调用ICaptureGraphBuilder::ControlStream立刻开始捕捉。例如下面的代码,控制整个的filtergraph(第二个参数为NULL),立刻开始(第三个参数是NULL),并且永不停止(第四个参数是MAX_TIME)。
// NOW! gcap.pBuilder->ControlStream(&PIN_CATEGORY_CAPTURE,NULL, MAX_TIME, &stop, 0, 0);
停止预览或捕捉操作,调用IMediaControl::Stop,就同你调用IMediaControl::Run一样。
// Stop the graph IMediaControl *pMC = NULL; HRESULT hr =gcap.pFg->QueryInterface(IID_IMediaControl, (void**)&pMC); if (SUCCEEDED(hr)) {hr= pMC->Stop(); pMC->Release(); }
获得捕捉的信息
通过IAMDroppedFrames接口获得。测试丢失帧的数量(IAMDroppedFrames::GetNumDropped),捕捉的数量(IAMDroppedFrames::GetNumNotDropped)。IAMDroppedFrames::GetAverageFrameSize方法提供了捕捉帧的平均尺寸(单位:byte)。使用这些信息可以知道总的捕捉字节和每秒的帧数(速率)。
保存文件
最初分配的捕捉文件只是临时的保存数据,所有你可以尽可能快的捕捉。当你想把捕捉的数据保存到硬盘中时,调用ICaptureGraphBuilder::CopyCaptureFile。这个方法从先前得到的捕捉文件输出数据到你选择的另一个文件中。这个新的储存文件的大小是和实际捕捉的数据匹配的,而不是和先前的文件大小匹配。ICaptureGraphBuilder::CopyCaptureFile方法的第一个参数是复制源,第二个是目标文件。第三个参数设为TRUE指出用户允许用ESC键中断复制操作。最后参数是可选的。允许你提供一个进程指示器。如果想要的化,通过执行IAMCopyCaptureFileProgress 接口。下面示例了如何调用CopyCaptureFile。
hr =pBuilder->CopyCaptureFile(wachSrcFile,wachDstFile,TRUE,NULL);
通过普通的OpenFile Dialog得到新的文件名。用 MultiByteToWideChar函数把文件名转成宽字符(widestring),使用ICaptureGraphBuilder::CopyCaptureFile把捕捉的数据保存到指定的文件中。
BOOL SaveCaptureFile(HWND hWnd) {HRESULT hr; char achDstFile[_MAX_PATH]; WCHAR wachDstFile[_MAX_PATH]; WCHAR wachSrcFile[_MAX_PATH];if (gcap.pBuilder == NULL) returnFALSE;if (OpenFileDialog(hWnd, achDstFile, _MAX_PATH)){// We have a capture filename MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, gcap.szCaptureFile, -1,wachSrcFile, _MAX_PATH); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, achDstFile, -1,wachDstFile, _MAX_PATH); statusUpdateStatus(ghwndStatus, "Saving capture file - pleasewait...");// We need our own graphbuilder because the main one might not exist ICaptureGraphBuilder *pBuilder; hr = CoCreateInstance((REFCLSID)CLSID_CaptureGraphBuilder, NULL, CLSCTX_INPROC, (REFIID)IID_ICaptureGraphBuilder, (void **)&pBuilder); if (hr == NOERROR) {// Allow the user to press ESC to abort...don"t ask for progress hr = pBuilder->CopyCaptureFile(wachSrcFile,wachDstFile,TRUE,NULL); pBuilder->Release(); } if (hr == S_OK) statusUpdateStatus(ghwndStatus, "Capture file saved"); else if (hr == S_FALSE) statusUpdateStatus(ghwndStatus, "Capture file save aborted"); else statusUpdateStatus(ghwndStatus, "Capture file save ERROR"); return (hr == NOERROR ? TRUE : FALSE);} else {return TRUE; // They canceled orsomething } }
关于捕捉媒体文件和获得捕捉信息的详细内容,可以参考AMCap例子的Amcap.cpp 和Status.cpp 。
标签:
相关推荐:
精彩放送:
- []每日观察!UCB1策略和公式的理解 解决探索与利用平衡问题
- []天天日报丨组态软件是什么?组态软件在工业控制领域的应用
- []每日热闻!财面儿丨远洋集团1-2月累计协议销售额约83.6亿元 同比增长1.7%
- []全球最资讯丨消息指Uber正考虑分拆货运物流部门 或将进行IPO
- []讯息:标普:部分地区投资物业保持弹性 香港置地可平稳度过低迷期
- []德力股份:公司没有导电玻璃的生产产能
- []世界速看:上海宝山顾村华发四季河滨开启首次认购 总可售住宅9.8万平米
- []今日观点!万泰生物:公司自2019年起将戊肝疫苗的投标价格统一调整为裸价770元/支
- []全球动态:股民无眠!炒股群炸锅了:连夜学习“室温超导”!基础物理学新突破?
- []世界要闻:2022端午节股市休市几天,休市三天
- []每日热闻!中央银行三大法宝
- []焦点快报!威海到青岛自驾车多长时间_威海到青岛
- []环球热点评!余额宝风险是什么,有以下两点
- []【环球时快讯】2022年端午节股市放假吗,当然放
- []异地同行转账要不要手续费,不要
- []世界热文:怎么炒股详细步骤,有以下五步
- []降准对股市影响,有以下三点
- []当前看点!TD早报 | 国泰航空2022年净亏损扩大近两成;日本将放宽民宿业准入条件
- []【当前热闻】怎么炒港股
- []环球今日讯!金融危机对百姓的影响
- []全球快看:农行利率2020年利率
- []焦点关注:2021个人所得税起征点
- []焦点要闻:修正药业股票代码,还未上市没有股票代码
- []兴业银行信用卡进度查询方法
- []买入价和卖出价怎么判断
- []焦点日报:鼎湖门票_肇庆鼎湖山门票多少钱
- []【独家】达美乐中国重启上市?此前已通过港交所聆讯
- []当前信息:平板电脑像素排行榜_7寸平板电脑排行榜情况
- []中国1元等于多少日元 人民币的意义
- []5g的龙头股有哪些
- []今日热讯:大家千万不要领失业金,主要以下4个原因
- []天天亮点!工商银行抵押贷款条件及流程
- []环球通讯!北交所打新规则,有以下四点
- []每日看点!力高地产1-2月合约销售约28.39亿元 同比下滑37.19%
- []【全球热闻】“00后”小伙连续盗窃五起,涉案金额23000元
- []东数西算概念股龙头一览表依米康,东数西算概念股一览
- []【环球报资讯】元旦节股票休市和开市是什么时间,一般休市三天
- []急涨慢跌,意思是迅速上涨缓慢下跌
- []借贷记账法的理论依据
- []闪酷卡是什么
- []践行ESG理念,聚焦多元化优势,华林证券多举措助力“她力量”绽放
- []大宏立:3月7日公司高管杨中民减持公司股份合计1.99万股
- []环球快看点丨栖霞物业拟向参股公司提供150万元借款?期限为24日
- []今日聚焦!中公教育:3月7日公司高管王振东减持公司股份合计1454万股
- []森麒麟:3月7日公司高管秦龙、林文龙、秦靖博、金胜勇增持公司股份合计129.46万股
- []视焦点讯!2022年银行基准利率是多少,各类型基准利率一览
- []每日消息!未来可能涨100倍的股票是哪个,十大牛股盘点名单
- []余额宝10万一天收益多少钱,5人民币左右
- []获利能力指标
- []建行管理费10元能不能取消,可以取消
- []简讯:景津装备:3月7日公司高管杨名杰减持公司股份合计10000股
- []【全球聚看点】新湖中宝注销此前回购的9040万股 注册资本减少至85.09亿
- []诺力股份:2月16日至2月27日公司高管张科减持公司股份合计113.99万股
- []全球关注:远洋集团前2月协议销售额约84亿元 多个精品项目将全新加推
- []全球快播:十五连板后终被停牌核查 *ST瑞德索赔案诉讼时效仅剩四个月
- []十一高速免费吗2022年,免费
- []世界新资讯:威海旅游攻略自助游_威海旅游全攻略
- []动态:分期的车可以抵押贷款吗?
- []全球热点评!bcx是什么币
- []证券公司手续费
- []报道:建行转账手续费 建行转账手续费怎么算
- []全球观热点:报告:近半数女性2年内有购房计划,八成倾向于买新房
- []厦门推出拆迁款房票补偿政策
- []北京商务局:鼓励商业品牌首店首发项目?最高给予500万元支持
- []天天热点!万城控股预计2022年度税后溢利减少约35%至50%
- []珠海2023年投资项目共198个 年内计划安排投资202.24亿元
- []今日热文:美格智能:目前6G技术尚处于早期研究阶段,距离搭载6G技术的产品落地仍需时日
- []全球热点评!男女有别吗?30+有年龄焦虑吗?她们说……
- []【天天聚看点】什么是折价率
- []天天资讯:注册制次新股概念股票龙头一览表,2023注册制次新股相关上市公司有哪些
- []今日热文:贵宾卡是什么卡,代表贵宾身份
- []每日信息:信用卡的好处
- []【全球播资讯】58同城、安居客《2023年女性置业调查报告》:近半数女性2年内有购房计划
- []财信地产职工代表监事李屹然辞职 殷杰继任
- []每日简讯:澳博控股2022年股东应占亏损77.98亿港元 同比扩大88.2%
- []软控股份:涂布机项目主要针对锂电行业,尚处在研发实验阶段,暂未批量生产
- []【全球热闻】汇景控股填补公司董事会成员空缺时限申请延长至4月30日
- []天天快消息!芒果超媒2022业绩快报:归母净利超18亿元 期待2023年继续“破浪”
- []迅捷兴:公司产品可广泛应用于汽车电子、通讯、安防、人工智能等诸多领域
- []全球视讯!自如或在港IPO最早4月递表 公司方回应“不予置评”
- []世界看热讯:中百集团:公司中百大厨房现有少量预制菜肴,目前销售占比较低,不对公司经营业绩产生重大影响
- []当前热文:总投资50亿元!亿利洁能成功签约10GW沙戈荒地区高效专用光伏组件项目
- []焦点快看:六折是百分之多少
- []今日热闻!什么是物理储能?物理储能方式包括哪些
- []天天微动态丨期货交易软件,有以下十个
- []即时看!余额宝有什么用 余额宝的作用是什么
- []天天快消息!银行同期贷款利率 银行的贷款同期利率
- []重磅!全球光伏龙头A股IPO上市获受理!
- []小鹏汽车新专利可实现光伏充电
- []天天快资讯丨交易密码指的是什么密码 支付密码
- []焦点日报:越秀服务2022年总收入24.86亿元 归母净利润同增15.7%
- []中关村收关注函:要求说明控股股东所持股份冻结对公司控制权影响
- []滚动:长阳科技:公司目前产品尚未涉及固态电池,公司将高度关注相关技术的发展趋势
- []热文:上海能源:公司为实现可持续发展,将经营积累主要用于煤炭资源获取、基本建设投资等
- []【新视野】2023年女性置业调查报告:67.7%女性因职业发展选择安居城市
- []上海九百:本公司持有的上市公司股份,请详见公司披露的定期报告及相关公告
- []中国黄金交易时间是几点
- []产品是企业发展的生命力 波司登创新世界羽绒服市场的发展逻辑
- []【全球报资讯】开板是什么意思股票
- []什么叫劣后资金,指收益不好但风险较大的资金
- B站注册资本增幅400%至5亿 目前由陈睿全资持股
- 光源资本出任独家财务顾问 沐曦集成电路10亿元A轮融资宣告完成
- 巨轮智能2021年上半年营收11.24亿元 期内研发费用投入增长19.05%
- 红枣期货尾盘拉升大涨近6% 目前红枣市场总库存约30万吨
- 嘉银金科发布2021年Q2财报 期内净利润达1.27亿元同比增长208%
- 成都银行2021上半年净利33.89亿元 期内实现营收同比增长17.27亿元
- 汽车之家发布2021年第二季度业绩 期内新能源汽车品牌收入增长238%
- 中信银行上半年实现净利润290.31亿元 期末不良贷款余额706.82亿元
- 光伏概念掀起涨停潮交易价格创新高 全天成交额达1.29亿元
- 上半年生物药大增45% 关键财务指标好转营收账款持续下降
- 全球速读:金铲铲之战:骑马武器阵容如何搭配?
- 每日短讯:养鸽子新手养鸽子怎么养_鸽子怎么养
- 全球热议:各银行储蓄利息表,各银行存款利率一览
- buk是什么数字货币
- 【世界报资讯】厦门象屿金控5亿元公司债利率询价区间为3.50%-4.50%
- 焦点速看:金管局: 10年期15亿港元政府债券投标申请总额达43.11亿港元
- 世界看热讯:地产债涨跌不一 “H0阳城02”涨100%、“22旭辉01”跌超10%
- 天天快资讯丨3月8日南凌科技涨停分析:东数西算,云计算数据中心,信创概念热股
- 世界今头条!香港何文田St. George's Mansions四房大宅1.19亿港元沽出
- 每日速讯:"21信地03"拟于3月13日起进行回售并将会进行转售
- 天天微头条丨3月8日三晖电气涨停分析:仪器仪表概念热股
- 3月8日金信诺涨停分析:6G,卫星互联网,毫米波通信概念热股
- 热议:3月8日新城市涨停分析:智慧停车,新型城镇化,深圳本地股概念热股
- 【环球新要闻】it包括哪些服装品牌?i.t经营的服装品牌介绍?
- 热点评!红糖和红砂糖有什么不同?红糖和红砂糖的区别是什么?
- 每日看点!玻璃护栏玻璃镶嵌怎么操作?玻璃护栏玻璃镶嵌方法是什么?
- 今头条!小鳄龟和巴西龟能一起养吗?为什么?
- 股票红色和绿色代表什么
- 现在银行定期存款利率是多少2022,各行存款利率一览表
- 焦点滚动:我国三大棉花产地在哪里?我国三大棉花产地资料介绍?
- 每日精选:千媚是哪部电视剧中的人物?讲述了什么故事?
- 大学为什么说成是象牙塔?象牙塔指的是什么?
- 快看:隋唐十八好汉都有谁?隋唐十八好汉排行榜一览?
- 环球微资讯!欧洲旅游趋势报告:美国客源持续引领复苏,中国旅客需求增长可期
- 【天天速看料】gdp排名世界2021,中国排名第二
- 【环球热闻】浏览器ie是什么意思?IE全称是指什么?
- 信息:7号房的礼物剧情介绍?7号房的礼物结局是什么?
- 亚太市场国际差旅需求复苏超过欧美,预订量恢复到疫情之前65%的水平
- 中签是什么意思啊
- 每日消息!买空卖空是什么意思
- 中交房地产集团12.1亿公司债将付年息 利率3.49%
- 南京滨江投资公司5亿元私募债更新至“已反馈”
- 【快播报】鹭燕医药:除个别新设门店因运营时间短未达到申请要求之外,公司绝大多数门店都具有医保定点资质
- 天天即时:日本拟放宽民宿业准入条件 响应赴日游客恢复
- 当前快讯:上海浦东新区惠南镇商业房产二拍成交 由北京咏旺物业1.62亿元竞得
- 天天微资讯!空调开年格局生变:从“双寡头”走向“三分天下”
- 常州金坛区润澳花园大酒店流拍 起拍价约3.04亿元
- CCTV健康大讲堂专家:从连花清瘟解读中药治疗甲流的优势
- 全球动态:信用卡申请进度怎么查询,有以下三种方法
- 天天看点:银行贷款利率2022最新表,各行贷款利率一览
- 环球动态:庆余年全套书有几册_庆余年大东山之战原书第几章
- 数字货币真正龙头股 数字货币龙头股具体有哪些
- k宝密码忘了怎么办,有以下两种方法
- 建设银行手机银行怎么开通,有以下四种方法开通
- 华润置地子公司润朝地产挂牌增资 对应持股比例20%
- 女神节来临,小吉内裤洗烘一体机,带给您最温柔的呵护
- 【全球速看料】致同: 亚太区女性高管比例超过30%关键水平
- 明阳智能:您问题中所描述的相关数据非公司对外披露之内容,其数据之准确性请您咨询相关媒体
- 瑞信证券获准扩大业务范围 增加证券经纪、证券投资咨询、证券自营业务三项业务
- 每日播报!企业家看两会 :代表委员聚焦“白酒出海” “绿色转型” 献策酒业
- 全球要闻:中交地产旗下厦门宏佑地产拟增资3.8亿元 对应持股比例49%
- 今日热文:又有大卖80亿!这类产品彻底火了
- 【全球聚看点】南京公积金贷款额度2022,有以下两种情况
- 环球最资讯丨中国银行借记卡是什么意思
- 各大银行存款利率排名,各行存款利率一览
- 鱼儿嘴巴一张一合是在干嘛
- 股票举牌是什么意思
- 环球新动态:广州越秀区产融对接项目签约超1000亿元 覆盖科技、商贸等行业
- 热点聚焦:“20美置02”回售金额9.84亿元 将于3月27日兑付
- 快看点丨2023年2月中国物业服务企业新增合约面积TOP50
- 全球热讯:“股神”巴菲特时隔半年再出手:大举加仓西方石油!
- 传庄士机构香港山顶屋地获8.8亿港元洽购至尾声
- 焦点资讯:余额宝利息多少 余额宝一天的利息有多少
- 信用卡该怎么办,有以下三种办理途径
- 北京银行营业时间
- 喜报!镁铝装甲门品牌艾德曼被品味标准起草单位
- 建行的贷款利率是多少2022,有以下四种利率
- 焦点热文:银行买房贷款利率2022年一览表,各行房贷利率一览
- 环球快消息!香港影视概念股齐升 邵氏兄弟控股一度涨近160%
- 小米随身wifi怎样安装_小米随身wifi怎么安装手机app
- 港股贝壳-W跌逾5% 股价暂现三连阴
- 绿通科技:公司会综合考虑发展战略和实际经营需要,制定合理的利润分配方案,具体情况请关注后续公告
- 全球新资讯:暴涨近200%!TVB也来带货,老牌艺人现身、直播间送签名照!又一东方甄选?
- 世界视讯!中国铁建房地产集团27亿公司债将付年息 利率3.25%
- 焦点日报:港旅游界立会议员预期香港未来经高铁入境旅客量会提升
- 天天观察:香港置业:港2月二手居屋723宗注册 按月增逾1成
- 环球微速讯:活期存款利率 各银行活期存款的利率
- 银行下午几点上班 银行下午什么时候上班
- 各银行三年定期存款利率2022最新,十大银行利率一览
- 快看点丨马蜂窝大数据:全国多地花季提前,“赏花”热度大涨133%
- 携程“她旅行”消费洞察:今年出境游女性订单超过男性,出境占比达53%
- 全球时讯:2022年中国城市GDP100强排名,全国gdp百强排名一览表
- 滚动:抖音直播怎么赚钱 抖音直播如何变现
- 环球微动态丨熵基科技:目前电子身份证正处于推行试点阶段,国家尚未发布身份证电子化相关技术和应用标准
- 广州公布2023年供地计划 住宅用地拟供应901公顷
- 快报:科安达:科安达计轴产品在全国200多条城市轨道交通线路中应用,市场占有率60%以上
- 即时看!武汉推出"相约春天赏樱"活动 将送出30万张旅游惠民券
- 全球快资讯:已有城市踩点“交作业”!两会后楼市会等来“宽松大年”吗?
- 黑石-汤森路透财团将出售2300万股伦交所股票 套现17亿英镑
- 环球速讯:福州将迎来第二家山姆会员店 将于5月18日开业
- 环球今日报丨【BT金融分析师】Adobe股票出现暴跌,分析师称其AI扩张因监管受阻
- 鸿铭股份:具体业绩情况请详见我们即将披露的2022年年度报告和2023年第一季度报告,谢谢您的关注
- 高通是哪个国家的,美国
- 要闻:老板员工都在“报复性出差”,商旅酒店集体涨价、部分城市客房爆满
- 世界快资讯丨科创板的上市时间是多久
- 2008年股市大跌,原因有以下三点
- 快播:现在银行存款利率是多少2022年,各银行存款利率一览
- 股票β系数计算公式
- 品牌的力量 “2023中国储能行业十佳品牌”公益评选活动 正式开启
- 怎么才能提高自己的社交能力?提高自己的社交能力的方法?