国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

wordpress幻燈片怎么建運(yùn)營(yíng)seo是什么意思

wordpress幻燈片怎么建,運(yùn)營(yíng)seo是什么意思,如何提高景區(qū)旅游網(wǎng)站建設(shè),鄭州網(wǎng)站建設(shè)套餐技術(shù)背景 在Android上實(shí)現(xiàn)RTSP服務(wù)器確實(shí)是一個(gè)不太常見(jiàn)的需求,因?yàn)锳ndroid平臺(tái)主要是為客戶(hù)端應(yīng)用設(shè)計(jì)的。在一些內(nèi)網(wǎng)場(chǎng)景下,我們更希望把安卓終端或開(kāi)發(fā)板,作為一個(gè)IPC(網(wǎng)絡(luò)攝像機(jī))一樣,對(duì)外提供個(gè)拉流的…

技術(shù)背景

在Android上實(shí)現(xiàn)RTSP服務(wù)器確實(shí)是一個(gè)不太常見(jiàn)的需求,因?yàn)锳ndroid平臺(tái)主要是為客戶(hù)端應(yīng)用設(shè)計(jì)的。在一些內(nèi)網(wǎng)場(chǎng)景下,我們更希望把安卓終端或開(kāi)發(fā)板,作為一個(gè)IPC(網(wǎng)絡(luò)攝像機(jī))一樣,對(duì)外提供個(gè)拉流的rtsp url,然后把攝像頭麥克風(fēng)甚至屏幕采集的數(shù)據(jù),共享出去,輕量級(jí)RTSP的設(shè)計(jì)理念脫穎而出。

輕量級(jí)RTSP服務(wù)設(shè)計(jì)初衷,就是避免用戶(hù)單獨(dú)部署RTSP或者RTMP服務(wù),實(shí)現(xiàn)本地的音視頻數(shù)據(jù)(如攝像頭、麥克風(fēng)),編碼后,匯聚到內(nèi)置RTSP服務(wù),對(duì)外提供可供拉流的RTSP URL,輕量級(jí)RTSP服務(wù),適用于內(nèi)網(wǎng)環(huán)境下,對(duì)并發(fā)要求不高的場(chǎng)景,支持H.264/H.265,支持RTSP鑒權(quán)、單播、組播模式,考慮到單個(gè)服務(wù)承載能力,我們支持同時(shí)創(chuàng)建多個(gè)RTSP服務(wù),并支持獲取當(dāng)前RTSP服務(wù)會(huì)話(huà)連接數(shù)。

如何實(shí)現(xiàn)RTSP服務(wù)器

如果你找不到合適的庫(kù),或者需要更高級(jí)的功能,你可以考慮編寫(xiě)自己的RTSP服務(wù)器:

  • 了解RTSP協(xié)議:首先,你需要深入了解RTSP協(xié)議的工作原理,包括其消息格式、會(huì)話(huà)管理和流控制機(jī)制。
  • 網(wǎng)絡(luò)編程:在Android上,你可以使用Java的Socket API來(lái)處理網(wǎng)絡(luò)通信,也可以直接底層實(shí)現(xiàn),然后對(duì)上提供jni的接口。你需要編寫(xiě)代碼來(lái)監(jiān)聽(tīng)端口、接收RTSP請(qǐng)求、解析請(qǐng)求并發(fā)送響應(yīng)。
  • 媒體處理:RTSP服務(wù)器需要能夠捕獲、編碼和傳輸媒體數(shù)據(jù)。你可以使用Android的Camera或Camera2的API來(lái)捕獲視頻,并使用FFmpeg或Android的MediaCodec API來(lái)實(shí)現(xiàn)音視頻數(shù)據(jù)編碼。
  • 多線(xiàn)程和并發(fā):RTSP服務(wù)器需要處理多個(gè)并發(fā)客戶(hù)端連接。你可以使用Java的線(xiàn)程或并發(fā)API來(lái)管理這些連接。

功能設(shè)計(jì)

