国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式)

這篇具有很好參考價(jià)值的文章主要介紹了音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

本文主要介紹rtmp協(xié)議收流流程,在linux上搭建rtmp服務(wù)器,通過(guò)自研的rtmp收流庫(kù)發(fā)起取流請(qǐng)求,使用ffmpeg+qt實(shí)現(xiàn)視頻流的解碼與播放。

關(guān)于rtmp協(xié)議基礎(chǔ)介紹可查看:https://blog.csdn.net/www_dong/article/details/131026072

環(huán)境搭建

nginx-rtmp-module下載

# 下載地址,下載zip包即可
https://github.com/arut/nginx-rtmp-module

nginx編譯與安裝

  1. 下載nginx
# 下載地址
http://nginx.org/en/download.html
  1. 解壓,將nginx-rtmp-module拷貝至nginx-1.24.0目錄,如下所示:

音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式),音視頻學(xué)習(xí),音視頻,學(xué)習(xí),tcp/ip,rtmp

  1. 配置nginx編譯環(huán)境
# 步驟1
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 步驟2
yum -y install libxml2 libxml2-dev
yum -y install libxslt-devel
  1. 生成Makefile文件
# 在/home/rtmp/nginx-1.24.0下執(zhí)行如下命令
./configure --add-module=./nginx-rtmp-module-master --with-http_ssl_module --with-http_ssl_module --with-http_xslt_module --with-http_flv_module --with-debug --with-http_gzip_static_module
  1. 修改nginx.conf文件,進(jìn)入conf/文件夾下,編譯nginx.conf在末尾增加如下內(nèi)容:
rtmp {
    server {
        listen 1935;               #監(jiān)聽(tīng)端口,若被占用,可以更改
        chunk_size 4000;           #上傳flv文件塊兒的大小
        application live {         #創(chuàng)建一個(gè)叫l(wèi)ive的應(yīng)用
             live on;              #開(kāi)啟live的應(yīng)用
             allow publish 192.168.191.100;#192.168.191.100為服務(wù)器ip 
             allow play all;
        }
    }
}
  1. 編譯、安裝
# 在/home/rtmp/nginx-1.24.0下執(zhí)行如下命令
make
make install
  1. 啟動(dòng)nginx
# 測(cè)試配置文件
cd /usr/local/nginx
./sbin/nginx -t

# 有如下打印說(shuō)明配置正常
[root@localhost nginx]# ./sbin/nginx  -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

# 啟動(dòng)nginx
./sbin/nginx

# 查看是否正常啟動(dòng)
ps -aux | grep nginx
  1. 網(wǎng)頁(yè)訪(fǎng)問(wèn),出現(xiàn)如下內(nèi)容說(shuō)明啟動(dòng)成功

音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式),音視頻學(xué)習(xí),音視頻,學(xué)習(xí),tcp/ip,rtmp

ffmepg推流

  • 安裝ffmepg,將視頻文件拷貝至安裝路徑下,如圖所示:

音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式),音視頻學(xué)習(xí),音視頻,學(xué)習(xí),tcp/ip,rtmp

  • 執(zhí)行如下命令
ffmpeg -re -stream_loop -1 -i test.h264 -c copy -f flv rtmp://192.168.191.100:1935/live/testrtmp

以上步驟執(zhí)行完即完成rtmp服務(wù)器搭建。

設(shè)計(jì)

拉流流程

