的rtmp流播放即可;
5. 教師和學(xué)生互動(dòng):學(xué)生端如需作為示范案例,屏幕數(shù)據(jù)共享給其他同學(xué),只需請(qǐng)求同屏,數(shù)據(jù)反推到rtmp服務(wù)器,其他學(xué)生查看即可。
6. 擴(kuò)展監(jiān)控:如果需要更進(jìn)一步的技術(shù)方案,如教師端想監(jiān)控學(xué)生端的屏幕情況,可以有兩種方案,如學(xué)生端直接推rtmp過(guò)來(lái),或者,學(xué)生端啟動(dòng)內(nèi)置rtsp服務(wù),教師端想看的時(shí)候,隨時(shí)看即可(亦可輪詢(xún)播放)。
android端對(duì)接
推送分辨率如何設(shè)定或縮放?
android設(shè)備,特別是高分屏,拿到的視頻原始寬高非
r語(yǔ)言-中國(guó)各城市pm2.5數(shù)據(jù)間的相關(guān)分析:近日,京津冀遭遇“霧霾鎖成”,廊坊、保定、石家莊、邢臺(tái)、邯鄲成為污染最嚴(yán)重地區(qū)。 ?
很多網(wǎng)站提供了pm2.5(細(xì)顆粒物)及空氣質(zhì)量指數(shù)(aqi)的實(shí)時(shí)查詢(xún),比如:pm25.in、北京市環(huán)境檢測(cè)中心等等。
這些網(wǎng)站只是對(duì)數(shù)據(jù)進(jìn)行了展示,有的還做了很漂亮的可視化,但卻沒(méi)有做進(jìn)一步的數(shù)據(jù)分析。舍恩伯格在《大數(shù)據(jù)時(shí)代》一書(shū)中這樣寫(xiě)道:“我們沒(méi)有必要非得知道現(xiàn)象背后的原因,而是要讓數(shù)據(jù)自己發(fā)聲。”
以及“相關(guān)關(guān)系能夠幫助我們更好地了解這個(gè)世界。”他認(rèn)為,建立在相關(guān)關(guān)系分析法上面的預(yù)測(cè)是大數(shù)據(jù)的核心。通過(guò)找到“關(guān)聯(lián)物”并監(jiān)控它,我們就能夠預(yù)測(cè)未來(lái)。
,which(colnames(pm)天津市),which(colnames(pm)石家莊市)) knitr::kable(summary(pm)) 北京市天津市石家莊市min. : 30.00min
cloudbase cms + next.js:輕松構(gòu)建一個(gè)內(nèi)容豐富的站點(diǎn):項(xiàng)目背景試想一下,如果你現(xiàn)在要為你自己或者你所在的組織創(chuàng)建一個(gè)強(qiáng)內(nèi)容的站點(diǎn),同時(shí)要求好的 seo(搜素引擎優(yōu)化),比如博客,你會(huì)怎么做呢?
靜態(tài)生成的意思是,在構(gòu)建的過(guò)程中,next.js 就會(huì)自動(dòng)執(zhí)行數(shù)據(jù)拉取的邏輯,并把數(shù)據(jù)和 ui 渲染為一個(gè)個(gè)的靜態(tài) html 頁(yè)面,這意味著,我們的站點(diǎn)將響應(yīng)迅速,而且利于 seo。?
環(huán)境創(chuàng)建完畢后,進(jìn)入擴(kuò)展應(yīng)用模塊,可以看到“cms內(nèi)容管理系統(tǒng)”,可以在這里安裝它。設(shè)置都按照默認(rèn)就可以了,唯一要注意的是,務(wù)必記住自己設(shè)置的管理員賬號(hào)和密碼。
,index.js 導(dǎo)出的函數(shù)式組件就直接對(duì)應(yīng)著我們進(jìn)入網(wǎng)站后的第一個(gè)頁(yè)面,而其他 js 文件于 .pages 的相對(duì)地址就是 next.js 為其自動(dòng)生成的路由。
可用于云端一體化開(kāi)發(fā)多種端應(yīng)用(小程序,公眾號(hào),web 應(yīng)用,flutter 客戶端等),幫助開(kāi)發(fā)者統(tǒng)一構(gòu)建和管理后端服務(wù)和云資源,避免了應(yīng)用開(kāi)發(fā)過(guò)程中繁瑣的服務(wù)器搭建及運(yùn)維,開(kāi)發(fā)者可以專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn)
重磅 | 萬(wàn)維網(wǎng)之父 tim berners-lee 榮獲2016年度圖靈獎(jiǎng):北京時(shí)間4月4日,美國(guó)計(jì)算機(jī)協(xié)會(huì)(association for computing machinery, 簡(jiǎn)稱(chēng)acm)宣布了 2016 年度圖靈獎(jiǎng)得主:萬(wàn)維網(wǎng)之父、mit 教授tim berners-lee
圖靈獎(jiǎng)由美國(guó)計(jì)算機(jī)協(xié)會(huì)于1966年設(shè)立,專(zhuān)門(mén)獎(jiǎng)勵(lì)那些對(duì)計(jì)算機(jī)事業(yè)作出重要貢獻(xiàn)的個(gè)人。其名稱(chēng)取自計(jì)算機(jī)科學(xué)的先驅(qū)、英國(guó)科學(xué)家艾倫·麥席森·圖靈(alan m. turing)。
圖靈獎(jiǎng)初期獎(jiǎng)金為20萬(wàn)美元,1989年起增到25萬(wàn)美元,獎(jiǎng)金通常由計(jì)算機(jī)界的一些大企業(yè)提供(通過(guò)與acm簽訂協(xié)議)。目前圖靈獎(jiǎng)由google贊助,獎(jiǎng)金為100萬(wàn)美元。
他的成果包括創(chuàng)建網(wǎng)頁(yè)命名方法(uri)、通信協(xié)議(http)和網(wǎng)頁(yè)語(yǔ)言(html)。此外,他用開(kāi)源代碼編寫(xiě)了第一個(gè)瀏覽器。這使得早期的網(wǎng)頁(yè)瀏覽器能推廣到學(xué)術(shù)界以外。“第一個(gè)萬(wàn)維網(wǎng)網(wǎng)站在1991年上線。
“我感到榮幸能收到這個(gè)以計(jì)算機(jī)先鋒命名的獎(jiǎng)項(xiàng)。對(duì)于程序員來(lái)說(shuō),能用計(jì)算機(jī)來(lái)做什么,只能受到自己的限制?!眛im教授表示。
dede模板首頁(yè),如何設(shè)計(jì)與seo?:從目前來(lái)看,有大量的中小型企業(yè)選擇利用dede模板,建立企業(yè)網(wǎng)站,而在這個(gè)過(guò)程中,一個(gè)非常重要的問(wèn)題就是企業(yè)網(wǎng)站首頁(yè)的設(shè)計(jì)與優(yōu)化。
特別是對(duì)于一些中小型企業(yè),幾乎網(wǎng)站內(nèi)頁(yè)根本不參與排名,所有的核心重點(diǎn)都在首頁(yè)。 44.png 那么,dede模板,企業(yè)首頁(yè)如何設(shè)計(jì)與優(yōu)化?
④適當(dāng)?shù)脑黾与S機(jī)新聞與熱門(mén)新聞版塊,提高網(wǎng)站內(nèi)容更新的頻率。
4、首頁(yè)彈窗 在dede模板中,早期網(wǎng)站運(yùn)營(yíng)人員,最常用的一個(gè)方式就是加入廣告彈窗代碼,主要的用途包括: ①添加網(wǎng)站即時(shí)溝通組件 ②添加seo聯(lián)盟的流量代碼,用于商業(yè)變現(xiàn)。
總結(jié):dede模板首頁(yè)相關(guān)的設(shè)計(jì)與seo,仍然有諸多細(xì)節(jié),而上述內(nèi)容,僅供參考,更多優(yōu)質(zhì)內(nèi)容,盡在seo優(yōu)化課程。
「谷歌」hreflang標(biāo)簽知識(shí)與多國(guó)語(yǔ)言網(wǎng)站seo優(yōu)化:今天跟各位同學(xué)講解下有關(guān)hreflang標(biāo)簽的知識(shí),如果,你有過(guò)優(yōu)化多語(yǔ)言網(wǎng)站seo的經(jīng)歷,相信對(duì)這個(gè)標(biāo)簽并不陌生。希望,今天分享的內(nèi)容能夠?qū)Ω魑煌瑢W(xué)有所幫助?!?— 及時(shí)當(dāng)勉勵(lì),歲月不待人。
當(dāng)一個(gè)網(wǎng)站采用國(guó)際網(wǎng)站時(shí),最重要的技術(shù)seo元素之一就是hreflang標(biāo)簽。為什么hreflang標(biāo)簽如此重要?hreflang標(biāo)簽可幫助搜索引擎了解您的內(nèi)容的哪個(gè)版本向哪些受眾展示。
例如:瑞典語(yǔ) - 不是se-se,而是sv-se。
對(duì)于電子商務(wù)網(wǎng)站或國(guó)際化平臺(tái),建議將hreflang標(biāo)簽添加到網(wǎng)站的站點(diǎn)地圖中,這樣可以更加實(shí)時(shí)更加方便的讓搜索引擎知道該頁(yè)面的相關(guān)信息。
今天的分頁(yè)seo優(yōu)化技巧知識(shí)就講到這里了。如果,哪位同學(xué)有疑問(wèn)的話,可以添加我個(gè)人微信號(hào):seoiit,一起來(lái)討論下。
電子政務(wù)系統(tǒng)的類(lèi)型:旅游科普教育之a(chǎn)ndroid平臺(tái)實(shí)現(xiàn)內(nèi)網(wǎng)無(wú)紙化會(huì)議|智慧教室|實(shí)時(shí)同屏功能背景
本文主要講的是基于android平臺(tái)實(shí)現(xiàn)rtmp的技術(shù)方案設(shè)計(jì),基礎(chǔ)架構(gòu)圖如下:
組網(wǎng)注意事項(xiàng)
1. 組網(wǎng):無(wú)線組網(wǎng),需要好的ap模塊才能撐得住大的并發(fā)流量,推送端到ap,最好是有線網(wǎng)鏈接;
2. 服務(wù)器部署:srs或nginx,服務(wù)器可以和windows平臺(tái)的教師機(jī)部署在一臺(tái)機(jī)器;
3. 教師端:如教師有移動(dòng)的pad,可以直接推到rtmp服務(wù)器,然后共享出去;
4. 學(xué)生端:直接拉取服務(wù)端的rtmp流播放即可;
5. 教師和學(xué)生互動(dòng):學(xué)生端如需作為示范案例,屏幕數(shù)據(jù)共享給其他同學(xué),只需請(qǐng)求同屏,數(shù)據(jù)反推到rtmp服務(wù)器,其他學(xué)生查看即可。
6. 擴(kuò)展監(jiān)控:如果需要更進(jìn)一步的技術(shù)方案,如教師端想監(jiān)控學(xué)生端的屏幕情況,可以有兩種方案,如學(xué)生端直接推rtmp過(guò)來(lái),或者,學(xué)生端啟動(dòng)內(nèi)置rtsp服務(wù),教師端想看的時(shí)候,隨時(shí)看即可(亦可輪詢(xún)播放)。
android端對(duì)接
推送分辨率如何設(shè)定或縮放?
android設(shè)備,特別是高分屏,拿到的視頻原始寬高非常大,如果推原始分辨率,編碼和上行壓力大,所以,一般建議,適當(dāng)縮放,比如寬高縮放至2/3,縮放一般建議等比例縮放,縮放寬高建議16字節(jié)對(duì)齊。
代碼語(yǔ)言:javascript
復(fù)制
private void createscreenenvironment() {
sreenwindowwidth = mwindowmanager.getdefaultdisplay().getwidth();
screenwindowheight = mwindowmanager.getdefaultdisplay().getheight();
log.i(tag, "screenwindowwidth: " + sreenwindowwidth + ",screenwindowheight: "
+ screenwindowheight);
if (sreenwindowwidth > 800)
{
if (screenresolution == screen_resolution_standard)
{
scale_rate = scale_rate_half;
sreenwindowwidth = align(sreenwindowwidth / 2, 16);
screenwindowheight = align(screenwindowheight / 2, 16);
}
else if(screenresolution == screen_resolution_low)
{
scale_rate = scale_rate_two_fifths;
sreenwindowwidth = align(sreenwindowwidth * 2 / 5, 16);
}
}
log.i(tag, "after adjust mwindowwidth: " + sreenwindowwidth + ", mwindowheight: " + screenwindowheight);
int pf = mwindowmanager.getdefaultdisplay().getpixelformat();
log.i(tag, "display format:" + pf);
displaymetrics displaymetrics = new displaymetrics();
mwindowmanager.getdefaultdisplay().getmetrics(displaymetrics);
mscreendensity = displaymetrics.densitydpi;
mimagereader = imagereader.newinstance(sreenwindowwidth,
screenwindowheight, 0x1, 6);
mmediaprojectionmanager = (mediaprojectionmanager) getsystemservice(context.media_projection_service);
}
橫豎屏自動(dòng)適配
橫豎屏狀態(tài)下,采集的屏幕寬高不一樣,如果橫豎屏切換,這個(gè)時(shí)候,需要考慮到橫豎屏適配問(wèn)題,確保比如豎屏狀態(tài)下,切換到橫屏?xí)r,推拉流兩端可以自動(dòng)適配,橫豎屏自動(dòng)適配,編碼器需要重啟,拉流端,需要能自動(dòng)適配寬高變化,自動(dòng)播放。
代碼語(yǔ)言:javascript
復(fù)制
public void onconfigurationchanged(configuration newconfig) {
try {
super.onconfigurationchanged(newconfig);
if (this.getresources().getconfiguration().orientation == configuration.orientation_landscape) {
log.i(tag, "onconfigurationchanged cur: landscape");
} else if (this.getresources().getconfiguration().orientation == configuration.orientation_portrait) {
log.i(tag, "onconfigurationchanged cur: portrait");
}
if(ispushingrtmp || isrecording || isrtsppublisherrunning)
{
stopscreencapture();
clearallimages();
createscreenenvironment();
setupvirtualdisplay();
}
} catch (exception ex) {
}
}
補(bǔ)幀策略
好多人不理解為什么要補(bǔ)幀,實(shí)際上,屏幕采集的時(shí)候,屏幕不動(dòng)的話,不會(huì)一直有數(shù)據(jù)下去,這個(gè)時(shí)候,比較好的做法是,保存最后一幀數(shù)據(jù),設(shè)定一定的補(bǔ)幀間隔,確保不會(huì)因?yàn)閹g距太大,導(dǎo)致播放端幾秒都收不到數(shù)據(jù),當(dāng)然,如果服務(wù)器可以緩存gop,這個(gè)問(wèn)題迎刃而解。
異常網(wǎng)絡(luò)處理、事件回調(diào)機(jī)制
回答:如果是走rtmp,網(wǎng)絡(luò)抖動(dòng)或者其他網(wǎng)絡(luò)異常,需要有好重連機(jī)制和狀態(tài)回饋機(jī)制。
代碼語(yǔ)言:javascript
復(fù)制
class eventhandev2 implements ntsmarteventcallbackv2 {
@override
public void onntsmarteventcallbackv2(long handle, int id, long param1, long param2, string param3, string param4, object param5) {
log.i(tag, "eventhandev2: handle=" + handle + " id:" + id);
string publisher_event = "";
switch (id) {
case ntsmarteventid.event_daniulive_erc_publisher_started:
publisher_event = "開(kāi)始..";
break;
case ntsmarteventid.event_daniulive_erc_publisher_connecting:
publisher_event = "連接中..";
break;
case ntsmarteventid.event_daniulive_erc_publisher_connection_failed:
publisher_event = "連接失敗..";
break;
case ntsmarteventid.event_daniulive_erc_publisher_connected:
publisher_event = "連接成功..";
break;
case ntsmarteventid.event_daniulive_erc_publisher_disconnected:
publisher_event = "連接斷開(kāi)..";
break;
case ntsmarteventid.event_daniulive_erc_publisher_stop:
publisher_event = "關(guān)閉..";
break;
case ntsmarteventid.event_daniulive_erc_publisher_recorder_start_new_file:
publisher_event = "開(kāi)始一個(gè)新的錄像文件 : " + param3;
break;
case ntsmarteventid.event_daniulive_erc_publisher_one_recorder_file_finished:
publisher_event = "已生成一個(gè)錄像文件 : " + param3;
break;
case ntsmarteventid.event_daniulive_erc_publisher_send_delay:
publisher_event = "發(fā)送時(shí)延: " + param1 + " 幀數(shù):" + param2;
break;
case ntsmarteventid.event_daniulive_erc_publisher_capture_image:
publisher_event = "快照: " + param1 + " 路徑:" + param3;
if (param1 == 0) {
publisher_event = publisher_event + "截取快照成功..";
} else {
publisher_event = publisher_event + "截取快照失敗..";
}
break;
case ntsmarteventid.event_daniulive_erc_publisher_rtsp_url:
publisher_event = "rtsp服務(wù)url: " + param3;
break;
case ntsmarteventid.event_daniulive_erc_push_rtsp_server_response_status_code:
publisher_event ="rtsp status code received, codeid: " + param1 + ", rtsp url: " + param3;
break;
case ntsmarteventid.event_daniulive_erc_push_rtsp_server_not_support:
publisher_event ="服務(wù)器不支持rtsp推送, 推送的rtsp url: " + param3;
break;
}
string str = "當(dāng)前回調(diào)狀態(tài):" + publisher_event;
log.i(tag, str);
message message = new message();
message.what = publisher_event_msg;
message.obj = publisher_event;
handler.sendmessage(message);
}
}
部分屏幕數(shù)據(jù)采集
回答:我們遇到的好多場(chǎng)景下,教室端,會(huì)拿出來(lái)3/4的區(qū)域用來(lái)投遞給學(xué)生看,1/4的區(qū)域,用來(lái)做一些指令等操作,這個(gè)時(shí)候,就需要考慮屏幕區(qū)域裁剪:
代碼語(yǔ)言:javascript
復(fù)制
/**
* 投遞裁剪過(guò)的rgba數(shù)據(jù)
*
* @param data: rgba data
*
* @param rowstride: stride information
*
* @param width: width
*
* @param height: height
*
* @param clipedleft: 左; clipedtop: 上; clipedwidth: 裁剪后的寬; clipedheight: 裁剪后的高; 確保傳下去裁剪后的寬、高均為偶數(shù)
*
* @return {0} if successful
*/
public native int smartpublisheroncapturevideoclipedrgbadata(long handle, bytebuffer data, int rowstride, int width, int height, int clipedleft, int clipedtop, int clipedwidth, int clipedheight);
文字、圖片水印
好多場(chǎng)景下,同屏者會(huì)把公司logo,和一定的文字信息展示在推送端,這個(gè)時(shí)候,需要考慮到文字和圖片水印問(wèn)題:
代碼語(yǔ)言:javascript
復(fù)制
/**
* set text water-mark(設(shè)置文字水印)
*
* @param fontsize: it should be "medium", "small", "big"
*
* @param waterpostion: it should be "topleft", "topright", "bottomleft", "bottomright".
*
* @param xpading, ypading: the distance of the original picture.
*
* <pre> the interface is only used for setting font water-mark when publishing stream. </pre>
*
* @return {0} if successful
*/
public native int smartpublishersettextwatermark(long handle, string watertext, int isappendtime, int fontsize, int waterpostion, int xpading, int ypading);
/**
* set text water-mark font file name(設(shè)置文字水印字體路徑)
*
* @param fontfilename: font full file name, e.g: /system/fonts/droidsansfallback.ttf
*
* @return {0} if successful
*/
public native int smartpublishersettextwatermarkfontfilename(long handle, string fontfilename);
/**
* set picture water-mark(設(shè)置png圖片水印)
*
* @param picpath: the picture working path, e.g: /sdcard/logo.png
*
* @param waterpostion: it should be "topleft", "topright", "bottomleft", "bottomright".
*
* @param picwidth, picheight: picture width & height
*
* @param xpading, ypading: the distance of the original picture.
*
* <pre> the interface is only used for setting picture(logo) water-mark when publishing stream, with "*.png" format </pre>
*
* @return {0} if successful
*/
public native int smartpublishersetpicturewatermark(long handle, string picpath, int waterpostion, int picwidth, int picheight, int xpading, int ypading);
屏幕權(quán)限獲取|數(shù)據(jù)采集
采集推送之前,需要獲取屏幕權(quán)限,拿到屏幕數(shù)據(jù)后,調(diào)用sdk接口,完成推送或錄像操作即可:
代碼語(yǔ)言:javascript
復(fù)制
@targetapi(build.version_codes.lollipop)
private boolean startscreencapture() {
log.i(tag, "startscreencapture..");
setupmediaprojection();
setupvirtualdisplay();
return true;
}
private int align(int d, int a) {
return (((d) + (a - 1)) & ~(a - 1));
}
@suppresswarnings("deprecation")
@suppresslint("newapi")
private void createscreenenvironment() {
sreenwindowwidth = mwindowmanager.getdefaultdisplay().getwidth();
screenwindowheight = mwindowmanager.getdefaultdisplay().getheight();
log.i(tag, "screenwindowwidth: " + sreenwindowwidth + ",screenwindowheight: "
+ screenwindowheight);
if (sreenwindowwidth > 800)
{
if (screenresolution == screen_resolution_standard)
{
scale_rate = scale_rate_half;
sreenwindowwidth = align(sreenwindowwidth / 2, 16);
screenwindowheight = align(screenwindowheight / 2, 16);
}
else if(screenresolution == screen_resolution_low)
{
scale_rate = scale_rate_two_fifths;
sreenwindowwidth = align(sreenwindowwidth * 2 / 5, 16);
screenwindowheight = align(screenwindowheight * 2 / 5, 16);
}
}
log.i(tag, "after adjust mwindowwidth: " + sreenwindowwidth + ", mwindowheight: " + screenwindowheight);
int pf = mwindowmanager.getdefaultdisplay().getpixelformat();
log.i(tag, "display format:" + pf);
displaymetrics displaymetrics = new displaymetrics();
mwindowmanager.getdefaultdisplay().getmetrics(displaymetrics);
mscreendensity = displaymetrics.densitydpi;
mimagereader = imagereader.newinstance(sreenwindowwidth,
screenwindowheight, 0x1, 6);
mmediaprojectionmanager = (mediaprojectionmanager) getsystemservice(context.media_projection_service);
}
@suppresslint("newapi")
private void setupmediaprojection() {
mmediaprojection = mmediaprojectionmanager.getmediaprojection(
mainactivity.mresultcode, mainactivity.mresultdata);
}
@suppresslint("newapi")
private void setupvirtualdisplay() {
mvirtualdisplay = mmediaprojection.createvirtualdisplay(
"screencapture", sreenwindowwidth, screenwindowheight,
mscreendensity,
displaymanager.virtual_display_flag_auto_mirror,
mimagereader.getsurface(), null, null);
mimagereader.setonimageavailablelistener(
new imagereader.onimageavailablelistener() {
@override
public void onimageavailable(imagereader reader) {
image image = mimagereader.acquirelatestimage();
if (image != null) {
processscreenimage(image);
//image.close();
}
}
}, null);
}
private void startrecorderscreen() {
log.i(tag, "start recorder screen..");
if (startscreencapture()) {
new thread() {
@override
public void run() {
log.i(tag, "start record..");
}
}.start();
}
}
private bytebuffer deepcopy(bytebuffer source) {
int sourcep = source.position();
int sourcel = source.limit();
bytebuffer target = bytebuffer.allocatedirect(source.remaining());
target.put(source);
target.flip();
source.position(sourcep);
source.limit(sourcel);
return target;
}
/**
* process image data as desired.
*/
@suppresslint("newapi")
private void processscreenimage(image image) {
if(!ispushingrtmp && !isrecording &&!isrtsppublisherrunning)
{
image.close();
return;
}
/*
final image.plane[] planes = image.getplanes();
width_ = image.getwidth();
height_ = image.getheight();
row_stride_ = planes[0].getrowstride();
bytebuffer buf = deepcopy(planes[0].getbuffer());
*/
// log.i("onscreenimage", "new image");
pushimage(image);
}
@suppresslint("newapi")
private void stopscreencapture() {
if (mvirtualdisplay != null) {
mvirtualdisplay.release();
mvirtualdisplay = null;
}
}
基礎(chǔ)初始化
代碼語(yǔ)言:javascript
復(fù)制
private void initandsetconfig() {
//開(kāi)始要不要采集音頻或視頻,請(qǐng)自行設(shè)置
publisherhandle = libpublisher.smartpublisheropen(this.getapplicationcontext(),
audio_opt, video_opt, sreenwindowwidth,
screenwindowheight);
if ( publisherhandle == 0 )
{
return;
}
log.i(tag, "publisherhandle=" + publisherhandle);
libpublisher.setsmartpublishereventcallbackv2(publisherhandle, new eventhandev2());
if(videoencodetype == 1)
{
int h264hwkbps = sethardwareencoderkbps(true, sreenwindowwidth,
screenwindowheight);
log.i(tag, "h264hwkbps: " + h264hwkbps);
int issupporth264hwencoder = libpublisher
.setsmartpublishervideohwencoder(publisherhandle, h264hwkbps);
if (issupporth264hwencoder == 0) {
log.i(tag, "great, it supports h.264 hardware encoder!");
}
}
else if (videoencodetype == 2)
{
int hevchwkbps = sethardwareencoderkbps(false, sreenwindowwidth,
screenwindowheight);
log.i(tag, "hevchwkbps: " + hevchwkbps);
int issupporthevchwencoder = libpublisher
.setsmartpublishervideohevchwencoder(publisherhandle, hevchwkbps);
if (issupporthevchwencoder == 0) {
log.i(tag, "great, it supports hevc hardware encoder!");
}
}
if(is_sw_vbr_mode)
{
int is_enable_vbr = 1;
int video_quality = calvideoquality(sreenwindowwidth,
screenwindowheight, true);
int vbr_max_bitrate = calvbrmaxkbitrate(sreenwindowwidth,
screenwindowheight);
libpublisher.smartpublishersetswvbrmode(publisherhandle, is_enable_vbr, video_quality, vbr_max_bitrate);
}
//音頻相關(guān)可以參考smartpublisher工程
/*
if (!is_speex)
{
// set aac encoder
libpublisher.smartpublishersetaudiocodectype(publisherhandle, 1);
}
else
{
// set speex encoder
libpublisher.smartpublishersetaudiocodectype(publisherhandle, 2);
libpublisher.smartpublishersetspeexencoderquality(publisherhandle, 8);
}
libpublisher.smartpublishersetnoisesuppression(publisherhandle, is_noise_suppression ? 1
: 0);
libpublisher.smartpublishersetagc(publisherhandle, is_agc ? 1 : 0);
*/
// libpublisher.smartpublishersetclippingmode(publisherhandle, 0);
//libpublisher.smartpublishersetswvideoencoderprofile(publisherhandle, sw_video_encoder_profile);
//libpublisher.smartpublishersetswvideoencoderspeed(publisherhandle, sw_video_encoder_speed);
// libpublisher.setrtmppublishingtype(publisherhandle, 0);
libpublisher.smartpublishersetfps(publisherhandle, 18); //幀率可調(diào)
libpublisher.smartpublishersetgopinterval(publisherhandle, 18*3);
//libpublisher.smartpublishersetswvideobitrate(publisherhandle, 1200, 2400); //針對(duì)軟編碼有效,一般最大碼率是平均碼率的二倍
libpublisher.smartpublishersetswvideoencoderspeed(publisherhandle, 3);
//libpublisher.smartpublishersaveimageflag(publisherhandle, 1);
}
準(zhǔn)備推送|錄像|啟動(dòng)rtsp服務(wù)
代碼語(yǔ)言:javascript
復(fù)制
@suppresswarnings("deprecation")
@override
public void onstart(intent intent, int startid) {
// todo auto-generated method stub
super.onstart(intent, startid);
log.i(tag, "onstart++");
if (libpublisher == null)
return;
clearallimages();
screenresolution = intent.getextras().getint("screenresolution");
videoencodetype = intent.getextras().getint("videoencodetype");
push_type = intent.getextras().getint("pushtype");
log.i(tag, "push_type: " + push_type);
mwindowmanager = (windowmanager) getsystemservice(service.window_service);
// 窗口管理者
createscreenenvironment();
startrecorderscreen();
//如果同時(shí)推送和錄像,設(shè)置一次就可以
initandsetconfig();
if ( publisherhandle == 0 )
{
stopscreencapture();
return;
}
if(push_type == push_type_rtmp)
{
string publishurl = intent.getstringextra("publishurl");
log.i(tag, "publishurl: " + publishurl);
if (libpublisher.smartpublisherseturl(publisherhandle, publishurl) != 0) {
stopscreencapture();
log.e(tag, "failed to set publish stream url..");
if (publisherhandle != 0) {
if (libpublisher != null) {
libpublisher.smartpublisherclose(publisherhandle);
publisherhandle = 0;
}
}
return;
}
}
//啟動(dòng)傳遞數(shù)據(jù)線程
post_data_thread = new thread(new datarunnable());
log.i(tag, "new post_data_thread..");
is_post_data_thread_alive = true;
post_data_thread.start();
//錄像相關(guān)++
is_need_local_recorder = intent.getextras().getboolean("recorder");
if(is_need_local_recorder)
{
configrecorderparam();
int startret = libpublisher.smartpublisherstartrecorder(publisherhandle);
if( startret != 0 )
{
isrecording = false;
log.e(tag, "failed to start recorder..");
}
else
{
isrecording = true;
}
}
//錄像相關(guān)——
if(push_type == push_type_rtmp)
{
log.i(tag, "rtmp pusher mode..");
//推流相關(guān)++
int startret = libpublisher.smartpublisherstartpublisher(publisherhandle);
if (startret != 0) {
ispushingrtmp = false;
log.e(tag, "failed to start push rtmp stream..");
return;
}
else
{
ispushingrtmp = true;
}
//推流相關(guān)--
}
else if(push_type == push_type_rtsp)
{
log.i(tag, "rtsp internal server mode..");
rtsp_handle_ = libpublisher.openrtspserver(0);
if (rtsp_handle_ == 0) {
log.e(tag, "創(chuàng)建rtsp server實(shí)例失敗! 請(qǐng)檢查sdk有效性");
} else {
int port = 8554;
if (libpublisher.setrtspserverport(rtsp_handle_, port) != 0) {
libpublisher.closertspserver(rtsp_handle_);
rtsp_handle_ = 0;
log.e(tag, "創(chuàng)建rtsp server端口失敗! 請(qǐng)檢查端口是否重復(fù)或者端口不在范圍內(nèi)!");
}
//string user_name = "admin";
//string password = "12345";
//libpublisher.setrtspserverusernamepassword(rtsp_handle_, user_name, password);
if (libpublisher.startrtspserver(rtsp_handle_, 0) == 0) {
log.i(tag, "啟動(dòng)rtsp server 成功!");
} else {
libpublisher.closertspserver(rtsp_handle_);
rtsp_handle_ = 0;
log.e(tag, "啟動(dòng)rtsp server失敗! 請(qǐng)檢查設(shè)置的端口是否被占用!");
return;
}
isrtspservicerunning = true;
}
if(isrtspservicerunning)
{
log.i(tag, "onclick start rtsp publisher..");
string rtsp_stream_name = "stream1";
libpublisher.setrtspstreamname(publisherhandle, rtsp_stream_name);
libpublisher.clearrtspstreamserver(publisherhandle);
libpublisher.addrtspstreamserver(publisherhandle, rtsp_handle_, 0);
if (libpublisher.startrtspstream(publisherhandle, 0) != 0) {
log.e(tag, "調(diào)用發(fā)布rtsp流接口失敗!");
return;
}
isrtsppublisherrunning = true;
}
}
//如果同時(shí)推送和錄像,audio啟動(dòng)一次就可以了
checkinitaudiorecorder();
log.i(tag, "onstart--");
}
private void stoppush() {
if(!ispushingrtmp)
{
return;
}
if (!isrecording && !isrtsppublisherrunning) {
if (audiorecord_ != null) {
log.i(tag, "stoppush, call audiorecord_.stoprecording..");
audiorecord_.stop();
if (audiorecordcallback_ != null) {
audiorecord_.removecallback(audiorecordcallback_);
audiorecordcallback_ = null;
}
audiorecord_ = null;
}
}
if (libpublisher != null) {
libpublisher.smartpublisherstoppublisher(publisherhandle);
}
if (!isrecording && !isrtsppublisherrunning) {
if (publisherhandle != 0) {
if (libpublisher != null) {
libpublisher.smartpublisherclose(publisherhandle);
publisherhandle = 0;
}
}
}
}
停止推送|錄像|rtsp服務(wù)
代碼語(yǔ)言:javascript
復(fù)制
private void stoprecorder() {
if(!isrecording)
{
return;
}
if (!ispushingrtmp && !isrtsppublisherrunning) {
if (audiorecord_ != null) {
log.i(tag, "stoprecorder, call audiorecord_.stoprecording..");
audiorecord_.stop();
if (audiorecordcallback_ != null) {
audiorecord_.removecallback(audiorecordcallback_);
audiorecordcallback_ = null;
}
audiorecord_ = null;
}
}
if (libpublisher != null) {
libpublisher.smartpublisherstoprecorder(publisherhandle);
}
if (!ispushingrtmp && !isrtsppublisherrunning) {
if (publisherhandle != 0) {
if (libpublisher != null) {
libpublisher.smartpublisherclose(publisherhandle);
publisherhandle = 0;
}
}
}
}
//停止發(fā)布rtsp流
private void stoprtsppublisher() {
if(!isrtsppublisherrunning)
{
return;
}
if (!ispushingrtmp && !isrecording) {
if (audiorecord_ != null) {
log.i(tag, "stoprtsppublisher, call audiorecord_.stoprecording..");
audiorecord_.stop();
if (audiorecordcallback_ != null) {
audiorecord_.removecallback(audiorecordcallback_);
audiorecordcallback_ = null;
}
audiorecord_ = null;
}
}
if (libpublisher != null) {
libpublisher.stoprtspstream(publisherhandle);
}
if (!ispushingrtmp && !isrecording) {
if (publisherhandle != 0) {
if (libpublisher != null) {
libpublisher.smartpublisherclose(publisherhandle);
publisherhandle = 0;
}
}
}
}
//停止rtsp服務(wù)
private void stoprtspservice() {
if(!isrtspservicerunning)
{
return;
}
if (libpublisher != null && rtsp_handle_ != 0) {
libpublisher.stoprtspserver(rtsp_handle_);
libpublisher.closertspserver(rtsp_handle_);
rtsp_handle_ = 0;
}
}
感興趣的開(kāi)發(fā)者可酌情參考。
什么是互聯(lián)網(wǎng)思維:@箐一 分享了她近期的感觸,覺(jué)得有理兒,且易懂,“互聯(lián)網(wǎng)思維就是讓用戶參與進(jìn)來(lái)”:1)傳統(tǒng)的燒烤:餐廳烤好,用戶吃 > 不好吃,罵餐廳,一定是餐廳的錯(cuò)2)互聯(lián)網(wǎng)思維的燒烤:用戶自己烤,烤了自己吃 >
不好吃,有可能是自己烤的不好,參與了其中,即使烤糊了,也是很有成就感的同理:1)用戶參與到產(chǎn)品的設(shè)計(jì)中來(lái)(小米的miui)2)用戶參與到產(chǎn)品的傳播中來(lái)(微博分享,好友圈分享)3)用戶參與到產(chǎn)品的評(píng)價(jià)中來(lái)
(實(shí)體店的評(píng)論墻,電商網(wǎng)站的評(píng)論系統(tǒng))4)…這些都是典型“互聯(lián)網(wǎng)思維”的表現(xiàn)。
觀點(diǎn)一,互聯(lián)網(wǎng)思維是:1)免費(fèi):用戶可能不會(huì)為核心業(yè)務(wù)直接買(mǎi)單,互聯(lián)網(wǎng)公司不得不尋求其他利潤(rùn)途徑,典型是360安全衛(wèi)士的崛起2)快速:互聯(lián)網(wǎng)競(jìng)爭(zhēng)激烈,門(mén)檻不高,山寨成風(fēng),速度對(duì)互聯(lián)網(wǎng)行業(yè)就是生命,跑得慢的都將被遺忘
一切的一切,都在大數(shù)據(jù)中蘊(yùn)含4)極致思維:同觀點(diǎn)一5)平臺(tái)思維:平臺(tái)思維的特點(diǎn)首先是開(kāi)發(fā),建立平臺(tái),建立生態(tài)圈,才能活的長(zhǎng)久
2014世界杯:巴西該怎樣利用大數(shù)據(jù)?:這套裝置是一個(gè)國(guó)際團(tuán)隊(duì)多年研發(fā)的成果,這個(gè)團(tuán)隊(duì)里有科學(xué)家有工程師,他們都為一個(gè)叫做“重新站立起來(lái)”的項(xiàng)目工作。
atos是一家法國(guó)公司,他們將負(fù)責(zé)里約奧運(yùn)會(huì)的信息技術(shù)網(wǎng)絡(luò),他們說(shuō)在2012年倫敦奧運(yùn)會(huì)的時(shí)候偵查到兩億五千五百萬(wàn)次安全事件。
作為一個(gè)科學(xué)家,他開(kāi)始了自己的探索。他使用了12,000個(gè)價(jià)格數(shù)據(jù)做研究,數(shù)據(jù)都是從旅游網(wǎng)站上抓取下來(lái)的,時(shí)間跨度有41天。他建立了一個(gè)預(yù)測(cè)模型,用這個(gè)模型他能為虛擬客人省下不少錢(qián)。
又過(guò)了幾年,這項(xiàng)技術(shù)就面世了。旅游網(wǎng)站amadeus已經(jīng)在跟你分享很多信息諸如:- 人們都是在哪里搜索機(jī)票信息的?- 大多數(shù)飛機(jī)航線從哪里出發(fā)?- 機(jī)票的收入和回報(bào)是怎樣的?
南非世界杯過(guò)后,南非的游客增長(zhǎng)了22%??煽诳蓸?lè)的社會(huì)數(shù)據(jù)實(shí)驗(yàn)就像其他精明的跨國(guó)公司一樣,可口可樂(lè)也希望讓自己的品牌充斥你的生活。他們想讓你喝可口可樂(lè),該如何達(dá)到這個(gè)目的呢?沒(méi)錯(cuò),還是大數(shù)據(jù)。
web前端學(xué)習(xí) 第2章 網(wǎng)頁(yè)重構(gòu)1 第一個(gè)網(wǎng)頁(yè):0.png 一、內(nèi)容概述從本節(jié)我們開(kāi)始正式學(xué)習(xí)前端開(kāi)發(fā)的課程內(nèi)容,首先我們從第一個(gè)網(wǎng)頁(yè)開(kāi)始了解html和css的基本概念,并通過(guò)創(chuàng)建第一個(gè)網(wǎng)頁(yè)了解vscode的基本使用方法。
網(wǎng)頁(yè)文件本身是一種文本文件, 使用 !
慶幸的是有了這本《前端開(kāi)發(fā)學(xué)習(xí)手冊(cè)》,只要掌握十幾個(gè)標(biāo)簽,就能完成生動(dòng)的網(wǎng)頁(yè)。在下一節(jié)我們會(huì)列舉常用的html標(biāo)簽。
剛才我們了解了,使用html可以設(shè)置網(wǎng)頁(yè)中的內(nèi)容(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的一個(gè)應(yīng)用)等文件樣式的計(jì)算機(jī)語(yǔ)言,那么使用css就可以進(jìn)一步裝飾這些內(nèi)容,錄入設(shè)置文本的字體顏色,或是改變圖片的尺寸等等。
1 2 3 4 5 6 document 7 8 p{ 9 color:red;10 }11 12 13 14 我的第一個(gè)網(wǎng)頁(yè)15 16 上面的代碼我們可以將p標(biāo)簽的文字設(shè)置成紅色。
ccf業(yè)務(wù)總部和學(xué)術(shù)交流中心落戶蘇州相城:2019年1月12日,中國(guó)計(jì)算機(jī)學(xué)會(huì)(ccf)與蘇州市相城區(qū)人民政府、蘇州高鐵新城管委會(huì)在蘇州高鐵金科大酒店聯(lián)合舉辦了ccf業(yè)務(wù)總部&學(xué)術(shù)交流中心落地蘇州相城簽約儀式及新聞發(fā)布會(huì),ccf理事長(zhǎng)高文,秘書(shū)長(zhǎng)杜子德
簽約儀式由相城區(qū)副區(qū)長(zhǎng)朱小海主持。
同時(shí)ccf還將深入建設(shè)線上服務(wù)和區(qū)域會(huì)員服務(wù)以及其他和ccf發(fā)展有關(guān)的業(yè)務(wù),線上服務(wù)包括但不限于ccf網(wǎng)站、數(shù)字圖書(shū)館、ccf在線、會(huì)議管理服務(wù)、會(huì)員管理和服務(wù)等。
蘇州市相城區(qū)人民政府和蘇州高鐵新城管理委員會(huì)將對(duì)建設(shè)和運(yùn)營(yíng)ccf業(yè)務(wù)總部&學(xué)術(shù)交流中心提供相關(guān)有效支持,幫助ccf基于蘇州做好區(qū)域輻射服務(wù)。 ?
簽約儀式上,ccf理事長(zhǎng)高文,ccf前任副理事長(zhǎng)、中國(guó)工程院副院長(zhǎng)陳左寧,蘇州市政府副秘書(shū)長(zhǎng)盧淵,蘇州市科協(xié)主席程波,相城區(qū)委書(shū)記顧海東的共同見(jiàn)證下,杜子德、潘春華、蘇學(xué)慶在合作協(xié)議上簽字。
1分鐘鏈圈 | 今日波場(chǎng)虛擬機(jī)tvm正式上線,大幅降低dapp運(yùn)營(yíng)成本::區(qū)塊鏈在數(shù)據(jù)分析領(lǐng)域仍有很大空間人民網(wǎng):區(qū)塊鏈技術(shù)或?qū)⒔鉀Q傳媒業(yè)信源追溯、版權(quán)保護(hù)等痛點(diǎn)公司紐交所上市公司vmware推出區(qū)塊鏈項(xiàng)目concord,用于數(shù)字共識(shí)和智能合同執(zhí)行鄭州銀行:將利用區(qū)塊鏈技術(shù)打造商貿(mào)物流
“智慧平臺(tái)”國(guó)內(nèi)首家互聯(lián)網(wǎng)保險(xiǎn)公司眾安在線研發(fā)上半年投入同比增加91%,已形成t系列區(qū)塊鏈產(chǎn)品五條科技產(chǎn)品線恭喜你,今天的新聞全部看完啦。
1.今日波場(chǎng)虛擬機(jī)tvm正式上線,大幅降低dapp運(yùn)營(yíng)成本 今日波場(chǎng)虛擬機(jī)tvm正式上線,在直播中,波場(chǎng)技術(shù)負(fù)責(zé)人趙宏著重介紹了波場(chǎng)虛擬機(jī)的特性,除在測(cè)試版時(shí)已公布的“完全兼容以太坊虛擬機(jī)”外,趙宏表示
10.鄭州銀行:將利用區(qū)塊鏈技術(shù)打造商貿(mào)物流“智慧平臺(tái)”根據(jù)新浪財(cái)經(jīng)消息,鄭州銀行將充分利用鄭州市作為國(guó)家中心城市、“一帶一路”重要節(jié)點(diǎn)城市的優(yōu)勢(shì),加強(qiáng)與電商巨頭、物流公司、物流園區(qū)的合作,通過(guò)聚集廣泛的金融資源
,借助大數(shù)據(jù)、區(qū)塊鏈等新技術(shù),打造商貿(mào)物流“智慧平臺(tái)”,聚焦解決會(huì)員企業(yè)的資金流、信息流、物流等痛點(diǎn)難點(diǎn)問(wèn)題,力推實(shí)現(xiàn)商貿(mào)物流金融領(lǐng)域“商流、物流、資金流、信息流”的四流合一,推進(jìn)商貿(mào)物流金融模式的創(chuàng)新發(fā)展
大數(shù)據(jù)與商業(yè)地理分析:接下來(lái),深入到每一個(gè)街道分區(qū)內(nèi)部,根據(jù)分區(qū)特征、商業(yè)信息點(diǎn)的分布與區(qū)域聚集度進(jìn)行打分,結(jié)合該城市各分區(qū)內(nèi)已建在建籌建樓宇列表選出網(wǎng)點(diǎn)的最優(yōu)位置(見(jiàn)圖1)。?
即使是城市軌道交通建設(shè)這樣長(zhǎng)期而浩大的工程,商業(yè)地理分析亦能提供獨(dú)特的視角。近期我們獲邀為西南某省會(huì)城市的軌道交通發(fā)展把脈。從地理空間的角度來(lái)考察地鐵規(guī)劃再合適不過(guò)。
全面竣工后39%的城市人口將會(huì)在地鐵站點(diǎn)周邊800米內(nèi)。但與倫敦和莫斯科等國(guó)際都市相比,地鐵站點(diǎn)密度仍然偏低。
同時(shí),半數(shù)以上的醫(yī)院和學(xué)校超出了地鐵站點(diǎn)800米覆蓋范圍,站點(diǎn)附近尚缺乏足夠的配套公共服務(wù)設(shè)施。進(jìn)一步分析發(fā)現(xiàn),還有部分地鐵站點(diǎn)周?chē)丝谙∈枨疑虡I(yè)活動(dòng)不頻繁,可能是城市中的價(jià)值洼地(見(jiàn)圖3)。??
過(guò)去幾年,在麥肯錫全球商業(yè)地理分析團(tuán)隊(duì)的幫助和多方努力下,我們已經(jīng)構(gòu)建了深入到街道級(jí)別的地理信息數(shù)據(jù)庫(kù),涵蓋近千萬(wàn)的商業(yè)信息點(diǎn),并已經(jīng)應(yīng)用于數(shù)十個(gè)客戶項(xiàng)目的分析中,在中國(guó)處于領(lǐng)先地位。
@zWSK5kW710 ?- @企業(yè)流程管理 @全自動(dòng)進(jìn)銷(xiāo)存管理系統(tǒng) @電子檔案管理平臺(tái)
轉(zhuǎn)載請(qǐng)注明出處,本站網(wǎng)址:
http://www.zwhvip.com/news/2064.html