一個(gè)完整的RTSP服務(wù),需要設(shè)計(jì)的功能如下:

  • ??[視頻格式]H.264/H.265(Android H.265硬編碼);
  • ?[音頻格式]G.711 A律、AAC;
  • 協(xié)議:RTSP;
  • ?[音量調(diào)節(jié)]Android平臺(tái)采集端支持實(shí)時(shí)音量調(diào)節(jié);
  • ?[H.264硬編碼]支持H.264特定機(jī)型硬編碼;
  • ?[H.265硬編碼]支持H.265特定機(jī)型硬編碼;
  • [音視頻]支持純音頻/純視頻/音視頻;
  • [攝像頭]支持采集過(guò)程中,前后攝像頭實(shí)時(shí)切換;
  • 支持幀率、關(guān)鍵幀間隔(GOP)、碼率(bit-rate)設(shè)置;
  • [實(shí)時(shí)水印]支持動(dòng)態(tài)文字水印、png水印;
  • [實(shí)時(shí)快照]支持實(shí)時(shí)快照;
  • [降噪]支持環(huán)境音、手機(jī)干擾等引起的噪音降噪處理、自動(dòng)增益、VAD檢測(cè);
  • [外部編碼前視頻數(shù)據(jù)對(duì)接]支持YUV數(shù)據(jù)對(duì)接;
  • [外部編碼前音頻數(shù)據(jù)對(duì)接]支持PCM對(duì)接;
  • [外部編碼后視頻數(shù)據(jù)對(duì)接]支持外部H.264、H.265數(shù)據(jù)對(duì)接;
  • [外部編碼后音頻數(shù)據(jù)對(duì)接]外部AAC數(shù)據(jù)對(duì)接;
  • [擴(kuò)展錄像功能]支持和錄像SDK組合使用,錄像相關(guān)功能。?
  • 支持RTSP端口設(shè)置;
  • 支持RTSP鑒權(quán)用戶(hù)名、密碼設(shè)置;
  • 支持獲取當(dāng)前RTSP服務(wù)會(huì)話(huà)連接數(shù);
  • 支持Android?5.1及以上版本。

接口設(shè)計(jì)

Android內(nèi)置輕量級(jí)RTSP服務(wù)SDK接口詳解

調(diào)用描述

接口

接口描述

SmartRTSPServerSDK

初始化RTSP Server

InitRtspServer

Init rtsp server(和UnInitRtspServer配對(duì)使用,即便是啟動(dòng)多個(gè)RTSP服務(wù),也只需調(diào)用一次InitRtspServer,請(qǐng)確保在OpenRtspServer之前調(diào)用)

創(chuàng)建一個(gè)rtsp server

OpenRtspServer

創(chuàng)建一個(gè)rtsp server,返回rtsp server句柄

設(shè)置端口

SetRtspServerPort

設(shè)置rtsp server 監(jiān)聽(tīng)端口, 在StartRtspServer之前必須要設(shè)置端口

設(shè)置鑒權(quán)用戶(hù)名、密碼

SetRtspServerUserNamePassword

設(shè)置rtsp server 鑒權(quán)用戶(hù)名和密碼, 這個(gè)可以不設(shè)置,只有需要鑒權(quán)的再設(shè)置

獲取rtsp server當(dāng)前會(huì)話(huà)數(shù)

GetRtspServerClientSessionNumbers

獲取rtsp server當(dāng)前的客戶(hù)會(huì)話(huà)數(shù), 這個(gè)接口必須在StartRtspServer之后再調(diào)用

啟動(dòng)rtsp server

StartRtspServer

啟動(dòng)rtsp server

停止rtsp server

StopRtspServer

停止rtsp server

關(guān)閉rtsp server

CloseRtspServer

關(guān)閉rtsp server

UnInit rtsp server

UnInitRtspServer

UnInit rtsp server(和InitRtspServer配對(duì)使用,即便是啟動(dòng)多個(gè)RTSP服務(wù),也只需調(diào)用一次UnInitRtspServer)

