webrtc音视频解析流程分析

webrtc音视频解析流程包括多个线程:

1. rtp网络流接收线程(rtp stream reciever thread)

2. 音视频解码线程(decode thread)

3. 渲染线程(render thread)

rtp网络流接收线程(rtp stream reciever thread):

接收网络rtp包,解析rtp包,得到音视频数据包。将解析出的rtp包,加入到RtpStreamReceiver::frame_buffer_中或最终加入VCMReceiver::jitter_buffer_,解码线程从frame_buffer_或jitter_buffer_中取出帧进行解码。

涉及类:RtpStreamReceiver(rtp_stream_receiver.cc), VideoReceiveStream(video_receive_stream.cc)

函数调用流程:

VideoReceiveStream::DeliverRtp() =>

rtp_stream_receiver_.DeliverRtp (rtp_stream_receiver.cc) =>

RtpStreamReceiver::ReceivePacket(rtp_stream_reciver.cc) =>

rtp_receiver_->IncomingRtpPacket(rtp_receiver_impl.cc) =>

rtp_media_receiver_->ParseRtpPacket(rtp_receiver_video.cc) =>

  1. depacketizer->Parse(rtp_format_h264.cc) 解析出payload_type, 如sps和pps等。
  2. data_callback_->OnReceivedPayloadData(rtp_stream_reciver.cc) =>

     a)  if(h264) InsertSpsPpsIntoTracker

    packet_buffer_->InsertPacket

     b) video_receiver_->IncomingPacket(video_receiver.cc) =>

     _receiver.InsertPacket (receiver.cc) =>

上面a)和b)步骤是或关系,

a)步骤:

packet_buffer_->InsertPacket(packet_buffer.cc) =>

received_frame_callback_->OnReceivedFrame(rtp_stream_receiver.cc) =>

reference_finder->ManageFrame(rtp_frame_reference_finder.cc) =>

RtpFrameReferenceFinder::ManageFrame =>

a) RtpFrameReferenceFinder::ManageFrameGeneric =>

b) RtpFrameReferenceFinder::ManageFrameV8=>RtpFrameReferenceFinder::CompletedFrameV8 =>

c) RtpFrameReferenceFinder::ManageFrameV9=>RtpFrameReferenceFinder::CompletedFrameV9 =>

frame_callback_->OnCompleteFrame =>

complete_frame_callback_->OnCompleteFrame =>

frame_buffer_->InsertFrame

b)步骤:

_receiver.InsertPacket(receiver.cc) =>

jitter_buffer_.InsertPacket(jitter_buffer.cc) =>

decodable_frames_->InsertFrame(jitter_buffer.cc)

成员说明:

rtp_receiver_: RtpReceiver, 子类RtpReceiverImpl。

rtp_media_receiver_:RTPReceiverStrategy指针,子类是RTPReceiverAudio和RTPReceiverVideo。

data_callback: RtpData, 子类RtpStreamReceiver。

video_receiver_:VideoReceiver。

packet_buffer_: PacketBuffer。

_receiver: VCMReceiver。

received_frame_callback_: 类RtpStreamReceiver,实现video_coding::OnReceivedFrameCallback。

reference_finder_: 类RtpFrameReferenceFinder。

frame_callback_: 类RtpStreamReceiver,实现video_coding::OnCompleteFrameCallback。

complete_frame_callback_:类VideoReceiveStream, 实现video_coding::OnCompleteFrameCallback。

视频解码线程(video decode thread):

从RtpStreamReceiver::frame_buffer_中读取每一帧进行解码。

涉及类:VideoReceiveStream(video_receive_stream.cc)

函数调用流程:

VideoReceiveStream::Decode(video_receive_stream.cc) =>

  video_receiver_->Decode(video_receiver.cc) =>

    1. _codecDataBase.GetDecoder(frame, _decodedFrameCallback) =>

      ptr_decoder_->RegisterDecodeCompleteCallback(_decodedFrameCallback)

    2. if (frame_buffer_->NextFrame) video_receiver_.Decode(frame) (从frame_buffer_取帧)

      else video_receiver_.Decode(kMaxDecodeWaitTimeMs) (从jitter_buffer_取帧) =>

        _receiver.FrameForDecoding(取帧) =>

        jitter_buffer_.NextCompleteFrame

      _deocoder->Decode() (_decoder是具体的decoder,如h264)=>      

      decoded_image_callback_->Decoded(generic_decoder.cc) =>

      _receiveCallback->FrameToRender(video_stream_decoder.cc) =>

      incoming_video_stream_->OnFrame(incoming_video_stream.cc) =>

      render_buffers_->AddFrame(incoming_video_stream.cc)

  rtp_stream_receiver_->FrameDecoded(统计)

成员说明:

video_receiver_:VideoReceiver。

_decodedFrameCallback: 类VCMDecodedFrameCallback。

_receiveCallback: 类VCMReceiveCallback,子类VideoStreamDecoder。

incoming_video_stream_:  rtc::VideoSinkInterface<VideoFrame>*,子类IncomingVideoStream, WebRtcVideoReceiveStream。

渲染线程(render thread):

渲染线程从IncomingVideoStream::render_buffers_ 中读取帧,发送出去。

涉及类:IncomingVideoStream

IncomingVideoStream::IncomingVideoStreamProcess(incoming_video_stream.cc) =>

1. render_buffers_->FrameToRender() =>

2. external_callback_->OnFrame (在VideoReceiveStream::Start 中设置为VideoReceiveStream) =>

config_.renderer->OnFrame (video_receive_stream.cc, WebRtcVideoReceiveStream构造函数中设置config_.render 为自己, 最终传递给VideoReceiveStream::config_)=>