說(shuō)明:客戶(hù)端—自研的rtmp收流庫(kù),服務(wù)器—上述搭建的rtmp服務(wù)器

  • 客戶(hù)端發(fā)送tcp握手請(qǐng)求,和服務(wù)器完成tcp握手和rtmp握手;
  • 客戶(hù)端發(fā)送命令消息中的“連接”(connect)到服務(wù)器,請(qǐng)求與一個(gè)服務(wù)應(yīng)用實(shí)例建立連接;
  • 客戶(hù)端發(fā)送網(wǎng)絡(luò)連接命令的“創(chuàng)建流”(createStream)消息到服務(wù)端,以創(chuàng)建消息通信的邏輯通道。音頻、視頻和元數(shù)據(jù)的發(fā)布通過(guò)使用createStream命令創(chuàng)建的流通道執(zhí)行。服務(wù)端發(fā)送createStream的“應(yīng)答消息”(_result);
  • 客戶(hù)端發(fā)送網(wǎng)絡(luò)流命令中的“播放”(play)到服務(wù)端;
  • 服務(wù)端發(fā)送協(xié)議控制消息中的“設(shè)置塊大小”(Set Chunk Size)到客戶(hù)端設(shè)置chunk大小;
  • 服務(wù)器發(fā)送另一個(gè)協(xié)議控制消息(用戶(hù)控制),指定事件“StreamIsRecorded”和該消息中的流ID。消息在前2字節(jié)中攜帶事件類(lèi)型,在后4字節(jié)中攜帶流ID;
  • 服務(wù)端發(fā)送用戶(hù)控制消息中的“流開(kāi)始”(StreamBegin)消息到客戶(hù)端,通知客戶(hù)端流成功創(chuàng)建,可用于通信;
  • 如果客戶(hù)端發(fā)送的播放命令成功,則服務(wù)器發(fā)送onStatus命令消息NetStream.Play.Start和NetStream.Play.Reset。僅當(dāng)客戶(hù)端發(fā)送的播放命令設(shè)置了重置標(biāo)志時(shí),服務(wù)器才會(huì)發(fā)送NetStream.Play.Reset。如果未找到要播放的流,服務(wù)器將發(fā)送onStatus消息NetStream.Play.StreamNotFound;
  • 服務(wù)端發(fā)送音視頻數(shù)據(jù)到客戶(hù)端;

代碼設(shè)計(jì)

  1. 上層url解析
// rtmp://192.168.191.100:1935/live/testrtmp
// appName:"live"
// streamPath: "testrtmp"
// tcurl: "rtmp://192.168.191.100:1935/live"
int CRtmpTcpStreamReceiver::ParseUrl_(std::string& appName, std::string& streamPath, std::string& tcurl)
{
	if (m_rtmpUrl.empty())
		return -1;

	std::string url = m_rtmpUrl;
	std::string::size_type pos_0 = url.rfind("/");
	if (std::string::npos == pos_0)
		return -1;

	// "testrtmp"
	streamPath = url.substr(pos_0+1, url.length());
	// "rtmp://192.168.191.100:1935/live"
	tcurl = url.substr(0, pos_0);

	std::string tmpUrl = tcurl;
	std::string::size_type pos_1 = url.rfind("rtmp://");
	if (std::string::npos == pos_1)
		return -1;

	// ippUrl: "192.168.191.100:1935/live"
	std::string ippUrl = tmpUrl.substr(pos_1+7, tmpUrl.length());
	std::string::size_type pos_2 = ippUrl.rfind("/");
	if (std::string::npos == pos_2)
		return -1;

	// "live"
	appName = ippUrl.substr(pos_2+1, ippUrl.length());

	// "192.168.191.100:1935"
	std::string ipp = ippUrl.substr(0, pos_2);
	std::string::size_type pos_3 = ipp.rfind(":");
	if (std::string::npos == pos_3)
		return -1;

	m_rtmpIP = ipp.substr(0, pos_3);
	m_rtmpPort = atoi(ipp.substr(pos_3+1, ipp.length()).c_str());

	return 0;
}
  1. 開(kāi)始tcp握手和rtmp握手
int CRtmpTcpStreamReceiver::InitRtmpSession_()
{
    // rtmp url解析
	std::string appName = "", streamPath = "", turl = "";
	if (0 != ParseUrl_(appName, streamPath, turl))
	{
		return -1;
	}

	do
	{
        // tcp連接
		m_tcpClient = std::make_shared<ZDTcpClient>(nullptr, this);
		if (!m_tcpClient.get()
			|| 0 != m_tcpClient->TcpCreate()
			|| 0 != m_tcpClient->TcpConnect(m_rtmpIP.c_str(), m_rtmpPort)
			|| 0 != m_tcpClient->TcpSetNoBlock(false)
			|| 0 != m_tcpClient->TcpRecvTimeout(5))
		{
			break;
		}

        // CRtmpCommand為librtmp庫(kù)接口封裝類(lèi)
		m_command = std::make_shared<CRtmpCommand>(m_tcpClient, m_func, m_user);
		if (!m_command.get())
		{
			break;
		}

        // 創(chuàng)建接收實(shí)例
		if (0 != m_command->Create(appName, streamPath, turl)
			|| 0 != m_command->Start(1))
		{
			break;
		}

		return 0;
	} while (0);

	UnInitRtmpSession_();
	return -1;
}
  1. 啟動(dòng)線(xiàn)程接收數(shù)據(jù)
