编码类相关
通过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()
类似音频相关介绍: