java組合模式(composite):組合模式(composite)使用組合模式的場景:??把部分和整體的關(guān)系用樹形結(jié)構(gòu)來表示,從而使客戶端可以使用統(tǒng)一的方式處理部分對象和整體對象.組合模式核心:抽象構(gòu)件(component)角色: 定義了葉子和容器構(gòu)件的共同點葉子
文件管理案例component抽象** * 抽象構(gòu)建 * @author 波波烤鴨 * @email dengpbs@163.com * *public interface abstractfile {
f1.add(imagefile); f1.add(f); f1.operiation();}輸出:處理:c:文件夾視頻文件:aaa.mp4 處理操作視頻文件:aaa.mp4 處理操作圖片文件:波波烤鴨.
jpg 處理操作處理:c:tools文件夾視頻文件:aaa.mp4 處理操作圖片文件:波波烤鴨.jpg 處理操作文本文件:readme.txt 處理操作開發(fā)中的應(yīng)用場景:操作系統(tǒng)的資源管理器gui中的容器層次圖
xml文件解析
政務(wù)OA系統(tǒng)中,組織結(jié)構(gòu)的處理junit單元測試框架 ? 底層設(shè)計就是典型的組合模式,testcase(葉子)、testunite(容器)、test接口(抽象)?
小結(jié)css的float屬性:padding:?0;????????} ????????img?{????????????float:?left;????????}???? ????????????????????新垣結(jié)衣
(aragaki?yui),1988年6月11日出生于沖繩縣那霸市。
2007年,她從日出高校畢業(yè)后開始專注于演藝發(fā)展,并發(fā)表個人首張音樂專輯《天空》;同年,新垣結(jié)衣還主演了愛情片《戀空》,而她也憑借該片獲得了多個電影新人獎項????????。
2010年,主演愛情片《花水木》。????????2011年,主演都市劇《全開女孩》。2012年,相繼參演現(xiàn)代劇《legal????????high》、劇情片《劇場版新參者:麒麟之翼》。
新垣結(jié)衣長相甜美、笑容純真,擁有天使般笑容的她被受訪者們稱為“治愈系”美女。而在電影《戀空》中她的表演既具深度又生活化。 ???? 1.2創(chuàng)建網(wǎng)頁布局float屬性還常用于網(wǎng)頁布局:效果:?
微信公眾號借用別的微信公眾號支付配置:借用其他賬號微信支付之前,要確保要借用微信公眾號的微信支付已開通;并且要借用微信支付的公眾號可以添加微信支付授權(quán)目錄、安全域名、授權(quán)域名和ip白名單;滿足微信支付條件的賬號(包括認證的服務(wù)號、認證的政府與媒體類訂閱號
),可以在微信公眾平臺左側(cè)導(dǎo)航中出現(xiàn)“微信支付”的文字,點擊即可進行申請。
appid和appsecret在微信公眾平臺查看,若借用的是其他賬號的微信支付,則填寫這個開通微信支付的公眾號的appid和appsecret ;商戶號和api密鑰需登錄微信商戶平臺查看設(shè)置 ,配置后點擊確定即可保存
第三步、api密鑰的設(shè)置?第五步、使用開通微信支付公眾號登錄微信公眾平臺,點擊左側(cè)菜單的設(shè)置-》公眾號設(shè)置-》功能設(shè)置,添加安全域名、授權(quán)域名為:weixin.gycode.com?
第六步、開通微信支付的公眾號登錄微信公眾平臺,點擊左側(cè)菜單 開發(fā)-》基本配置,添加ip白名單:115.28.49.127?以上參數(shù)都配置成功后即可使用借用微信支付。
大數(shù)據(jù)時代,什么是數(shù)據(jù)分析的靈魂:人類科學(xué)發(fā)展史上的不少進步都和數(shù)據(jù)采集分析直接相關(guān),例如現(xiàn)代醫(yī)學(xué)流行病學(xué)的開端。倫敦1854年發(fā)生了大規(guī)模的霍亂,很長時間沒有辦法控制。
一位醫(yī)師用標(biāo)點地圖的方法研究了當(dāng)?shù)厮植己突魜y患者分布之間的關(guān)系,發(fā)現(xiàn)有一口水井周圍,霍亂患病率明顯較高,借此找到了霍亂暴發(fā)的原因:一口被污染的水井。關(guān)閉這口水井之后,霍亂的發(fā)病率明顯下降。
大數(shù)據(jù)是非競爭性資源,有助于政府科學(xué)決策、商家精準(zhǔn)營銷大數(shù)據(jù)時代,數(shù)據(jù)的重要作用更加凸顯,許多國家都把大數(shù)據(jù)提升到國家戰(zhàn)略的高度。
政府合理利用大數(shù)據(jù),引導(dǎo)決策的將是基于實證的事實,政府會更有預(yù)見性、更加負責(zé)、更加開放。
小數(shù)據(jù)時代,政府做決策更多依憑經(jīng)驗和局部數(shù)據(jù),難免頭痛醫(yī)頭、腳痛醫(yī)腳。比如,交通堵塞就多修路。大數(shù)據(jù)時代,政府做決策能夠從粗放型轉(zhuǎn)向集約型。
孟村回族政府辦公政務(wù)OA系統(tǒng):鼎湖區(qū)政務(wù)oa中智慧教室無紙化同屏方案是否適用rtmp?得到廣泛應(yīng)用。本文將深入探討oa政府辦公的重要性、優(yōu)勢和未來發(fā)展趨勢。第一部分:oa政府辦公的重要性現(xiàn)代化政府辦公環(huán)境中,信息的快速流動和高效處理是至關(guān)重要的。oa政府辦公系統(tǒng)通過將傳統(tǒng)紙質(zhì)文件轉(zhuǎn)換為電子文檔,實現(xiàn)了信息的數(shù)字化存儲和管理。這不僅提高了政府工作的效率,還減少了紙質(zhì)文件的使用和存儲成本,對環(huán)境保護產(chǎn)生了積極的影響。此外,oa政府辦公系統(tǒng)還能夠促進政府機關(guān)之間的協(xié)同合作和信息共享。通過統(tǒng)一的平臺和標(biāo)準(zhǔn)化的流程,不同部門之間可以更加便捷地溝通和協(xié)調(diào)工作,避免了信息孤島和工作重復(fù)。這種協(xié)同合作不僅提高了政府工作的效率,還增強了政府對外服務(wù)的一致性和可靠性。第二部分:oa政府辦公的優(yōu)勢提高工作效率:oa政府辦公系統(tǒng)通過自動化流程和任務(wù)分配,減少了繁瑣的手工操作和人為錯誤。工作人員可以更智慧教室無紙化方案技術(shù)背景
智慧教室無紙化方案是一種基于現(xiàn)代信息技術(shù),旨在通過數(shù)字化手段實現(xiàn)教學(xué)過程的無紙化、智能化和高效化的解決方案。該方案以學(xué)生為中心,強調(diào)互動化的數(shù)字教學(xué)服務(wù),旨在提升教學(xué)質(zhì)量和學(xué)習(xí)效率,同時減少對傳統(tǒng)紙張的依賴,實現(xiàn)綠色環(huán)保。以下是對智慧教室無紙化方案的詳細闡述:
一、方案概述
智慧教室無紙化方案通過整合物聯(lián)網(wǎng)、大數(shù)據(jù)、人工智能等先進技術(shù),構(gòu)建了一個集智能管理、智慧教學(xué)、環(huán)境便捷調(diào)節(jié)及資源制作于一體的新型現(xiàn)代化智慧教室。該方案不僅實現(xiàn)了教學(xué)資源的數(shù)字化、網(wǎng)絡(luò)化,還通過智能設(shè)備和平臺實現(xiàn)了教學(xué)過程的自動化、智能化,為師生提供了更加便捷、高效、互動的學(xué)習(xí)和教學(xué)環(huán)境。
二、主要特點
數(shù)字化教學(xué)資源:智慧教室無紙化方案提供了豐富海量的數(shù)字化教學(xué)資源,包括電子教材、多媒體課件、在線題庫等,師生可以隨時隨地進行訪問和學(xué)習(xí),打破了傳統(tǒng)紙質(zhì)教材的束縛。
在線學(xué)習(xí)互動:通過智慧教室平臺,學(xué)生可以隨時收聽老師的講課內(nèi)容,參與在線討論、提問和答疑,實現(xiàn)了師生之間的即時互動。同時,學(xué)生還可以根據(jù)自己的學(xué)習(xí)進度和需求進行個性化學(xué)習(xí),提高了學(xué)習(xí)的針對性和自主性。
智能管理:智慧教室無紙化方案支持對教室內(nèi)的多種終端設(shè)備進行無縫連接和智能化管理,如智能白板、互動電子白板、環(huán)境監(jiān)測設(shè)備等。這些設(shè)備能夠自動采集和分析數(shù)據(jù),為教學(xué)和管理提供有力支持。
環(huán)境便捷調(diào)節(jié):智慧教室通過溫度、濕度和光照感應(yīng)器等設(shè)備,實現(xiàn)了對教室內(nèi)環(huán)境的自動調(diào)節(jié),為師生提供了更加舒適的學(xué)習(xí)和教學(xué)環(huán)境。
三、實施步驟
需求分析:根據(jù)學(xué)校的實際情況和需求,對智慧教室無紙化方案進行需求分析,明確建設(shè)目標(biāo)和功能需求。
方案設(shè)計:根據(jù)需求分析結(jié)果,設(shè)計智慧教室無紙化方案,包括系統(tǒng)架構(gòu)、設(shè)備選型、平臺開發(fā)等方面。
設(shè)備采購與安裝:按照方案要求采購相關(guān)設(shè)備,并進行安裝調(diào)試,確保設(shè)備能夠正常運行。
平臺開發(fā)與部署:開發(fā)智慧教室平臺,并進行部署和測試,確保平臺能夠穩(wěn)定運行并滿足教學(xué)需求。
培訓(xùn)與推廣:對教師和學(xué)生進行培訓(xùn)和推廣,幫助他們掌握智慧教室無紙化方案的使用方法和技巧。
四、應(yīng)用效果
智慧教室無紙化方案的實施可以帶來以下應(yīng)用效果:
提升教學(xué)質(zhì)量:通過數(shù)字化教學(xué)資源和在線學(xué)習(xí)互動功能,教師可以更加生動、直觀地傳授知識,激發(fā)學(xué)生的學(xué)習(xí)興趣和積極性;學(xué)生可以更加自主、靈活地進行學(xué)習(xí),提高學(xué)習(xí)效果和質(zhì)量。
提高教學(xué)效率:智慧教室無紙化方案可以大大簡化教學(xué)流程和管理流程,減少教師和管理人員的工作量;同時,通過智能設(shè)備和平臺的支持,可以實現(xiàn)教學(xué)過程的自動化和智能化,提高教學(xué)效率。
實現(xiàn)綠色環(huán)保:通過減少對傳統(tǒng)紙張的依賴和使用數(shù)字化教學(xué)資源等方式,智慧教室無紙化方案有助于實現(xiàn)綠色環(huán)保和可持續(xù)發(fā)展。
智慧教室rtmp方案探究
智慧教室rtmp在智慧教室場景下的應(yīng)用,以實現(xiàn)實時音視頻流傳輸、屏幕共享、互動教學(xué)等功能。以下是一個基于rtmp技術(shù)的智慧教室技術(shù)方案概述:
技術(shù)方案架構(gòu)
1. 組網(wǎng)與服務(wù)器部署
組網(wǎng)方式:建議采用無線組網(wǎng)方式,并配置高性能的ap模塊以支持大并發(fā)流量。推送端(如教師端設(shè)備)到ap的連接最好是有線網(wǎng)絡(luò),以確保穩(wěn)定性。
服務(wù)器部署:選擇srs或nginx作為rtmp服務(wù)器,可以根據(jù)實際情況與windows平臺的教師機部署在同一臺機器上,或部署在獨立的服務(wù)器上。
2. 教師端設(shè)備配置
如果教師有移動pad或其他android設(shè)備,可以直接將音視頻流推送到rtmp服務(wù)器,實現(xiàn)實時授課。
對于高分屏設(shè)備,建議適當(dāng)縮放視頻分辨率以減輕編碼和上行壓力,如將寬高縮放至2/3,并保持等比例縮放,縮放寬高建議做好字節(jié)對齊。
3. 學(xué)生端設(shè)備配置
學(xué)生端設(shè)備可以通過rtmp客戶端接收來自服務(wù)器的音視頻流,進行實時觀看和學(xué)習(xí)。
如果需要,學(xué)生端也可以作為示范案例,將屏幕數(shù)據(jù)共享給其他同學(xué),只需請求同屏,數(shù)據(jù)反推到rtmp服務(wù)器,其他學(xué)生即可查看。
4. 互動功能實現(xiàn)
通過rtmp協(xié)議,可以實現(xiàn)教師與學(xué)生的實時互動,如問答、投票等。
如果需要更進一步的監(jiān)控功能,如教師端監(jiān)控學(xué)生端的屏幕情況,可以通過學(xué)生端直接推送rtmp流或啟動內(nèi)置rtsp服務(wù)的方式實現(xiàn)。
關(guān)鍵技術(shù)點
1. 編碼與轉(zhuǎn)碼
使用適當(dāng)?shù)囊曨l編碼器(如h.264)和音頻編碼器(如aac)對音視頻流進行編碼,以確保高質(zhì)量的傳輸效果。
如果需要適應(yīng)不同帶寬或設(shè)備要求,可以使用ffmpeg等工具進行流的轉(zhuǎn)碼操作。
2. 橫豎屏適配
在android設(shè)備上,橫豎屏切換時需要考慮屏幕寬高的變化,確保推拉流兩端可以自動適配。
編碼器需要重啟以適應(yīng)新的分辨率設(shè)置,拉流端也需要能夠自動播放適應(yīng)變化后的視頻流。
3. 補幀策略
當(dāng)屏幕靜止不動時,為了避免播放端因幀間距過大而長時間收不到數(shù)據(jù),可以采用補幀策略。
保存最后一幀數(shù)據(jù),并設(shè)定一定的補幀間隔,以確保數(shù)據(jù)的連續(xù)性和流暢性。
4. 網(wǎng)絡(luò)穩(wěn)定性與重連機制
在網(wǎng)絡(luò)抖動或其他網(wǎng)絡(luò)異常情況下,需要有良好的重連機制和狀態(tài)回饋機制以確保傳輸?shù)姆€(wěn)定性。
通過設(shè)置心跳包、超時重連等策略來提高系統(tǒng)的健壯性和用戶體驗。
智慧教室方案選型
本文以大牛直播sdk的android的smartservicepublisherv2的同屏demo為例,android采集計時器,編碼打包分別啟動rtmp推送和輕量級rtsp服務(wù),windows過來分別拉取rtmp和rtsp的流,整體延遲毫秒級:
啟動app后,先選擇需要采集的分辨率(如果選原始分辨率,系統(tǒng)不做縮放),然后選擇“啟動媒體投影”,并分別啟動音頻播放采集、采集麥克風(fēng)。如果音頻播放采集和采集麥克風(fēng)都打開,可以通過右側(cè)下拉框,推送過程中,音頻播放采集和麥克風(fēng)采集實時切換。需要注意的是,android采集音頻播放的audio,音頻播放采集是依賴屏幕投影的,屏幕投影關(guān)閉后,音頻播放也就采不到了。
編碼的話,考慮到屏幕分辨率一般不會太低,我們可以縮放后再推送,默認我們開啟了原始分辨率、標(biāo)準(zhǔn)分辨率、低分辨率選項設(shè)置。一般建議標(biāo)準(zhǔn)分辨率即可。如果對畫質(zhì)和分辨率要求比較高,可以選擇原始分辨率。設(shè)備支持硬編碼,優(yōu)先選擇h.264硬編,如果是h.265硬編,需要rtmp服務(wù)器支持擴展h.265(或enhanced rtmp)。都選擇好后,設(shè)置rtmp推送的url,點開始rtmp推送按鈕即可。
下面從代碼邏輯實現(xiàn)角度,介紹下同屏的具體流程:
啟動媒體服務(wù),進入系統(tǒng)后,我們會自動啟動媒體服務(wù),對應(yīng)的實現(xiàn)邏輯如下:
代碼語言:java
復(fù)制
/*
* mainactivity.java
* created by daniusdk.com on 2017/04/19.
* wechat: xinsheng120
*/
private void start_media_service() {
intent intent = new intent(getapplicationcontext(), streammediademoservice.class);
if (build.version.sdk_int >= 26) {
log.i(tag, "startforegroundservice");
startforegroundservice(intent);
} else
startservice(intent);
bindservice(intent, service_connection_, context.bind_auto_create);
button_stop_media_service_.settext("停止媒體服務(wù)");
}
private void stop_media_service() {
if (media_engine_callback_ != null)
media_engine_callback_.reset(null);
if (media_engine_ != null) {
media_engine_.unregister_callback(media_engine_callback_);
media_engine_ = null;
}
media_engine_callback_ = null;
if (media_binder_ != null) {
media_binder_ = null;
unbindservice(service_connection_);
}
intent intent = new intent(getapplicationcontext(), streammediademoservice.class);
stopservice(intent);
button_stop_media_service_.settext("啟動媒體服務(wù)");
}
需要注意的是,android 6.0及以上版本,動態(tài)獲取audio權(quán)限:
代碼語言:java
復(fù)制
/*
* mainactivity.java
* created by daniusdk.com on 2017/04/19.
* wechat: xinsheng120
*/
private boolean check_record_audio_permission() {
//6.0及以上版本,動態(tài)獲取audio權(quán)限
if (packagemanager.permission_granted == checkpermission(android.manifest.permission.record_audio, process.mypid(), process.myuid()))
return true;
return false;
}
private void request_audio_permission() {
if (build.version.sdk_int < 23)
return;
log.i(tag, "requestpermissions record_audio");
activitycompat.requestpermissions(this, new string[] {android.manifest.permission.record_audio}, request_audio_code);
}
@override
public void onrequestpermissionsresult(int requestcode, string[] permissions, int[] grantresults) {
switch(requestcode){
case request_audio_code:
if (grantresults != null && grantresults.length > 0 && packagemanager.permission_granted == grantresults[0]) {
log.i(tag, "record_audio permission has been granted");
}else {
toast.maketext(this, "請開啟錄音權(quán)限!", toast.length_short).show();
}
break;
}
}
啟動、停止媒體投影:
代碼語言:java
復(fù)制
/*
* mainactivity.java
* created by daniusdk.com on 2017/04/19.
* wechat: xinsheng120
*/
private class buttonstartmediaprojectionlistener implements onclicklistener {
public void onclick(view v) {
if (null == media_engine_)
return;
if (media_engine_.is_video_capture_running()) {
media_engine_.stop_audio_playback_capture();
media_engine_.stop_video_capture();
resolution_selector_.setenabled(true);
button_capture_audio_playback_.settext("采集音頻播放");
button_start_media_projection_.settext("啟動媒體投影");
return;
}
intent capture_intent;
capture_intent = media_projection_manager_.createscreencaptureintent();
startactivityforresult(capture_intent, request_media_projection);
log.i(tag, "startactivityforresult request media projection");
}
}
啟動媒體投影后,選擇“采集音頻播放”,如果需要采集麥克風(fēng),可以點擊“采集麥克風(fēng)”:
代碼語言:java
復(fù)制
/*
* mainactivity.java
* created by daniusdk.com on 2017/04/19.
* wechat: xinsheng120
*/
private class buttoncaptureaudioplaybacklistener implements onclicklistener {
public void onclick(view v) {
if (null == media_engine_)
return;
if (media_engine_.is_audio_playback_capture_running()) {
media_engine_.stop_audio_playback_capture();
button_capture_audio_playback_.settext("采集音頻播放");
return;
}
if (!media_engine_.start_audio_playback_capture(44100, 1))
log.e(tag, "start_audio_playback_capture failed");
else
button_capture_audio_playback_.settext("停止音頻播放采集");
}
}
private class buttonstartaudiorecordlistener implements onclicklistener {
public void onclick(view v) {
if (null == media_engine_)
return;
if (media_engine_.is_audio_record_running()) {
media_engine_.stop_audio_record();
button_start_audio_record_.settext("采集麥克風(fēng)");
return;
}
if (!media_engine_.start_audio_record(44100, 1))
log.e(tag, "start_audio_record failed");
else
button_start_audio_record_.settext("停止麥克風(fēng)");
}
}
啟動、停止rtmp推送:
代碼語言:java
復(fù)制
/*
* mainactivity.java
* created by daniusdk.com on 2017/04/19.
* wechat: xinsheng120
*/
private class buttonrtmppublisherlistener implements onclicklistener {
@override
public void onclick(view v) {
if (null == media_engine_)
return;
if (media_engine_.is_rtmp_stream_running()) {
media_engine_.stop_rtmp_stream();
button_rtmp_publisher_.settext("開始rtmp推送");
text_view_rtmp_url_.settext("rtmp url: ");
log.i(tag, "stop rtmp stream");
return;
}
if (!media_engine_.is_video_capture_running())
return;
string rtmp_url;
if (input_rtmp_url_ != null && input_rtmp_url_.length() > 1) {
rtmp_url = input_rtmp_url_;
log.i(tag, "start, input rtmp url:" + rtmp_url);
} else {
rtmp_url = baseurl + string.valueof((int) (system.currenttimemillis() % 1000000));
log.i(tag, "start, generate random url:" + rtmp_url);
}
media_engine_.set_fps(fps_);
media_engine_.set_gop(gop_);
media_engine_.set_video_encoder_type(video_encoder_type);
if (!media_engine_.start_rtmp_stream(rtmp_url))
return;
button_rtmp_publisher_.settext("停止rtmp推送");
text_view_rtmp_url_.settext("rtmp url:" + rtmp_url);
log.i(tag, "rtmp url:" + rtmp_url);
}
}
可以看到,上述操作,都是在mainactivity.java調(diào)用的,如果是需要做demo版本集成,只需要關(guān)注mainactivity.java的業(yè)務(wù)邏輯即可,為了便于開發(fā)者對接,我們做了接口的二次封裝,除了常規(guī)的rtmp推送、輕量級rtsp服務(wù)設(shè)計外,如果需要錄像,只要在mainactivity.java調(diào)用這里的接口邏輯即可,非常方便:
代碼語言:java
復(fù)制
/*
* ntstreammediaengine.java
* created by daniusdk.com on 2017/04/19.
* wechat: xinsheng120
*/
package com.daniulive.smartpublisher;
public interface ntstreammediaengine {
void register_callback(callback callback);
void unregister_callback(callback callback);
void set_resolution_level(int level);
int get_resolution_level();
/*
* 啟動媒體投影
*/
boolean start_video_capture(int token_code, android.content.intent token_data);
boolean is_video_capture_running();
void stop_video_capture();
/*
* 啟動麥克風(fēng)
*/
boolean start_audio_record(int sample_rate, int channels);
boolean is_audio_record_running();
void stop_audio_record();
/*
* android 10及以上支持, android10以下設(shè)備調(diào)用直接返回false
* 需要有record_audio權(quán)限
* 要開啟媒體投影
*/
boolean start_audio_playback_capture(int sample_rate, int channels);
boolean is_audio_playback_capture_running();
void stop_audio_playback_capture();
/*
* 輸出的音頻類型
* 0: 不輸出音頻
* 1: 輸出麥克風(fēng)
* 2: 輸出audio playback(android 10及以上支持)
*/
boolean set_audio_output_type(int type);
int get_audio_output_type();
void set_fps(int fps);
void set_gop(int gop);
boolean set_video_encoder_type(int video_encoder_type);
int get_video_encoder_type();
/*
* 推送rtmp
*/
boolean start_rtmp_stream(string url);
boolean is_rtmp_stream_running();
string get_rtmp_stream_url();
void stop_rtmp_stream();
/*
* 啟動rtsp server, 需要設(shè)置端口,用戶名和密碼可選
*/
boolean start_rtsp_server(int port, string user_name, string password);
boolean is_rtsp_server_running();
void stop_rtsp_server();
/*
* 發(fā)布rtsp流
*/
boolean start_rtsp_stream(string stream_name);
boolean is_rtsp_stream_running();
string get_rtsp_stream_url();
void stop_rtsp_stream();
/*
* 啟動本地錄像
*/
boolean start_stream_record(string record_directory, int file_max_size);
boolean is_stream_recording();
void stop_stream_record();
boolean is_stream_running();
interface callback {
void on_nt_video_capture_stop();
void on_nt_rtsp_stream_url(string url);
}
}
如果對音視頻這塊相對了解的開發(fā)者,可以繼續(xù)到ntstreammediaprojectionengineimpl.java文件,查看或修改相關(guān)的技術(shù)實現(xiàn):
代碼語言:java
復(fù)制
/*
* ntstreammediaprojectionengineimpl.java
* created by daniusdk.com on 2017/04/19.
* wechat: xinsheng120
*/
package com.daniulive.smartpublisher;
import android.app.activity;
import android.app.application;
import android.app.service;
import android.content.context;
import android.content.intent;
import android.content.pm.packagemanager;
import android.graphics.point;
import android.graphics.rect;
import android.media.image;
import android.media.projection.mediaprojection;
import android.media.projection.mediaprojectionmanager;
import android.os.build;
import android.os.handler;
import android.os.handlerthread;
import android.os.process;
import android.util.log;
import android.util.size;
import android.view.surface;
import android.view.windowmanager;
import android.view.windowmetrics;
import com.eventhandle.ntsmarteventcallbackv2;
import com.eventhandle.ntsmarteventid;
import com.voiceengine.ntaudiorecordv2;
import com.voiceengine.ntaudiorecordv2callback;
import com.videoengine.ntmediaprojectioncapture;
import com.voiceengine.ntaudioplaybackcapture;
import java.lang.ref.weakreference;
import java.nio.bytebuffer;
import java.util.concurrent.copyonwritearraylist;
import java.util.concurrent.atomic.atomicreference;
public class ntstreammediaprojectionengineimpl implements autocloseable, ntstreammediaengine,
ntvirtualdisplaysurfacesinker.callback, ntmediaprojectioncapture.callback {
private static final string tag = "ntlogprojectionengine";
private static final size default_size = new size(1920, 1080);
public static final int resolution_low = 0;
public static final int resolution_medium = 1;
public static final int resolution_high = 2;
private final application application_;
private final long image_thread_id_;
private final long running_thread_id_;
private final handler image_handler_;
private final handler running_handler_;
private final windowmanager window_manager_;
private final mediaprojectionmanager projection_manager_;
private int screen_density_dpi_ = android.util.displaymetrics.density_default;
private final smartpublisherjniv2 lib_publisher_;
private final libpublisherwrapper.rtspserver rtsp_server_;
private final libpublisherwrapper stream_publisher_;
private final copyonwritearraylist<ntstreammediaengine.callback> callbacks_ = new copyonwritearraylist<>();
private final atomicreference<videosinkercapturepair> video_capture_pair_ = new atomicreference<>();
private final audiorecordcallbackimpl audio_record_callback_;
private final audioplaybackcapturecallbackimpl audio_playback_capture_callback_;
private final atomicreference<ntaudiorecordv2> audio_record_ = new atomicreference<>();
private final atomicreference<ntaudioplaybackcapture> audio_playback_capture_ = new atomicreference<>();
...
}
以android平臺rtmp推送模塊為例,我們主要實現(xiàn)了如下功能:
音頻編碼:aac/speex;
視頻編碼:h.264、h.265;
推流協(xié)議:rtmp;
[音視頻]支持純音頻/純視頻/音視頻推送;
[攝像頭]支持采集過程中,前后攝像頭實時切換;
支持幀率、關(guān)鍵幀間隔(gop)、碼率(bit-rate)設(shè)置;
支持rtmp推送 live|record模式設(shè)置;
支持前置攝像頭鏡像設(shè)置;
支持軟編碼、特定機型硬編碼;
支持橫屏、豎屏推送;
支持android屏幕采集推送;
支持自建標(biāo)準(zhǔn)rtmp服務(wù)器或cdn;
支持斷網(wǎng)自動重連、網(wǎng)絡(luò)狀態(tài)回調(diào);
支持實時動態(tài)水??;
支持實時快照;
支持降噪處理、自動增益控制;
支持外部編碼前音視頻數(shù)據(jù)對接;
支持外部編碼后音視頻數(shù)據(jù)對接;
支持rtmp擴展h.265(需設(shè)備支持h.265特定機型硬編碼)和enhanced rtmp;
支持實時音量調(diào)節(jié);
支持擴展錄像模塊;
支持unity接口;
支持h.264擴展sei發(fā)送模塊;
支持android 5.1及以上版本。
總結(jié)
智慧教室無紙化方案是一種具有廣泛應(yīng)用前景和發(fā)展?jié)摿Φ慕虒W(xué)解決方案。它不僅能夠提升教學(xué)質(zhì)量和學(xué)習(xí)效率,還能夠?qū)崿F(xiàn)綠色環(huán)保和可持續(xù)發(fā)展目標(biāo)。隨著信息技術(shù)的不斷發(fā)展和普及,智慧教室無紙化方案將會在未來的教育領(lǐng)域中發(fā)揮更加重要的作用。
智慧教室rtmp技術(shù)方案通過利用rtmp協(xié)議的實時性和低延遲特性,結(jié)合適當(dāng)?shù)慕M網(wǎng)、服務(wù)器部署、編碼轉(zhuǎn)碼、橫豎屏適配、補幀策略以及網(wǎng)絡(luò)穩(wěn)定性保障措施,為智慧教室場景下的實時授課、屏幕共享、互動教學(xué)等功能提供了強有力的技術(shù)支持。以上拋磚引玉,感興趣的開發(fā)者,可以單獨跟我溝通探討。
京東囤兵saas財務(wù)軟件 企業(yè)級市場現(xiàn)三國殺:顯然hr并不是京東的唯一開放賦能的產(chǎn)品,從hr到財務(wù)軟件再到行政辦公等產(chǎn)品,未來京東都會有所涉獵。京東要發(fā)布saas財務(wù)軟件?
京東為什么要從財務(wù)軟件切入?財務(wù)系統(tǒng)是內(nèi)外連接管理的關(guān)鍵,京東選擇從財務(wù)、hr等方面入局,除了可以避開同阿里和騰訊正面交鋒,還有其他深層的動因。
第一、京東財務(wù)系統(tǒng)有別于用友和金蝶等財務(wù)系統(tǒng),是基于京東內(nèi)部電商業(yè)務(wù)自主研發(fā)而成,有其獨特性和實踐性。
與傳統(tǒng)財務(wù)軟件有所不同,京東依托京東開放產(chǎn)品賦能,融合京東集團復(fù)雜業(yè)務(wù)場景下的最佳實踐,提供了涵蓋收支、結(jié)算、資金、票務(wù)、稅務(wù)、賬務(wù)在內(nèi)的整套解決方案,再對接企業(yè)內(nèi)部系統(tǒng)構(gòu)建企業(yè)自己的云業(yè)務(wù)生態(tài)。
拋開以上幾點原因外,京東還有其他的戰(zhàn)略布署:第一、從財務(wù)軟件試水,未來可能會輸出更多的云業(yè)務(wù)能力。包括人力資源、行政、協(xié)同辦公等等。第二、在云計算方面京東急需找到一個突破點。
蘋果被曝重大系統(tǒng)漏洞:新款 macbook、iphone 12、ipad pro 統(tǒng)統(tǒng)波及!root 權(quán)限秒獲取,隱私文件隨意看:看到這一幕,評論區(qū)的網(wǎng)友們也紛紛震驚:「啪的一下就執(zhí)行完了,很快啊?!埂杆f他是測試的,他可不是瞎測試的,終端,腳本,提權(quán),訓(xùn)練有素,后來他說他搞過好幾年安全。
就是啪的一下,明明系統(tǒng)說了不,該 app 仍然讀取到了相冊和通訊錄,并上傳到了攻擊者的服務(wù)器端。漏洞意味著什么?毫無疑問,這是第一個被發(fā)現(xiàn)的能影響蘋果 apple silicon 芯片設(shè)備的安全漏洞。
騰訊安全玄武實驗室就表示:理論上,任何惡意的 app 開發(fā)者都可以利用此漏洞。而且漏洞影響的設(shè)備,也不少。
一方面,騰訊安全玄武實驗室是全球頂尖的安全實驗室,能發(fā)現(xiàn)漏洞也是實力使然;另一方面,按照江湖規(guī)矩,在消息曝光前,玄武實驗室早已將漏洞技術(shù)細節(jié)報告給了蘋果安全團隊。
關(guān)于騰訊安全玄武實驗室最后,還是贅述補充下此次發(fā)現(xiàn)漏洞的安全大神團隊。關(guān)注安全領(lǐng)域的盆友,對騰訊安全玄武實驗室一定不會陌生。作為騰訊七大專業(yè)實驗室之一,于 2014 年成立。
敏捷畫卷:中國軟件史的精彩側(cè)影:以上內(nèi)容來自thoughtworks中國區(qū)總經(jīng)理張松為《敏捷中國史》所作的序。在這一系列課程中,作者熊節(jié)也用部分章節(jié)敘述了在thoughtworks與敏捷的不解之緣。
2005 年,被西安豐富的高校資源和高新區(qū)政府的熱情態(tài)度所吸引,thoughtworks 在西安軟件園落戶,目標(biāo)是服務(wù)中國本土客戶。
當(dāng)時臺下的聽眾一片茫然。由于政府主導(dǎo)的重點行業(yè)信息化工程固有的特點,在當(dāng)時絕大多數(shù)中國 it 業(yè)者的概念中,軟件項目就只有一次預(yù)算和一次交付(多發(fā)生在年初和年末)。
在早期的三個本地項目中,thoughtworks 與西安高新區(qū)政府和河北省地稅局的合作都出現(xiàn)了不愉快,為時不長即告結(jié)束,只有與廈門的私企好望角的合作持續(xù)了較長時間。
在時任 thoughtworks 中國區(qū)副總經(jīng)理郭曉的開場演講中,他一方面迎合了行業(yè)對成本的重視,列舉 forrester 的數(shù)據(jù)說明采用敏捷開發(fā)方法可以大幅節(jié)省軟件項目成本。
澳大利亞瘋狂計劃:把現(xiàn)實世界數(shù)字化:這是澳大利亞政府研究機構(gòu)csiro一項十年計劃的主要想法,該機構(gòu)向建造一個數(shù)字版的澳大利亞。
想要讓它成為現(xiàn)實,該研究團隊就必須找到一種將政府機構(gòu)、研究人員、私人企業(yè)和平民科學(xué)家提供的數(shù)據(jù)結(jié)合起來的方法,以便讓人們對各種不同體系(不論是水、能量、農(nóng)業(yè)、健康或者經(jīng)濟)如何與彼此溝通有更好的理解。
項目領(lǐng)導(dǎo)者jonathan yu表示:“我們從過去的項目里了解到跨學(xué)科研究方法是關(guān)鍵,但現(xiàn)在根本沒有數(shù)據(jù)基礎(chǔ)架構(gòu)?!?5年前,yu和lemon在塔斯馬尼亞島利用傳感器網(wǎng)絡(luò)和數(shù)據(jù)資源,從數(shù)據(jù)的角度來看待這座島嶼的狀態(tài)。該島嶼上的感應(yīng)器能實時監(jiān)測天氣、二氧化碳濃度、動物和養(yǎng)殖魚的健康以及水儲存與能量使用情況。
lemon說:“看到一個社區(qū)利用他們能得到的信息采取相應(yīng)措施,是一件很有趣的事情。對我而言這不過是oznome的牛刀小試而已?!?br>
轉(zhuǎn)載請注明出處,本站網(wǎng)址:
http://www.wikihumidifier.com/news_1766.html