1.基本線(xiàn)程
webrtc中擁有有兩個(gè)全局線(xiàn)程,使用webrtc時(shí)可以提供這兩個(gè)線(xiàn)程,也可以使用內(nèi)部創(chuàng)建好的線(xiàn)程:
- signaling_thread-->信令線(xiàn)程。要求此線(xiàn)程內(nèi)的方法都必須快速返回
- worker_thread-->工作者線(xiàn)程。此線(xiàn)程內(nèi)的方法可能會(huì)處理很長(zhǎng)時(shí)間
其中,所有API調(diào)用都會(huì)被代理到信令線(xiàn)程,所有回調(diào)函數(shù)都在信令線(xiàn)程調(diào)用,所以回調(diào)函數(shù)不能執(zhí)行長(zhǎng)時(shí)間阻塞操作。應(yīng)當(dāng)將嚴(yán)重小號(hào)資源的過(guò)程放在工作者線(xiàn)程執(zhí)行,如數(shù)據(jù)流傳輸。
2.線(xiàn)程實(shí)現(xiàn)
webrtc的線(xiàn)程中包含一個(gè)消息隊(duì)列,當(dāng)需要在此線(xiàn)程中運(yùn)行邏輯時(shí),只需要向線(xiàn)程中發(fā)送一個(gè)消息,線(xiàn)程部分類(lèi)圖如下:
20150623120430554.jpg
可以看到線(xiàn)程類(lèi)繼承了消息隊(duì)列類(lèi),也就擁有消息隊(duì)列的所有特性,而消息又包含有消息需要傳遞的數(shù)據(jù)和消息處理函數(shù)。
3.MediaStream API(mediastreaminterface.h)
主要是MediaStreamTrack接口和MediaStream接口
- MediaStreamTrack接口,代表來(lái)自瀏覽器的一種媒體資源,就像視屏資源或是音頻資源一樣
- MediaStream接口,可以打包一系列媒體資源成為一個(gè)整體,可以被記錄或者在媒體元素中渲染處理
其中,每一個(gè)MediaStream對(duì)象可以包含零個(gè)或者多個(gè)MediaStreamTrack對(duì)象,這些Track對(duì)象都會(huì)被同步渲染。
MediaStream對(duì)象有一個(gè)輸入和一個(gè)輸出,它可以合并所有輸入或輸出的Track媒體資源,一個(gè)MediaStream對(duì)象也可以同時(shí)被關(guān)聯(lián)到多個(gè)輸出。
3.1 MediaStream類(lèi)
- MediaStream的構(gòu)造函數(shù)可以合并一系列Track媒體資源,然后將這些媒體資源存儲(chǔ)在一個(gè)track set中,其中track的順序是瀏覽器定義的,唯一能找到一個(gè)track對(duì)象的方法就是去查看它的id
- MediaStream對(duì)象的消費(fèi)者就是去讀取這個(gè)對(duì)象數(shù)據(jù)的對(duì)象,如媒體標(biāo)簽<video>和<audio>,RTCPeerConnection對(duì)象等。
其接口定義如下:
class MediaStreamInterface : public rtc::RefCountInterface,
public NotifierInterface {
public:
virtual std::string label() const = 0;
virtual AudioTrackVector GetAudioTracks() = 0;
virtual VideoTrackVector GetVideoTracks() = 0;
virtual rtc::scoped_refptr<AudioTrackInterface>
FindAudioTrack(const std::string& track_id) = 0;
virtual rtc::scoped_refptr<VideoTrackInterface>
FindVideoTrack(const std::string& track_id) = 0;
virtual bool AddTrack(AudioTrackInterface* track) = 0;
virtual bool AddTrack(VideoTrackInterface* track) = 0;
virtual bool RemoveTrack(AudioTrackInterface* track) = 0;
virtual bool RemoveTrack(VideoTrackInterface* track) = 0;
protected:
virtual ~MediaStreamInterface() {}
};
其實(shí)可以把這個(gè)類(lèi)理解為MediaStreamTrack媒體資源類(lèi)的容器,可以合并視頻資源和音頻資源,并可以對(duì)媒體資源進(jìn)行增刪改查操作,同時(shí)它也是一個(gè)觀察者。
3.2 MediaStreamTrack類(lèi)
MediaStreamTrack類(lèi)代表了瀏覽器中的媒體通道。
- 生命周期
一個(gè)MediaStreamTrack對(duì)象有兩個(gè)狀態(tài):live和ended, 一個(gè)新創(chuàng)建的MediaStreamTrack對(duì)象的狀態(tài)依賴(lài)于它是怎么被創(chuàng)建的,當(dāng)前的狀態(tài)反映在它的readyState屬性中,當(dāng)track處于live狀態(tài)時(shí),這個(gè)媒體資源是可以被消費(fèi)者使用的。
其接口定義如下:
class MediaStreamTrackInterface : public rtc::RefCountInterface,
public NotifierInterface {
public:
//傳輸軌道狀態(tài)
enum TrackState {
kLive, //媒體通道可用
kEnded, //媒體通道不可用
};
static const char kAudioKind[];
static const char kVideoKind[];
// 當(dāng)傳輸音頻軌道時(shí)返回kAudioKind,由瀏覽器定義
// 當(dāng)傳輸視頻軌道時(shí)返回kVideoKind,由瀏覽器定義
//通常可以用來(lái)將其父類(lèi)對(duì)象轉(zhuǎn)化為響應(yīng)的子類(lèi)對(duì)象
virtual std::string kind() const = 0;
// 讀取軌道的唯一標(biāo)識(shí)
virtual std::string id() const = 0;
//判斷軌道是否可用,當(dāng)音頻軌道不可用時(shí),將會(huì)靜音;當(dāng)視頻軌道不可用時(shí),將會(huì)黑屏
virtual bool enabled() const = 0;
//開(kāi)啟或關(guān)閉媒體軌道
virtual bool set_enabled(bool enable) = 0;
// 讀取軌道當(dāng)前狀態(tài),kLive或kEnded,軌道終止后將不能被重新激活
virtual TrackState state() const = 0;
protected:
//為多態(tài)基類(lèi)聲明一個(gè)虛析構(gòu)函數(shù)
virtual ~MediaStreamTrackInterface() {}
};
- VideoTrackInterface類(lèi)
表示視頻軌道,繼承自類(lèi)MediaStreamTrackInterface,可以設(shè)置和獲取視頻渲染器
其接口如下:
class VideoTrackInterface
: public MediaStreamTrackInterface,
public rtc::VideoSourceInterface<VideoFrame> {
public:
//視頻軌道內(nèi)容提示,如這個(gè)視頻是包含運(yùn)動(dòng)的視頻,還是包含細(xì)節(jié)的視頻
enum class ContentHint { kNone, kFluid, kDetailed };
//設(shè)置視頻接收器,來(lái)將視頻通道和視頻播放器連接起來(lái)
void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
const rtc::VideoSinkWants& wants) override {}
//移除視頻接收器
void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override {}
//獲取視頻來(lái)源對(duì)象
virtual VideoTrackSourceInterface* GetSource() const = 0;
//獲取視頻內(nèi)容提示
virtual ContentHint content_hint() const { return ContentHint::kNone; }
//設(shè)置視頻內(nèi)容
virtual void set_content_hint(ContentHint hint) {}
protected:
//為多態(tài)基類(lèi)聲明一個(gè)虛析構(gòu)函數(shù)
virtual ~VideoTrackInterface() {}
};
- AudioTrackInterface類(lèi)
表示音頻軌道,繼承自類(lèi)MediaStreamTrackInterface,可以設(shè)置和獲取視頻接收器
其接口同VideoTrackInterface類(lèi)
class AudioTrackInterface : public MediaStreamTrackInterface {
public:
virtual AudioSourceInterface* GetSource() const = 0;
virtual void AddSink(AudioTrackSinkInterface* sink) = 0;
virtual void RemoveSink(AudioTrackSinkInterface* sink) = 0;
//獲取信號(hào)電平(強(qiáng)度),這里有錯(cuò)誤,修改后會(huì)返回int類(lèi)型
virtual bool GetSignalLevel(int* level) { return false; }
//獲取音頻處理器
virtual rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() {
return nullptr;
}
protected:
virtual ~AudioTrackInterface() {}
};
PS:組合和聚合的關(guān)系
- 組合
部分和整體之間具有相同的生命周期,當(dāng)整體消亡后,部分也將消亡。C++代碼中,部分類(lèi)在整體類(lèi)的構(gòu)造函數(shù)中被構(gòu)造,在析構(gòu)函數(shù)中被析構(gòu) - 聚合
部分和整體之間沒(méi)有相同的生命周期,當(dāng)整體消亡后,部分也可以獨(dú)立存在。C++代碼中,整體類(lèi)用指針來(lái)保存部分類(lèi),當(dāng)整體類(lèi)析構(gòu)的時(shí)候,部分類(lèi)并不會(huì)析構(gòu)