From 5c81640556ceda13a9d11c749702d833dea007e9 Mon Sep 17 00:00:00 2001 From: lvchenyun <131850965+lvchenyun@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:56:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=BD=E6=A0=87=E7=BA=A7?= =?UTF-8?q?=E8=81=94=E9=9F=B3=E9=A2=91=E5=8F=AF=E8=83=BD=E9=94=99=E4=B9=B1?= =?UTF-8?q?=E7=9A=84bug=20(#2967)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GB28181流音频解析出来的Frame类型是不可缓存类型,它的数据内存地址是复用的。 在级联时,会把Frame存入RingBuffer对象,这样在下次使用改Frame对象时,可能数据区已经被覆盖掉了。 --- src/Common/MultiMediaSourceMuxer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 99898b95..e38c6134 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -525,6 +525,8 @@ bool MultiMediaSourceMuxer::onTrackFrame(const Frame::Ptr &frame_in) { ret = _fmp4->inputFrame(frame) ? true : ret; } if (_ring) { + // 此场景由于直接转发,可能存在切换线程引起的数据被缓存在管道,所以需要CacheAbleFrame + frame = Frame::getCacheAbleFrame(frame); if (frame->getTrackType() == TrackVideo) { // 视频时,遇到第一帧配置帧或关键帧则标记为gop开始处 auto video_key_pos = frame->keyFrame() || frame->configFrame();