自定义视频捕获原生webrtc

时间:2018-03-06 12:51:36

标签: c++ webrtc

根据webrtc讨论google cricket上的小组主题:: VideoCapture将很快被弃用。要自定义视频源,我们应该实现VideoTrackSourceInterface。我尝试实现接口,但没有工作。当我有一个框架然后调用事件OnFrame(const webrtc :: VideoFrame& frame)时,我实现了接口:

void StreamSource::OnFrame(const webrtc::VideoFrame& frame)
{
 rtc::scoped_refptr<webrtc::VideoFrameBuffer buffer(frame.video_frame_buffer());
 broadcaster_.OnFrame(frame);

} 在事件AddStreams()的conductor.cc中,我通过以下代码创建了一个视频源:

rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
peer_connection_factory_->CreateVideoTrack( kVideoLabel,new mystream::StreamSource()));

我的视频无法在浏览器中播放。我做错了什么?

3 个答案:

答案 0 :(得分:0)

我使用了基类AdaptedVideoTrackSource并且我创建了一个方法FrameCaptured它是从我的线程中调用的,我在这个方法中调用OnFrame方法。它工作得很好!!!

 class StreamSource : public rtc::AdaptedVideoTrackSource
 {
   void OnFrameCaptured(const webrtc::VideoFrame& frame);
 }

 void StreamSource::OnFrameCaptured(const webrtc::VideoFrame& frame) 
 {
  OnFrame(frame);
 }

答案 1 :(得分:0)

我在google group中得到了答案

VideoFrame具有枚举类型,例如:

class VideoFrameBuffer : public rtc::RefCountInterface {
 public:
  // New frame buffer types will be added conservatively when there is an
  // opportunity to optimize the path between some pair of video source and
  // video sink.
  enum class Type {
    kNative,
    kI420,
    kI420A,
    kI444,
    kI010,
  };
 ...
 }

然后,在创建视频帧时,将类型设置为kNative。 如果您找到其他好的方法,请分享。

答案 2 :(得分:0)

详细说明user1658843的答案: 创建一个自定义视频源类并定义所有抽象方法。这是一个例子:

dtplyr

和实现:

class CustomVideoSource : public rtc::AdaptedVideoTrackSource  {

public:
    void OnFrameCaptured(const webrtc::VideoFrame& frame);
    void AddRef() const override;
    rtc::RefCountReleaseStatus Release() const override;
    SourceState state() const override;
    bool remote() const override;
    bool is_screencast() const override;
    absl::optional<bool> needs_denoising() const override;
private:
    mutable volatile int ref_count_;
};

请记住,这只是为了使其正常运行,而不是完整的实现。您应该正确实现抽象方法,而不要返回硬编码值。 要发送框架,只需调用带有框架的OnFrameCaptured。

添加流:

void CustomVideoSource::OnFrameCaptured(const webrtc::VideoFrame& frame) {
  OnFrame(frame);
}

void CustomVideoSource::AddRef() const {
  rtc::AtomicOps::Increment(&ref_count_);
}

rtc::RefCountReleaseStatus CustomVideoSource::Release() const {
  const int count = rtc::AtomicOps::Decrement(&ref_count_);
  if (count == 0) {
    return rtc::RefCountReleaseStatus::kDroppedLastRef;
  }
  return rtc::RefCountReleaseStatus::kOtherRefsRemained;
}

webrtc::MediaSourceInterface::SourceState CustomVideoSource::state() const {
  return kLive;
}

bool CustomVideoSource::remote() const {
  return false;
}

bool CustomVideoSource::is_screencast() const {
  return false;
}

absl::optional<bool> CustomVideoSource::needs_denoising() const {
  return false;

我不是专家,而是自己做一个项目并逐步实施。请随时纠正我或添加此代码。

相关问题