From d75d35dc7a2565a822581932d6fd898b72d3ffa5 Mon Sep 17 00:00:00 2001 From: yzhw Date: Wed, 1 Apr 2026 17:40:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3h265=E5=A4=9ATile?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E6=97=B6=EF=BC=8C=E5=8F=AA=E6=9C=89=E5=B7=A6?= =?UTF-8?q?=E4=BE=A7=E7=94=BB=E9=9D=A2=EF=BC=8C=E5=8F=B3=E4=BE=A7=E7=94=BB?= =?UTF-8?q?=E9=9D=A2=E7=81=B0=E8=89=B2=E5=9B=BE=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#4699)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 推流H265 RTMP,播放 webrtc,左半边画面正常,右半边画面是灰度图。 原因: FUA打包的M错误导致组帧有问题,播放侧只解码了左边的Tile,右边灰度图背景。 进一步分析推的H265视频 为双Tile左右布局,Webrtc分为两个NALU传输的,H265RtpEncoder::packRtpFu里将两个NALU的RTP包的M标记都标记为1------ 这个是错误的,这个M标记是帧结束的标记,而不是NALU结束的标记。也就是说只需要将帧的最后一个NALU的最后一个RTP包的M置1。 --- ext-codec/H265Rtp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext-codec/H265Rtp.cpp b/ext-codec/H265Rtp.cpp index c3dec8c4..24e90d67 100644 --- a/ext-codec/H265Rtp.cpp +++ b/ext-codec/H265Rtp.cpp @@ -289,7 +289,7 @@ void H265RtpEncoder::packRtpFu(const char *ptr, size_t len, uint64_t pts, bool i // Pass in nullptr first, do not copy the payload memory // 只有FU的最后一个分片且整个帧需要设置mark时才设置mark位 bool mark_bit = fu_end && is_mark; - auto rtp = getRtpInfo().makeRtp(TrackVideo, nullptr, max_size + 3, mark_bit, pts); + auto rtp = getRtpInfo().makeRtp(TrackVideo, nullptr, max_size + 3, mark_bit && is_mark, pts); //yzw 帧(不是NALU,多TILE时一帧有多个NALU)最后一个rtp才设置mark位 // rtp payload 负载部分 [AUTO-TRANSLATED:03a5ef9b] // rtp payload load part uint8_t *payload = rtp->getPayload();