From a44a63423c2f360ef080e7202fbfc4ce52b2e52f Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 24 Jul 2020 20:03:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3rtsp=E6=8E=A8=E6=B5=81?= =?UTF-8?q?=EF=BC=8Caac=E6=97=B6=E9=97=B4=E6=88=B3=E5=A2=9E=E9=87=8F?= =?UTF-8?q?=E5=A4=AA=E5=A4=A7=E5=AF=BC=E8=87=B4flv.js=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9A#392?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Extension/AACRtp.cpp | 51 +++++++++++++++++++++++----------------- src/Extension/AACRtp.h | 1 + 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/Extension/AACRtp.cpp b/src/Extension/AACRtp.cpp index 08f8307c..9214d97b 100644 --- a/src/Extension/AACRtp.cpp +++ b/src/Extension/AACRtp.cpp @@ -9,7 +9,6 @@ */ #include "AACRtp.h" -#define AAC_MAX_FRAME_SIZE (2 * 1024) namespace mediakit{ @@ -87,32 +86,42 @@ bool AACRtpDecoder::inputRtp(const RtpPacket::Ptr &rtppack, bool key_pos) { //rtp数据开始部分 uint8_t *ptr = (uint8_t *) rtppack->data() + rtppack->offset; //rtp数据末尾 - const uint8_t *end = (uint8_t *) rtppack->data() + rtppack->size(); - + uint8_t *end = (uint8_t *) rtppack->data() + rtppack->size(); //首2字节表示Au-Header的个数,单位bit,所以除以16得到Au-Header个数 - const uint16_t au_header_count = ((ptr[0] << 8) | ptr[1]) >> 4; - //忽略Au-Header区 - ptr += 2 + au_header_count * 2; + uint16_t au_header_count = ((ptr[0] << 8) | ptr[1]) >> 4; + //记录au_header起始指针 + uint8_t *au_header_ptr = ptr + 2; + ptr = au_header_ptr + au_header_count * 2; - while (ptr < end) { - auto size = (uint32_t) (end - ptr); - if (size > AAC_MAX_FRAME_SIZE) { - size = AAC_MAX_FRAME_SIZE; - } - if (_frame->size() + size > AAC_MAX_FRAME_SIZE) { - //数据太多了,先清空 - flushData(); - } - //追加aac数据 - _frame->_buffer.append((char *) ptr, size); - _frame->_dts = rtppack->timeStamp; - ptr += size; + if (end < ptr) { + //数据不够 + return false; } - if (rtppack->mark) { - //最后一个rtp分片 + //每个audio unit时间戳增量 + auto dts_inc = (rtppack->timeStamp - _last_dts) / au_header_count; + if(dts_inc < 0 && dts_inc > 100){ + //时间戳增量异常 + dts_inc = 0; + } + + for (int i = 0; i < au_header_count; ++i) { + // 之后的2字节是AU_HEADER,其中高13位表示一帧AAC负载的字节长度,低3位无用 + uint16_t size = ((au_header_ptr[0] << 8) | au_header_ptr[1]) >> 3; + if (ptr + size > end) { + //数据不够 + break; + } + //设置aac数据 + _frame->_buffer.assign((char *) ptr, size); + //设置当前audio unit时间戳 + _frame->_dts = _last_dts + i * dts_inc; + ptr += size; + au_header_ptr += 2; flushData(); } + //记录上次时间戳 + _last_dts = rtppack->timeStamp; return false; } diff --git a/src/Extension/AACRtp.h b/src/Extension/AACRtp.h index 7b646204..fb9442a4 100644 --- a/src/Extension/AACRtp.h +++ b/src/Extension/AACRtp.h @@ -45,6 +45,7 @@ private: private: AACFrame::Ptr _frame; string _aac_cfg; + uint32_t _last_dts = 0; };