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

基于Live555實(shí)現(xiàn)數(shù)據(jù)流的推送

這篇具有很好參考價(jià)值的文章主要介紹了基于Live555實(shí)現(xiàn)數(shù)據(jù)流的推送。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

總述

Live555是使用c++編寫的RTSP開源庫(kù),以文件為載體進(jìn)行推流,其中實(shí)現(xiàn)了多種類型的音頻以及視頻的流化。

簡(jiǎn)述RTSP

RTSP是一種媒體傳輸協(xié)議,基于TCP協(xié)議,主要功能為媒體播放的控制以及開始連接時(shí)的握手操作。時(shí)間流傳輸走的時(shí)RTP協(xié)議,流傳輸控制協(xié)議走的是RTCP,RTP和RTCP具體使用TCP還是UDP,有RTSP SETUP階段根據(jù)客戶端選擇而定。

實(shí)現(xiàn)自定義數(shù)據(jù)流傳輸

首先實(shí)現(xiàn)一個(gè)比較通用的MediaSubsession,繼承OnDemandServerMediaSubsession

class ComMediaSubsession:public OnDemandServerMediaSubsession 
{
	public:
		static ComMediaSubsession* createNew(UsageEnvironment& env, int streamType, int videoType, int channelNO, 
				bool reuseFirstSource, portNumBits initalNumPort = 6970);
	protected:
		ComMediaSubsession(UsageEnvironment& env, int streamType, int videoType, int channelNO, 
				bool reuseFirstSource, portNumBits initalNumPort);
		~ComMediaSubsession();
		
	protected:
		// virtual function  new source and rtplink
		FramedSource* createNewStreamSource(unsigned clientsessionId, unsigned& estBitrate);
		RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource);
	
	public:
		int fStreamType;
		int fVideoType;
		int fChannelNO;
		
};
#include "ComMediaSubsession.h"
#include "ComFrameSource.h"
#include "H264VideoStreamFramer.hh"
#include "H264VideoRTPSink.hh"
#include "MP3ADURTPSink.hh"
#include "MPEG1or2AudioRTPSink.hh"


ComMediaSubsession::ComMediaSubsession(UsageEnvironment& env, int streamType, int videoType, int channelNO, bool reuseFirstSource, portNumBits initalNumPort)
	:OnDemandServerMediaSubsession(env, reuseFirstSource), fStreamType(streamType), fVideoType(videoType), fChannelNO(channelNO)
{
}

ComMediaSubsession::~ComMediaSubsession()
{

}


ComMediaSubsession* DemoH264MediaSubsession::createNew(UsageEnvironment& env, int streamType, int videoType, int channelNO, 
		bool reuseFirstSource, portNumBits initalNumPort)
{
	ComMediaSubsession* sms = new ComMediaSubsession(env, streamType, videoType, channelNO, reuseFirstSource, initalNumPort);
	return sms;
}


FramedSource* ComMediaSubsession::createNewStreamSource(unsigned clientsessionId, unsigned& estBitrate)
{
	if(fVideoType == 0x01)
	{ 
	    // H264 video 
		estBitrate = 2000; // kbps 
		ComFrameSource * source = ComFrameSource::createNew(envir(), fStreamType, fChannelNO, 0);
		if ( source == NULL )
		{
			DBG_LIVE555_PRINT("create source failed videoType:%d!\n", fVideoType );
			return NULL;
		}
		return H264VideoStreamFramer::createNew(envir(), source);
	}
	else if ( fVideoType == 0x2) 
	{   
	    // Mpeg-4 video  
	    estBitrate = 128; // kbps 
		ComFrameSource * source = ComFrameSource::createNew(envir(), fStreamType, fChannelNO, 1);
		if ( source == NULL )
		{
			DBG_LIVE555_PRINT("create source failed videoType:%d!\n", fVideoType );
			return NULL;
		}
		return source;
	}
	return NULL;	
}


RTPSink* ComMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource)
{
	if( fVideoType == 0x01)
	{
	    // H264 video
		return H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);
		
	}
	else if( fVideoType == 0x02)
	{ 
	    //  Mpeg-4
		return MP3ADURTPSink::createNew(envir(), rtpGroupsock,rtpPayloadTypeIfDynamic);
	}
    return NULL;
}

接著實(shí)現(xiàn)數(shù)據(jù)獲取類文章來源地址http://www.zghlxwxcb.cn/news/detail-523330.html

#include "FramedSource.hh"