void CRtmpTcpStreamReceiver::RtmpWorker()
{
	std::shared_ptr<char> dataPacket(new char[RTMP_STREAM_DATA_SIZE], std::default_delete<char[]>());
	memset(dataPacket.get(), 0x00, RTMP_STREAM_DATA_SIZE);
	int recvLen = 0;

	while (m_running)
	{
        // tcp數(shù)據(jù)接收
		recvLen = m_tcpClient->TcpRecv(dataPacket.get(), RTMP_STREAM_DATA_SIZE);
		if (recvLen <= 0) 
		{
			continue;
		}

        // 塞數(shù)據(jù)
		if (0 != m_command->InputData(dataPacket.get(), recvLen))
		{
			break;
		}

		memset(dataPacket.get(), 0x00, RTMP_STREAM_DATA_SIZE);
	}
}

抓包

音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式),音視頻學(xué)習(xí),音視頻,學(xué)習(xí),tcp/ip,rtmp

效果

音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式),音視頻學(xué)習(xí),音視頻,學(xué)習(xí),tcp/ip,rtmp文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-773893.html

到了這里,關(guān)于音視頻學(xué)習(xí)(二十一)——rtmp收流(tcp方式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流

    Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流

    視頻畫(huà)面的采集主要是使用各個(gè)平臺(tái)提供的攝像頭 API 來(lái)實(shí)現(xiàn)的,在為攝像頭設(shè)置了合適的參數(shù)之后,將攝像頭實(shí)時(shí)采集的視頻幀渲染到屏幕上提供給用戶(hù)預(yù)覽,然后將該視頻幀傳遞給編碼通道,進(jìn)行編碼。 1. 權(quán)限配置 2. 打開(kāi)攝像頭 2.1 檢查攝像頭 public static void checkCameraSe

    2024年04月12日
    瀏覽(27)
  • Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流(2)

    Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流(2)

    配置好之后,檢查一下 AudioRecord 當(dāng)前的狀態(tài)是否可以進(jìn)行錄制,可以通過(guò) AudioRecord##getState 來(lái)獲取當(dāng)前的狀態(tài): STATE_UNINITIALIZED 還沒(méi)有初始化,或者初始化失敗了 STATE_INITIALIZED 已經(jīng)初始化成功了。 2. 開(kāi)啟采集 創(chuàng)建好 AudioRecord 之后,就可以開(kāi)啟音頻數(shù)據(jù)的采集了,可以通過(guò)調(diào)

    2024年04月12日
    瀏覽(21)
  • Android-音視頻學(xué)習(xí)系列-(八)基于-Nginx-搭建(rtmp、http)直播服務(wù)器

    Android-音視頻學(xué)習(xí)系列-(八)基于-Nginx-搭建(rtmp、http)直播服務(wù)器

    #!/bin/sh HTTP_FLV_MODULE_PATH=…/nginx-http-flv-module-1.2.7 OpenSSL_PATH=…/openssl-1.1.1d #–prefix=./bin 代表編譯完成之后輸出的路徑地址 #–add-module 將拓展模塊添加到當(dāng)前一起編譯 ./configure --prefix=./bin –add-module= H T T P F L V M O D U L E P A T H ? ? ? w i t h ? o p e n s s l = HTTP_FLV_MODULE_PATH --with

    2024年04月15日
    瀏覽(32)
  • 音視頻開(kāi)發(fā)---ffmpeg rtmp推流

    音視頻開(kāi)發(fā)---ffmpeg rtmp推流

    推流是將輸入視頻數(shù)據(jù)推送至流媒體服務(wù)器, 輸入視頻數(shù)據(jù)可以是本地視頻文件(avi,mp4,flv......),也可以是內(nèi)存視頻數(shù)據(jù),或者攝像頭等系統(tǒng)設(shè)備,也可以是網(wǎng)絡(luò)流URL。本篇介紹將本地視頻文件通過(guò)FFmpeg編程以RTMP直播流的形式推送至RTMP流媒體服務(wù)器的方法。 推流的網(wǎng)絡(luò)拓?fù)?/p>

    2024年02月16日
    瀏覽(34)
  • 【音視頻】基于NGINX如何播放rtmp視頻流

    【音視頻】基于NGINX如何播放rtmp視頻流

    現(xiàn)階段直播越來(lái)越流行,直播技術(shù)發(fā)展也越來(lái)越快。Webrtc、rtmp、rtsp是比較火熱的技術(shù),而且應(yīng)用也比較廣泛。本文通過(guò)實(shí)踐來(lái)展開(kāi)介紹關(guān)于rtmp如何播放。 本文重點(diǎn)介紹基于NGINX如何播放rtmp視頻流 可以參考上一篇博文:【音視頻】基于webrtc協(xié)議瀏覽器播放rtsp https://blog.csdn.n

    2024年01月19日
    瀏覽(32)
  • 音視頻開(kāi)發(fā) RTMP協(xié)議發(fā)送H.264編碼及AAC編碼的音視頻(C++實(shí)現(xiàn))

    音視頻開(kāi)發(fā) RTMP協(xié)議發(fā)送H.264編碼及AAC編碼的音視頻(C++實(shí)現(xiàn))

    RTMP(Real Time Messaging Protocol)是專(zhuān)門(mén)用來(lái)傳輸音視頻數(shù)據(jù)的流媒體協(xié)議,最初由Macromedia 公司創(chuàng)建,后來(lái)歸Adobe公司所有,是一種私有協(xié)議,主要用來(lái)聯(lián)系Flash Player和RtmpServer,如 FMS , Red5 , crtmpserver 等。RTMP協(xié)議可用于實(shí)現(xiàn)直播、點(diǎn)播應(yīng)用,通過(guò) FMLE(Flash Media Live Encoder) 推送音

    2023年04月08日
    瀏覽(29)
  • RK3568平臺(tái)開(kāi)發(fā)系列講解(音視頻篇)RTMP 推流

    RK3568平臺(tái)開(kāi)發(fā)系列講解(音視頻篇)RTMP 推流

    ??返回專(zhuān)欄總目錄 沉淀、分享、成長(zhǎng),讓自己和他人都能有所收獲!?? ??目前常見(jiàn)的視頻監(jiān)控和視頻直播都是使用了 RTMP 、 RTSP 、 HLS 、 MPEG-DASH 、 WebRTC 流媒體傳輸協(xié)議等。 RTSP (Real-Time Streaming Protocol):實(shí)時(shí)流傳輸協(xié)議,用于控制媒體服務(wù)器上的實(shí)時(shí)流傳輸,支持音頻

    2024年02月05日
    瀏覽(95)
  • 【秒懂音視頻開(kāi)發(fā)】26_RTMP服務(wù)器搭建

    【秒懂音視頻開(kāi)發(fā)】26_RTMP服務(wù)器搭建

    基本概念 流媒體(Streaming media),也叫做:流式媒體。 是指將一連串的多媒體數(shù)據(jù)壓縮后,經(jīng)過(guò)互聯(lián)網(wǎng) 分段發(fā)送 數(shù)據(jù),在互聯(lián)網(wǎng)上即時(shí)傳輸影音以供觀賞的一種技術(shù)與過(guò)程 此技術(shù)使得數(shù)據(jù)包可以像 流水 一樣發(fā)送,如果不使用此技術(shù),就必須得先 下載整個(gè) 媒體文件才能進(jìn)

    2023年04月08日
    瀏覽(23)
  • Android平臺(tái)音視頻推送選RTMP還是GB28181?

    Android平臺(tái)音視頻推送選RTMP還是GB28181?

    早在2015年,我們發(fā)布了RTMP直播推送模塊,那時(shí)候音視頻直播這塊場(chǎng)景需求,還不像現(xiàn)在這么普遍,我們做這塊的初衷,主要是為了實(shí)現(xiàn)移動(dòng)單兵應(yīng)急指揮系統(tǒng)的低延遲音視頻數(shù)據(jù)傳輸。好多開(kāi)發(fā)者可能會(huì)疑惑,走RTMP怎么可能低延遲?網(wǎng)上看到的RTMP推拉流延遲,總歸要2-3秒起

    2024年02月10日
    瀏覽(21)
  • 音視頻rtsp rtmp gb28181在瀏覽器上的按需拉流

    音視頻rtsp rtmp gb28181在瀏覽器上的按需拉流

    按需拉流是從客戶(hù)視角來(lái)看待音視頻的產(chǎn)品功能,直觀,好用,為啥hls flv大行其道也是這個(gè)原因,不過(guò)上述存在的問(wèn)題是延遲沒(méi)法降到實(shí)時(shí)毫秒級(jí)延遲,也不能隨心所欲的控制。通過(guò)一段時(shí)間的努力,結(jié)合自己閉環(huán)技術(shù)棧,實(shí)現(xiàn)了h264 h265 aac pcma pcmu等音視頻的rtmp rtsp gb28181地

    2024年02月06日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包