根据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()));
我的视频无法在浏览器中播放。我做错了什么?
答案 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;
我不是专家,而是自己做一个项目并逐步实施。请随时纠正我或添加此代码。