class ComFrameSource:public FramedSource 
{
	public:
		static ComFrameSource* createNew(UsageEnvironment& env, int streamtype, int channelno, int sourceType); 
	protected:
		ComFrameSource(UsageEnvironment& env, long sourceHandle, int sourceType);
		~ComFrameSource();
	private:
		virtual void doGetNextFrame();
	public:
		void doStopGetFrame();
	public:
		unsigned fLastBufSize;
		unsigned fLeftDataSize;
		int fSourceType;
		int fFirstFrame;
		
};


#include "ComFrameSource.h"

ComFrameSource::ComFrameSource(UsageEnvironment& env,  int sourceType):
	FramedSource(env), fLastBufSize(0), fLeftDataSize(0), fSourceType(sourceType), fFirstFrame(1)
{
 
}


ComFrameSource::~ComFrameSource()
{ 

}


ComFrameSource* ComFrameSource::createNew(UsageEnvironment& env, int streamType, int channelNO, int sourceType)
{
	
	return new ComFrameSource(env, sourceType);
	
}



void ComFrameSource::doGetNextFrame()
{
	int ret = 0;

    /*實(shí)現(xiàn)獲取數(shù)據(jù)到fTo,最大fMaxSize*/
	ret = getStreamData(fSourceHandle, (char *)fTo, fMaxSize);
	if (ret <= 0)
	{
	    fFrameSize = 0;
		nextTask() = envir().taskScheduler().scheduleDelayedTask(10,
				  (TaskFunc*)FramedSource::afterGetting, this);
		return;
	}

	gettimeofday(&fPresentationTime, NULL);
	
	
	// Switch to another task, and inform the reader that he has data:
	nextTask() = envir().taskScheduler().scheduleDelayedTask(10,
				  (TaskFunc*)FramedSource::afterGetting, this);



}

void ComFrameSource::doStopGetFrame()
{

}


