webRTC學(xué)習(xí)筆記(二)

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容