webrtc部分视频类

编码类相关

通过VideoEngineImpl分别继承 ViEBaseImpl,ViECodecImpl,ViECaptureImpl,ViERenderImpl等来实现所有继承的类。
编码部分在ViECodecImpl分支,调用ViEEncoder的实例,ViEEncoder类中调用VideoCodingModule实例,VideoCodingModule调用VideoSender实例,而VideoSender调用VCMGenericEncoder实例,VCMGenericEncoder调用VideoEncoder实例。
而VideoEncoder实例为H264Encoder实例、VP9Encoder实例、VP8Encoder实例中的一个,这些类又分别对应自己的实现类,在其中实现具体的编码器。

编码相关类

在VideoEngine类中

VideoEngine* VideoEngine::Create() {
return new VideoEngineImpl(new Config(), true /* owns_config */);
}

所以,创建视频相关所有对象的方法如下:

_videoEngine = VideoEngine::Create();
_vieBase = ViEBase::GetInterface(_videoEngine);
_vieCapture = ViECapture::GetInterface(_videoEngine);
_vieRTPRTCP = ViERTP_RTCP::GetInterface(_videoEngine);
_vieRender = ViERender::GetInterface(_videoEngine);
_vieCodec = ViECodec::GetInterface(_videoEngine);
_vieNetwork = ViENetwork::GetInterface(_videoEngine);
_vieFile=ViEFile::GetInterface(_videoEngine);
_vieImageProc = ViEImageProcess::GetInterface(_videoEngine);

采集到编码

VideoCaptureAndroid.java 的 onPreviewFrame(),调用ProvideCameraFrame()。
video_capture_android.cc文件中int32_t VideoCaptureAndroid::OnIncomingFrame(),调用int32_t VideoCaptureAndroid::OnIncomingFrame(),调用IncomingFrame()。
video_capture_impl.cc 文件中 int32_t VideoCaptureImpl::IncomingFrame(),调用int32_t VideoCaptureImpl::DeliverCapturedFrame(),调用void ViECapturer::OnIncomingCapturedFrame()。
bool ViECapturer::ViECaptureProcess()函数中处理capture_event_,当有新的帧来时,则触发事件。
调用void ViECapturer::DeliverI420Frame(),做一些色彩等方面的前处理。
调用void ViEFrameProviderBase::DeliverFrame(),这里分别对应render和encoder,即将视频帧分别给到渲染和编码器。
对于编码器:调用void ViEEncoder::DeliverFrame(),会做丢帧和重采样的处理,后面调用流程从上图中可以清晰看清楚。
对于渲染:调用void ViERenderer::DeliverFrame(),后面与ViEEncoder及以后类似。

onPreviewFrame()
->int32_t VideoCaptureAndroid::OnIncomingFrame()
->int32_t VideoCaptureAndroid::OnIncomingFrame()
-> int32_t VideoCaptureImpl::IncomingFrame()
->int32_t VideoCaptureImpl::DeliverCapturedFrame()
->void ViECapturer::OnIncomingCapturedFrame()
|||||
->bool ViECapturer::ViECaptureProcess()
->void ViECapturer::DeliverI420Frame()
->void ViEFrameProviderBase::DeliverFrame()
->void ViEEncoder::DeliverFrame()或者void ViERenderer::DeliverFrame()

对于ViEEncoder::DeliverFrame()之后:

int32_t AddVideoFrame()
->int32_t VideoSender::AddVideoFrame //有丢帧处理
->int32_t VCMGenericEncoder::Encode()
->int H264EncoderImpl::Encode()


类似音频相关介绍:

http://www.jianshu.com/p/e88aec0d1de1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,497评论 0 17
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,230评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • 原创日记(213)2017.09.21 晴 日记记录我生活的婆婆妈妈。 幸福生活黑茶永相伴! 早上起来就开始收拾,...
    黑金公主阅读 375评论 0 0