fix: 解决h265多Tile编码时,只有左侧画面,右侧画面灰色图的问题 (#4699)

推流H265 RTMP,播放 webrtc,左半边画面正常,右半边画面是灰度图。

原因:
FUA打包的M错误导致组帧有问题,播放侧只解码了左边的Tile,右边灰度图背景。

进一步分析推的H265视频
为双Tile左右布局,Webrtc分为两个NALU传输的,H265RtpEncoder::packRtpFu里将两个NALU的RTP包的M标记都标记为1------
这个是错误的,这个M标记是帧结束的标记,而不是NALU结束的标记。也就是说只需要将帧的最后一个NALU的最后一个RTP包的M置1。
This commit is contained in:
yzhw 2026-04-01 17:40:36 +08:00 committed by GitHub
parent 435dcbcbbf
commit d75d35dc7a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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 // Pass in nullptr first, do not copy the payload memory
// 只有FU的最后一个分片且整个帧需要设置mark时才设置mark位 // 只有FU的最后一个分片且整个帧需要设置mark时才设置mark位
bool mark_bit = fu_end && is_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 负载部分 [AUTO-TRANSLATED:03a5ef9b]
// rtp payload load part // rtp payload load part
uint8_t *payload = rtp->getPayload(); uint8_t *payload = rtp->getPayload();