SmartRTSPServerSDK供Publisher調(diào)用的接口

設(shè)置rtsp的流名稱(chēng)

SetRtspStreamName

設(shè)置rtsp的流名稱(chēng)

給要發(fā)布的rtsp流設(shè)置rtsp server

AddRtspStreamServer

給要發(fā)布的rtsp流設(shè)置rtsp server, 一個(gè)流可以發(fā)布到多個(gè)rtsp server上,rtsp server的創(chuàng)建啟動(dòng)請(qǐng)參考OpenRtspServer和StartRtspServer接口

清除設(shè)置的rtsp server

ClearRtspStreamServer

清除設(shè)置的rtsp server

啟動(dòng)rtsp流

StartRtspStream

啟動(dòng)rtsp流

停止rtsp流

StopRtspStream

停止rtsp流

調(diào)用邏輯

以大牛直播SDK的Android平臺(tái)Camera2對(duì)接為例,先初始化RTSP Server,啟動(dòng)RTSP服務(wù),然后發(fā)布RTSP流即可,如果需要停止RTSP服務(wù),那么先停止RTSP流,再停止RTSP服務(wù)即可:

/** MainActivity.java* Author: daniusdk.com* WeChat: xinsheng120*/
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);...context_ = this.getApplicationContext();libPublisher = new SmartPublisherJniV2();libPublisher.InitRtspServer(context_);      //和UnInitRtspServer配對(duì)使用,即便是啟動(dòng)多個(gè)RTSP服務(wù),也只需調(diào)用一次InitRtspServer,請(qǐng)確保在OpenRtspServer之前調(diào)用
}

啟動(dòng)、停止RTSP服務(wù):

//啟動(dòng)/停止RTSP服務(wù)
class ButtonRtspServiceListener implements View.OnClickListener {public void onClick(View v) {if (isRTSPServiceRunning) {stopRtspService();btnRtspService.setText("啟動(dòng)RTSP服務(wù)");btnRtspPublisher.setEnabled(false);isRTSPServiceRunning = false;return;}Log.i(TAG, "onClick start rtsp service..");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)!");}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è)置的端口是否被占用!");}btnRtspService.setText("停止RTSP服務(wù)");btnRtspPublisher.setEnabled(true);isRTSPServiceRunning = true;}}
}

stopRtspService()實(shí)現(xiàn)如下:

//停止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;}
}

發(fā)布、停止RTSP流:

//發(fā)布/停止RTSP流
class ButtonRtspPublisherListener implements View.OnClickListener {public void onClick(View v) {if (stream_publisher_.is_rtsp_publishing()) {stopRtspPublisher();btnRtspPublisher.setText("發(fā)布RTSP流");btnGetRtspSessionNumbers.setEnabled(false);btnRtspService.setEnabled(true);return;}Log.i(TAG, "onClick start rtsp publisher..");InitAndSetConfig();String rtsp_stream_name = "stream1";stream_publisher_.SetRtspStreamName(rtsp_stream_name);stream_publisher_.ClearRtspStreamServer();stream_publisher_.AddRtspStreamServer(rtsp_handle_);if (!stream_publisher_.StartRtspStream()) {stream_publisher_.try_release();Log.e(TAG, "調(diào)用發(fā)布rtsp流接口失敗!");return;}startAudioRecorder();startLayerPostThread();btnRtspPublisher.setText("停止RTSP流");btnGetRtspSessionNumbers.setEnabled(true);btnRtspService.setEnabled(false);}
}

stopRtspPublisher()實(shí)現(xiàn)如下:

//停止發(fā)布RTSP流
private void stopRtspPublisher() {stream_publisher_.StopRtspStream();stream_publisher_.try_release();if (!stream_publisher_.is_publishing())stopAudioRecorder();
}

其中,InitAndSetConfig()實(shí)現(xiàn)如下,通過(guò)調(diào)研SmartPublisherOpen()接口,生成推送實(shí)例句柄。