到了這里,關(guān)于基于Live555實(shí)現(xiàn)數(shù)據(jù)流的推送的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • live555交叉編譯(ubuntu+arm平臺(tái))

    1.下載源碼 ??????http://live555.com/liveMedia/public/live555-latest.tar.gz 2.解壓 tar -zxvf live555-latest.tar.gz 3.修改配置文件 1)進(jìn)入live文件夾 2)復(fù)制一份配置文件 cp config.armlinux config.myarmlinux chmod 777 config.myarmlinux 3) vim config.myarmlinux 命令行-刪除全部配置 4) 修改為 5.編譯執(zhí)行

    2024年02月05日
    瀏覽(20)
  • 探討下live555用的編程設(shè)計(jì)模式

    探討下live555用的編程設(shè)計(jì)模式

    這個(gè)應(yīng)該放到這里 7.live555mediaserver-第1階段小結(jié)(完整對(duì)象圖和思維導(dǎo)圖) https://blog.csdn.net/yhb1206/article/details/127330771 但是想想,還是拿出來吧。 從這第1階段就能發(fā)現(xiàn),它實(shí)質(zhì)用到了reactor網(wǎng)絡(luò)編程模式,具體點(diǎn)是 單Reactor服務(wù)器模型 。 該文章說的很不錯(cuò)。Reactor模式介紹ht

    2024年02月09日
    瀏覽(17)
  • Live555 C++ arm linux64 RTSP推流開發(fā)

    Live555 C++ arm linux64 RTSP推流開發(fā)

    由于不能apt-get install,所以先官網(wǎng)下載源碼。http://www.live555.com/liveMedia/ 解壓 tar -zxvf live.2023.07.24.tar.gz 安裝可以看這篇博文前部 live555server環(huán)境搭建 OpenSSL必須安裝 安裝時(shí)如果直接在arm板子上裝,生成makefile時(shí)就直接寫 不能寫成armlinux 如果選成了armlinux,這樣make的時(shí)候用的就是

    2024年02月03日
    瀏覽(22)
  • 從0-1一起學(xué)習(xí)live555設(shè)計(jì)思想之二 RTSP交互過程

    從0-1一起學(xué)習(xí)live555設(shè)計(jì)思想之二 RTSP交互過程

    本篇文章通過代碼去分析rtsp交互過程與工作原理。由于live555的繼承關(guān)系太過復(fù)雜,所以做了個(gè)圖簡(jiǎn)單記錄一下與h264文件傳輸相關(guān)的類繼承關(guān)系。 OPTION比較簡(jiǎn)單,就是客戶端向服務(wù)端請(qǐng)求可用的方法。服務(wù)端收到客戶端發(fā)來的OPTION指令后,調(diào)用函數(shù)handleCmd_OPTIONS

    2024年02月12日
    瀏覽(17)
  • 使用Flink實(shí)現(xiàn)Kafka到MySQL的數(shù)據(jù)流轉(zhuǎn)換:一個(gè)基于Flink的實(shí)踐指南

    使用Flink實(shí)現(xiàn)Kafka到MySQL的數(shù)據(jù)流轉(zhuǎn)換:一個(gè)基于Flink的實(shí)踐指南

    在現(xiàn)代數(shù)據(jù)處理架構(gòu)中,Kafka和MySQL是兩種非常流行的技術(shù)。Kafka作為一個(gè)高吞吐量的分布式消息系統(tǒng),常用于構(gòu)建實(shí)時(shí)數(shù)據(jù)流管道。而MySQL則是廣泛使用的關(guān)系型數(shù)據(jù)庫(kù),適用于存儲(chǔ)和查詢數(shù)據(jù)。在某些場(chǎng)景下,我們需要將Kafka中的數(shù)據(jù)實(shí)時(shí)地寫入到MySQL數(shù)據(jù)庫(kù)中,本文將介紹

    2024年04月15日
    瀏覽(24)
  • rk3588/rk356x/rv1109/rv1126 live555移植+mpp編譯 rtsp拉流

    rk3588/rk356x/rv1109/rv1126 live555移植+mpp編譯 rtsp拉流

    本文主要是為了記錄一下rk板子的踩坑日記。 項(xiàng)目主要是rk3588 rtsp拉流。 1.下載MPP源碼:https://github.com/rockchip-linux/mpp 2.rk3588/rk356x的板子進(jìn)入Mpp源碼目錄 mpp/build/linux/aarch64 (rk3588/rk356x是64位板子)中,修改 arm.linux.cross.cmake 文件中的配置 修改 make-Makefiles.bash 的配置,主要改

    2023年04月19日
    瀏覽(41)
  • 【3D 圖像分割】基于 Pytorch 的 VNet 3D 圖像分割2(基礎(chǔ)數(shù)據(jù)流篇)

    構(gòu)建 pytorch 訓(xùn)練模型讀取的數(shù)據(jù),是有模版可以參考的,是有套路的,這點(diǎn)相信使用過的人都知道。我也會(huì)給出一個(gè)套路的模版,方便學(xué)習(xí)和查詢。 同時(shí),也可以先去參考學(xué)習(xí)之前的一篇較為簡(jiǎn)單的 3D 分類任務(wù)的數(shù)據(jù)構(gòu)建方法,鏈接在這里:【3D圖像分類】基于Pytorch的3D立體

    2024年02月05日
    瀏覽(22)
  • 軟件工程:數(shù)據(jù)流圖,智能汽車代碼功能實(shí)現(xiàn)(Java)

    軟件工程:數(shù)據(jù)流圖,智能汽車代碼功能實(shí)現(xiàn)(Java)

    簡(jiǎn)介 開閉原則 軟件實(shí)現(xiàn)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,其含義是說一個(gè)軟件實(shí)體應(yīng)該通過擴(kuò)展來實(shí)現(xiàn)變化,而不是通過修改已有的代碼來實(shí)現(xiàn)變化的 智能汽車中,確定汽車的加速/減速 速度接口 速度實(shí)現(xiàn)抽象為父類 速度控制,子類ControlRpm繼承抽象父類 如果不使用開閉原則

    2023年04月23日
    瀏覽(25)
  • 全減器---Verilog實(shí)現(xiàn)(結(jié)構(gòu)描述,數(shù)據(jù)流描述,行為描述,層次結(jié)構(gòu)描述)

    全減器---Verilog實(shí)現(xiàn)(結(jié)構(gòu)描述,數(shù)據(jù)流描述,行為描述,層次結(jié)構(gòu)描述)

    全減器真值表—引用知乎:鏈接: 全減器真值表怎么理解 代碼部分 原理圖 代碼部分 原理圖 代碼部分 原理圖 代碼部分 原理圖

    2024年02月12日
    瀏覽(24)
  • 微信小程序-接入sse數(shù)據(jù)流并實(shí)現(xiàn)打字機(jī)效果( ChatGPT )

    微信小程序-接入sse數(shù)據(jù)流并實(shí)現(xiàn)打字機(jī)效果( ChatGPT )

    從流中獲取的數(shù)據(jù)格式如下 小程序調(diào)用SSE接口 我這邊接收到的數(shù)據(jù)類型為Uint8Array,需要處理成text文本(如上圖) 使對(duì)話有打字機(jī)效果 參考自:小程序?qū)崿F(xiàn) ChatGPT 聊天打字兼自動(dòng)滾動(dòng)效果 完整代碼

    2024年04月09日
    瀏覽(55)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包