# rtmp分析
RtmpPlayer播放器类
继承自
PlayerBase(播放器基类,主要处理播放的开始,暂停,停止,相关信息的获取,以及视频显示以及音频播放回调函数的设置)
TcpClient(网络连接基类,负责网络连接断开与数据的发送接收)
RtmpProtocol(rtmp协议类,主要处理rtmp握手以及rtmp数据的发送与接收)
RtmpPlayer从服务器收到数据的解析流程
1.首先是TcpClient的回调函数onRecv
void RtmpPlayer::onRecv(const Buffer::Ptr &pBuf){
try {
onParseRtmp(pBuf->data(), pBuf->size());
} catch (exception &e) {
SockException ex(Err_other, e.what());
_onPlayResult(ex);
_onShutdown(ex);
teardown();
}
}
2.交给RtmpProtocol,onParseRtmp来处理,这里巧妙地使用了回调函数来实现我握手阶段
void RtmpProtocol::onParseRtmp(const char *pcRawData, int iSize) {
m_strRcvBuf.append(pcRawData, iSize);
auto cb = m_nextHandle;
cb();
}
3.握手结束后交给handle_rtmp处理正事
handle_rtmp 交给handle_rtmpChunk
handle_rtmpChunk交给onRtmpChunk
onRtmpChunk收到数据后判断是命令还是音视频
如果是音视频,则由_onMediaData处理
void _onMediaData(const RtmpPacket::Ptr &chunkData) {
m_mediaTicker.resetTime();
onMediaData(chunkData);
}
onMediaData交给inputRtmp处理
void onMediaData(const RtmpPacket::Ptr &chunkData) override {
if(m_parser){
m_parser->inputRtmp(chunkData);
}
}
inputRtmp->inputVideo(->inputAudio)
inputVideo达到一帧后_onGetH264
_onGetH264->onGetH264
onVideo->onVideo
onVideo就是我们要自己实现的回调函数,他的参数是一个h264视频帧,我们只需要负责显示这个视频帧就可以了
以上是视频的,音频同理