/** MainActivity.java* Author: daniusdk.com*/
private void InitAndSetConfig() {if (null == libPublisher)return;if (!stream_publisher_.empty())return;Log.i(TAG, "InitAndSetConfig video width: " + video_width_ + ", height" + video_height_ + " imageRotationDegree:" + cameraImageRotationDegree_);int audio_opt = 1;long handle = libPublisher.SmartPublisherOpen(context_, audio_opt, 3,  video_width_, video_height_);if (0==handle) {Log.e(TAG, "sdk open failed!");return;}Log.i(TAG, "publisherHandle=" + handle);int fps = 25;int gop = fps * 3;initialize_publisher(libPublisher, handle, video_width_, video_height_, fps, gop);stream_publisher_.set(libPublisher, handle);
}

對(duì)應(yīng)的initialize_publisher()實(shí)現(xiàn)如下,設(shè)置軟硬編碼、幀率、關(guān)鍵幀間隔等。

private boolean initialize_publisher(SmartPublisherJniV2 lib_publisher, long handle, int width, int height, int fps, int gop) {if (null == lib_publisher) {Log.e(TAG, "initialize_publisher lib_publisher is null");return false;}if (0 == handle) {Log.e(TAG, "initialize_publisher handle is 0");return false;}if (videoEncodeType == 1) {int kbps = LibPublisherWrapper.estimate_video_hardware_kbps(width, height, fps, true);Log.i(TAG, "h264HWKbps: " + kbps);int isSupportH264HWEncoder = lib_publisher.SetSmartPublisherVideoHWEncoder(handle, kbps);if (isSupportH264HWEncoder == 0) {lib_publisher.SetNativeMediaNDK(handle, 0);lib_publisher.SetVideoHWEncoderBitrateMode(handle, 1); // 0:CQ, 1:VBR, 2:CBRlib_publisher.SetVideoHWEncoderQuality(handle, 39);lib_publisher.SetAVCHWEncoderProfile(handle, 0x08); // 0x01: Baseline, 0x02: Main, 0x08: High// lib_publisher.SetAVCHWEncoderLevel(handle, 0x200); // Level 3.1// lib_publisher.SetAVCHWEncoderLevel(handle, 0x400); // Level 3.2// lib_publisher.SetAVCHWEncoderLevel(handle, 0x800); // Level 4lib_publisher.SetAVCHWEncoderLevel(handle, 0x1000); // Level 4.1 多數(shù)情況下,這個(gè)夠用了//lib_publisher.SetAVCHWEncoderLevel(handle, 0x2000); // Level 4.2// lib_publisher.SetVideoHWEncoderMaxBitrate(handle, ((long)h264HWKbps)*1300);Log.i(TAG, "Great, it supports h.264 hardware encoder!");}} else if (videoEncodeType == 2) {int kbps = LibPublisherWrapper.estimate_video_hardware_kbps(width, height, fps, false);Log.i(TAG, "hevcHWKbps: " + kbps);int isSupportHevcHWEncoder = lib_publisher.SetSmartPublisherVideoHevcHWEncoder(handle, kbps);if (isSupportHevcHWEncoder == 0) {lib_publisher.SetNativeMediaNDK(handle, 0);lib_publisher.SetVideoHWEncoderBitrateMode(handle, 1); // 0:CQ, 1:VBR, 2:CBRlib_publisher.SetVideoHWEncoderQuality(handle, 39);// libPublisher.SetVideoHWEncoderMaxBitrate(handle, ((long)hevcHWKbps)*1200);Log.i(TAG, "Great, it supports hevc hardware encoder!");}}boolean is_sw_vbr_mode = true;//H.264 software encoderif (is_sw_vbr_mode) {int is_enable_vbr = 1;int video_quality = LibPublisherWrapper.estimate_video_software_quality(width, height, true);int vbr_max_kbps = LibPublisherWrapper.estimate_video_vbr_max_kbps(width, height, fps);lib_publisher.SmartPublisherSetSwVBRMode(handle, is_enable_vbr, video_quality, vbr_max_kbps);}if (is_pcma_) {lib_publisher.SmartPublisherSetAudioCodecType(handle, 3);} else {lib_publisher.SmartPublisherSetAudioCodecType(handle, 1);}lib_publisher.SetSmartPublisherEventCallbackV2(handle, new EventHandlerPublisherV2().set(handler_, record_executor_));lib_publisher.SmartPublisherSetSWVideoEncoderProfile(handle, 3);lib_publisher.SmartPublisherSetSWVideoEncoderSpeed(handle, 2);lib_publisher.SmartPublisherSetGopInterval(handle, gop);lib_publisher.SmartPublisherSetFPS(handle, fps);// lib_publisher.SmartPublisherSetSWVideoBitRate(handle, 600, 1200);boolean is_noise_suppression = true;lib_publisher.SmartPublisherSetNoiseSuppression(handle, is_noise_suppression ? 1 : 0);boolean is_agc = false;lib_publisher.SmartPublisherSetAGC(handle, is_agc ? 1 : 0);int echo_cancel_delay = 0;lib_publisher.SmartPublisherSetEchoCancellation(handle, 1, echo_cancel_delay);return true;
}

發(fā)布RTSP流成功后,會(huì)回調(diào)上來(lái)可供拉流的RTSP URL:

private static class EventHandlerPublisherV2 implements NTSmartEventCallbackV2 {@Overridepublic void onNTSmartEventCallbackV2(long handle, int id, long param1, long param2, String param3, String param4, Object param5) {switch (id) {...case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_RTSP_URL:publisher_event = "RTSP服務(wù)URL: " + param3;break;}}
}

獲取RTSP Session會(huì)話(huà)數(shù):

//獲取RTSP會(huì)話(huà)數(shù)
class ButtonGetRtspSessionNumbersListener implements View.OnClickListener {public void onClick(View v) {if (libPublisher != null && rtsp_handle_ != 0) {int session_numbers = libPublisher.GetRtspServerClientSessionNumbers(rtsp_handle_);Log.i(TAG, "GetRtspSessionNumbers: " + session_numbers);PopRtspSessionNumberDialog(session_numbers);}}
}//當(dāng)前RTSP會(huì)話(huà)數(shù)彈出框
private void PopRtspSessionNumberDialog(int session_numbers) {final EditText inputUrlTxt = new EditText(this);inputUrlTxt.setFocusable(true);inputUrlTxt.setEnabled(false);String session_numbers_tag = "RTSP服務(wù)當(dāng)前客戶(hù)會(huì)話(huà)數(shù): " + session_numbers;inputUrlTxt.setText(session_numbers_tag);AlertDialog.Builder builderUrl = new AlertDialog.Builder(this);builderUrl.setTitle("內(nèi)置RTSP服務(wù)").setView(inputUrlTxt).setNegativeButton("確定", null);builderUrl.show();
}

onDestroy() 的時(shí)候,調(diào)研UnInitRtspServer()即可:

@Override
protected void onDestroy() {Log.i(TAG, "activity destory!");stopAudioRecorder();stopRtspPublisher();stopRtspService();isRTSPServiceRunning = false;stream_publisher_.release();if (libPublisher != null)libPublisher.UnInitRtspServer();      //如已啟用內(nèi)置服務(wù)功能(InitRtspServer),調(diào)用UnInitRtspServer, 注意,即便是啟動(dòng)多個(gè)RTSP服務(wù),也只需調(diào)用UnInitRtspServer一次stopLayerPostThread();if (camera2Helper != null) {camera2Helper.release();}super.onDestroy();
}

總結(jié)

Android上實(shí)現(xiàn)RTSP服務(wù)器是一個(gè)極具挑戰(zhàn)的任務(wù),功能設(shè)計(jì)這塊,除了需要支持接編碼前音視頻數(shù)據(jù)外,還需要支持對(duì)接編碼后音視頻數(shù)據(jù),并實(shí)現(xiàn)本地錄像、快照等功能組合使用。需要注意的是,就像???、大華的攝像頭一樣,對(duì)外的并發(fā),一般限于4-8個(gè),Android設(shè)備的性能一般來(lái)說(shuō),可能不足以處理高負(fù)載的RTSP服務(wù)器,但是小并發(fā)模式下,能穩(wěn)定的運(yùn)行,就達(dá)到設(shè)計(jì)初衷了,感興趣的開(kāi)發(fā)者,可以單獨(dú)跟單獨(dú)探討。

http://aloenet.com.cn/news/30043.html

相關(guān)文章:

  • 不正規(guī)網(wǎng)站制作seo博客模板
  • 網(wǎng)頁(yè)設(shè)計(jì)網(wǎng)站鏈接怎么做公司網(wǎng)站推廣
  • 浦東網(wǎng)站建設(shè)公司網(wǎng)絡(luò)營(yíng)銷(xiāo)網(wǎng)站
  • 有什么免費(fèi)ppt模板網(wǎng)站好用的搜索引擎有哪些
  • dw怎樣去除網(wǎng)站做的頁(yè)面模板網(wǎng)站運(yùn)營(yíng)及推廣方案
  • 淘寶網(wǎng)站建設(shè)基本流程圖萬(wàn)網(wǎng)域名查詢(xún)接口
  • 手機(jī)網(wǎng)站制作與建設(shè)百度收錄網(wǎng)址提交
  • 今日軍事新聞聯(lián)播在線(xiàn)播放長(zhǎng)沙百度快照優(yōu)化排名
  • 優(yōu)質(zhì)網(wǎng)站建設(shè)報(bào)價(jià)長(zhǎng)沙seo網(wǎng)站優(yōu)化
  • 國(guó)外扁平化網(wǎng)站企業(yè)培訓(xùn)計(jì)劃方案
  • 建設(shè)類(lèi)似衣聯(lián)網(wǎng)的網(wǎng)站整合營(yíng)銷(xiāo)名詞解釋
  • php做的網(wǎng)站怎么上傳網(wǎng)站推廣優(yōu)化
  • h5網(wǎng)站制作費(fèi)用關(guān)鍵字c語(yǔ)言
  • 模擬網(wǎng)站建設(shè)平臺(tái)推廣是做什么的
  • 可以自己做效果圖的網(wǎng)站小程序自助搭建平臺(tái)
  • 學(xué)生做網(wǎng)站期末作業(yè)新產(chǎn)品推廣方案怎么寫(xiě)
  • 做空氣開(kāi)關(guān)那個(gè)網(wǎng)站推廣比較好百度廣告聯(lián)盟app
  • 天津企業(yè)網(wǎng)站模板建站哪家好搜索自媒體平臺(tái)
  • 網(wǎng)站建設(shè)后的效果評(píng)估sem是什么意思啊
  • wordpress插件 地圖北京做網(wǎng)絡(luò)優(yōu)化的公司
  • 做網(wǎng)站推廣多少錢(qián)百度銷(xiāo)售系統(tǒng)
  • 柳州市黨風(fēng)廉政建設(shè)網(wǎng)站專(zhuān)注網(wǎng)站建設(shè)服務(wù)機(jī)構(gòu)
  • 青海報(bào)社網(wǎng)站建設(shè)公司百度在線(xiàn)問(wèn)答
  • 做的網(wǎng)站怎么放視頻如何做網(wǎng)站的教程
  • 網(wǎng)站建設(shè)一點(diǎn)通口碑營(yíng)銷(xiāo)是什么
  • 企業(yè)移動(dòng)網(wǎng)站建設(shè)商百度賬號(hào)登陸
  • 小程序設(shè)計(jì)開(kāi)發(fā)國(guó)內(nèi)seo公司排名
  • 免費(fèi)做電腦網(wǎng)站網(wǎng)站視頻
  • 零基礎(chǔ)怎么開(kāi)網(wǎng)店seo短視頻網(wǎng)頁(yè)入口引流下載
  • wordpress多賬號(hào)權(quán)限天津seo優(yōu)化