From 71b4cffe509144824d2828a486808e1ee962849d Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Tue, 16 May 2017 15:02:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3rtsp=E8=BD=ACrtmp=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=88=B3=E5=9B=9E=E7=8E=AF=E5=A4=B1=E6=AD=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/.DS_Store | Bin 0 -> 10244 bytes src/Rtsp/RtspToRtmpMediaSource.cpp | 94 ++++++++++++++++++----------- src/Rtsp/RtspToRtmpMediaSource.h | 2 + 3 files changed, 62 insertions(+), 34 deletions(-) create mode 100644 src/.DS_Store diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..320f0b1e55a9d28ad8c528d0025748d440833c19 GIT binary patch literal 10244 zcmeHMTWl0n82ifbNz+c2>G~Z$ z0zLvh0zLvh0zLva1_HEavm(tC(yx64d<1+1W)NWChcG=%Mm;$tB>!|!#g70aE2*0o z`c3BmZWH!o)RR*}a#QjtP7mmrqIbkVVNT;=rcN^I$tfX)IiN5H^dh5oLO~v#?800f zFe;>9`v~|5lq0~-?o|*28#K_1&hKm?b^>!7tn@5C&6F1RpSqW4>go(z2yTcg+s*g~~gIs=~BsiMsKNh<;4 zWS1%S&ND02t%MykhjiI2SXQ&@CC8jm?^fhua?~^&x25Gv3{+HB&6z97vLw%!9*mFJ zV{td(W}VJNW-o6Unx6E257@Rj^E;8;W$0tWYF*5>+=OB2nF95FgNCKqW1V)^(j4xm zKjDs$Ee|xTE|{2TkF0GD-`(Ce*&Lo|UmIx-x3)zlCnc$VdF0-n{ps=>~+`OZrp`ksF zopEE_*|4f+9esyRzKopSMIOmjEsM5&l(}(s=^2M)W3)x&CZD;vKD4aq&NXfKL^n@Y zt2MQ^)G5jydJ~pw95D3E&M`xCM|LNilx}H;b#O3eI7ZUc2dqR|ufb+no?ftUQFU-} z@b>&rsfnaEN<-PCaX4$Z)h&w6Q)>uzOVVyOvPsi)O=^s`3Gf=DP2LY7 z05~eL$~N~Uumaj?GarBh^znEUPQqz83+Lf|_yoRyZ{afh41d6%@E2S~KpAVW9vg5e zF2m(`7q($LZom%g#s_c*#&H-&(7;1z;$b|B6F7;-@Hn2tC-EtK8lS_{_%gnVui+Uy zi|6n?`~WZDMf?;$!>{o&{(wK?FZe572~-4>Kuw@l%r}tddVhZYUVk0QLauv@Iq=f# zTo2vf-LqAR-SAxh>SjUkTW_lmFJHB~b^XT985)$l`9cPA(g{{^w&mHxUv@Eti7&y$ zOO((~BBg$$bRpyyh&q=o9Eq_j*swGdQW^C`bHz$(254!B<{ix;MXey>^HmmXi6|kp zia0Jt*RE3(wUQQr7~Rl8qjQMv(sXd)q6NwlWs@wcz{A8=k|UJl|0eIhQulMX1V6#= zaD^yah4Zl%L)b)gZN-hag~+-Md$A99;Slb@y|@o`JV>;Cn276Q4v*kCk@q;Bz{l`$ zd;*`rXNkJc<0*WFsQWs;fp6m5_zu2HBtB0R{t!RHkBP+7_ziwnLfPJ8%HsEhl+DF6 zmT6lDsgF^-g7&Wg=r7*oknOeQyO&e8%dx$-P_GK&FhaYg31+cJw#TAWu*Z_2Uwj07 z1bhU11bhU11g K|NoEA|9=DY+YTTA literal 0 HcmV?d00001 diff --git a/src/Rtsp/RtspToRtmpMediaSource.cpp b/src/Rtsp/RtspToRtmpMediaSource.cpp index d6da2627..65b093b1 100644 --- a/src/Rtsp/RtspToRtmpMediaSource.cpp +++ b/src/Rtsp/RtspToRtmpMediaSource.cpp @@ -47,40 +47,7 @@ void RtspToRtmpMediaSource::unregist() { m_pRtmpSrc->unregist(); } } -void RtspToRtmpMediaSource::onGetH264(const H264Frame& frame) { - if(m_pRecorder){ - m_pRecorder->inputH264((char *) frame.data.data(), frame.data.size(), frame.timeStamp, frame.type); - } - uint8_t nal_type = frame.data[4] & 0x1F; - int8_t flags = 7; //h.264 - bool is_config = false; - switch (nal_type) { - case 7: - case 8: - return; - case 5: - flags |= (FLV_KEY_FRAME << 4); - break; - default: - flags |= (FLV_INTER_FRAME << 4); - break; - } - m_rtmpPkt.strBuf.clear(); - m_rtmpPkt.strBuf.push_back(flags); - m_rtmpPkt.strBuf.push_back(!is_config); - m_rtmpPkt.strBuf.append("\x0\x0\x0", 3); - uint32_t size = frame.data.size() - 4; - size = htonl(size); - m_rtmpPkt.strBuf.append((char *) &size, 4); - m_rtmpPkt.strBuf.append(&frame.data[4], frame.data.size() - 4); - m_rtmpPkt.bodySize = m_rtmpPkt.strBuf.size(); - m_rtmpPkt.chunkId = CHUNK_MEDIA; - m_rtmpPkt.streamId = STREAM_MEDIA; - m_rtmpPkt.timeStamp = frame.timeStamp; - m_rtmpPkt.typeId = MSG_VIDEO; - m_pRtmpSrc->onGetMedia(m_rtmpPkt); -} void RtspToRtmpMediaSource::makeVideoConfigPkt() { int8_t flags = 7; //h.264 flags |= (FLV_KEY_FRAME << 4); @@ -121,7 +88,53 @@ void RtspToRtmpMediaSource::makeVideoConfigPkt() { m_rtmpPkt.typeId = MSG_VIDEO; m_pRtmpSrc->onGetMedia(m_rtmpPkt); } +void RtspToRtmpMediaSource::onGetH264(const H264Frame& frame) { + if(m_pRecorder){ + m_pRecorder->inputH264((char *) frame.data.data(), frame.data.size(), frame.timeStamp, frame.type); + } + uint8_t nal_type = frame.data[4] & 0x1F; + int8_t flags = 7; //h.264 + bool is_config = false; + switch (nal_type) { + case 7: + case 8: + return; + case 5: + flags |= (FLV_KEY_FRAME << 4); + break; + default: + flags |= (FLV_INTER_FRAME << 4); + break; + } + m_rtmpPkt.strBuf.clear(); + m_rtmpPkt.strBuf.push_back(flags); + m_rtmpPkt.strBuf.push_back(!is_config); + m_rtmpPkt.strBuf.append("\x0\x0\x0", 3); + uint32_t size = frame.data.size() - 4; + size = htonl(size); + m_rtmpPkt.strBuf.append((char *) &size, 4); + m_rtmpPkt.strBuf.append(&frame.data[4], frame.data.size() - 4); + m_rtmpPkt.bodySize = m_rtmpPkt.strBuf.size(); + m_rtmpPkt.chunkId = CHUNK_MEDIA; + m_rtmpPkt.streamId = STREAM_MEDIA; + + if(!m_aui32FirstStamp[0]){ + //记录首次时间戳 + m_aui32FirstStamp[0] = frame.timeStamp; + } + if(frame.timeStamp >= m_aui32FirstStamp[0]){ + //计算时间戳增量 + m_rtmpPkt.timeStamp = frame.timeStamp - m_aui32FirstStamp[0]; + }else{ + //发生回环,重新计算时间戳增量 + CLEAR_ARR(m_aui32FirstStamp); + m_rtmpPkt.timeStamp = 0; + } + + m_rtmpPkt.typeId = MSG_VIDEO; + m_pRtmpSrc->onGetMedia(m_rtmpPkt); +} void RtspToRtmpMediaSource::onGetAdts(const AdtsFrame& frame) { if(m_pRecorder){ m_pRecorder->inputAAC((char *) frame.data, frame.aac_frame_length, frame.timeStamp); @@ -137,7 +150,20 @@ void RtspToRtmpMediaSource::onGetAdts(const AdtsFrame& frame) { m_rtmpPkt.bodySize = m_rtmpPkt.strBuf.size(); m_rtmpPkt.chunkId = CHUNK_MEDIA; m_rtmpPkt.streamId = STREAM_MEDIA; - m_rtmpPkt.timeStamp = frame.timeStamp; + + if(!m_aui32FirstStamp[1]){ + //记录首次时间戳 + m_aui32FirstStamp[1] = frame.timeStamp; + } + if(frame.timeStamp >= m_aui32FirstStamp[1]){ + //计算时间戳增量 + m_rtmpPkt.timeStamp = frame.timeStamp - m_aui32FirstStamp[1]; + }else{ + //发生回环,重新计算时间戳增量 + CLEAR_ARR(m_aui32FirstStamp); + m_rtmpPkt.timeStamp = 0; + } + m_rtmpPkt.typeId = MSG_AUDIO; m_pRtmpSrc->onGetMedia(m_rtmpPkt); } diff --git a/src/Rtsp/RtspToRtmpMediaSource.h b/src/Rtsp/RtspToRtmpMediaSource.h index 2f2e0df5..096f1418 100644 --- a/src/Rtsp/RtspToRtmpMediaSource.h +++ b/src/Rtsp/RtspToRtmpMediaSource.h @@ -84,6 +84,8 @@ private: RtmpMediaSource::Ptr m_pRtmpSrc; RtmpPacket m_rtmpPkt; uint8_t m_ui8AudioFlags = 0; + //首次时间戳,m_aui32FirstStamp[0]:视频,m_aui32FirstStamp[1]:音频 + uint32_t m_aui32FirstStamp[2] = {0,0}; MediaRecorder::Ptr m_pRecorder; bool m_bEnableFile = true; void onGetH264(const H264Frame &frame);