sink_->OnFrame

sink设置:

PeerConnection::CreateVideoReceiver(peerconnection.cc) =>

VideoRtpReceiver::VideoRtpReceiver(rtpreceiver.cc) =>

channel_->SetSink(broadcaster_) =>

WebRtcVideoChannel2::SetSink(ssrc, sink) =>

receive_streams_[ssrc]->SetSink(sink)(最终设置WebRtcVideoReceiveStream::sink_)

成员说明:

render_buffers_:std::list<VideoRenderFrames>

external_callback_: rtc::VideoSinkInterface<VideoFrame>*。

sink_: rtc::VideoSinkInterface<webrtc::VideoFrame>*, 通过WebRtcVideoReceiveStream::SetSink设置。

broadcaster_: rtc::VideoBroadcaster,继承VideoSinkInterface<webrtc::VideoFrame>,broadcast video frames to sinks 。

receive_streams_: std::map<uint32_t, WebRtcVideoReceiveStream*>。

时间: 2024-07-30 10:15:44

webrtc音视频解析流程分析的相关文章

Android WebRTC 音视频开发总结

www.cnblogs.com/lingyunhu/p/3621057.html 前面介绍了WebRTCDemo的基本结构,本节主要介绍WebRTC音视频服务端的处理,,转载请说明出处(博客园RTC.Blacker). 通过前面的例子我们知道运行WebRTCDemo即可看到P2P的效果,实际应用中我们不可能让用户自己去里面设置对方的IP和音视频端口, 而且即使设置了对方的IP和端口也不一定能运行起来,因为P2P如果双方不在同一个网段则还需穿透NAT,那服务端具体该如何部署呢? 1.信令服务: 想

ffmpeg转码MPEG2-TS的音视频同步机制分析

http://blog.chinaunix.net/uid-26000296-id-3483782.html 一.FFmpeg忽略了adaptation_field()数据FFmpeg忽略了包含PCR值的adaptation_filed数据; 代码(libavformat/mpegts.c)分析如下: /* 解析TS包 */int handle_packet(MpegTSContext *ts, const uint8_t *packet){  ...   pid = AV_RB16(packe

转:?Android IOS WebRTC 音视频开发总结 (系列文章集合)

随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). callstats是一家做实时通讯性能测阅读全文 posted @ 2016-07-22 08:24

Android IOS WebRTC 音视频开发总结(二四)

本文主要分析webrtc音视频点对点部分的代码结构,文章来自博客园RTC.Blacker,转载请说明出处. 前段时间在查一个偶尔断线的问题(这种问题最蛋疼,不好重现,只能凭经验去搞),所以理了下webrtc的P2P代码结构,总结如下: 先来张图显示实际会话过程中的两种通讯路径:P2P或转发,92%的情况下是通过P2P实现. 注意:实际通讯过程中每个客户端都会不停地发送和接收Stun包,这样做是为了维护响应的连接和端口. 实际通讯过程中的核心组件为P2PTransportChannel,他代表着本

Android IOS WebRTC 音视频开发总结(六八)-- Google: What&#39;s next for WebRTC

本文主要从用户,公司和技术角度分析美女视频直播这个行业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help Justion和Sarah是google webrtc项目的主要负责人,下面的图片是根据他们分享的内容进行整理的,涉及webrtc进展.优化等方方面面.整理这些资料的过程中我们发现他们对待webrtc还是挺用心的,为webrtc的完善做了很多的工作,谢谢他们! 原始视频时长53分13秒,全英文的,所以我们考虑做

Android WebRTC 音视频开发总结(五)

这几天用WebRTC做了个视频监控的功能,分享出来,供想了解这方面内容的朋友参考. 一.基本模块: 1.视频采集端:相当于是客户端,用来采集视频,只需要发送视频,不需要接收. 2.视频监控端:接收采集端传入的视频数据,相当于监控客户端,不需要发送视频数据给客户端. 3.服务端:负责客户端注册.信令控制.数据包转发.UDP打洞等,支持TCP,UDP连接. 二.环境要求: 1.两台Andorid4.0 以上的手机,分别做采集端和监控端. 2.一台PC 做服务端. 3.PC.手机在同一个局域网内.理论

Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). 回顾:Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上) 连接网络摄像头 正如上文所提,我们选用一款简单的D-Link DCS-7010L网络摄像头.关键原因在于它支持RTSP协议,因此服务

Android WebRTC 音视频开发总结(一)

Android WebRTC 音视频开发总结(一) https://github.com/gandg/webrtc-ios 接触Android WebRTC有一段时间了,现在将研究过程中的一些经验和知识总结出来,希望大家有所帮助.本章主要介绍下面四点: 一.WebRTC是什么? WebRTC是Google提供的一个跨平台的音视频开源解决方案,旨在使其成为音视频通讯的标准.其实在Google将WebRTC开源之前,微软和苹果各自的通讯产品已占用很大市场份额(如Skype),估计Google也是为了

Android IOS WebRTC 音视频开发总结(六)

前段时间在搞IOS的音视频版本,所以将标题改为了Android IOS WebRTC 音视频开发总结, 下面总结一下开发过程中的一些经验: 1. IOS WebRTC音视频编译和下载: 有过android WEBRTC编译下载经验再去弄IOS,你会发现简单多了,再有问题,可以参考:http://www.cnblogs.com/ProbeStar/p/3411510.html  记住有MAC和IOS两个版本,要指定好你想要哪个版本. 2. 正确区分armv7 armv7s i386平台: 编译的时