From 6ed3ffb522d9388b3c1741d0ed1a22f47893f7b2 Mon Sep 17 00:00:00 2001 From: chenning Date: Thu, 21 Aug 2025 15:06:52 +0800 Subject: [PATCH] fix audio capture filter sync Signed-off-by: chenning --- .../filters/audio_capture_filter.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/services/media_engine/filters/audio_capture_filter.cpp b/services/media_engine/filters/audio_capture_filter.cpp index a2b84ddf2..a9d77c418 100644 --- a/services/media_engine/filters/audio_capture_filter.cpp +++ b/services/media_engine/filters/audio_capture_filter.cpp @@ -523,7 +523,7 @@ int32_t AudioCaptureFilter::FillLostFrameNum() { int64_t audioDataTime = 0; int32_t lostCount = 0; - int64_t cachedAudioDateTime = cachedAudioDataDeque_.size() * AUDIO_CAPTURE_READ_FRAME_TIME; + int64_t cachedAudioDateTime = static_cast(cachedAudioDataDeque_.size()) * AUDIO_CAPTURE_READ_FRAME_TIME; audioCaptureModule_->GetAudioTime(audioDataTime, false); if (audioDataTime > currentTime_ + cachedAudioDateTime && (audioDataTime - currentTime_ - cachedAudioDateTime) > static_cast(AUDIO_UNREGULAR_DELTA_TIME) @@ -581,11 +581,18 @@ void AudioCaptureFilter::RecordCachedData(int32_t recordFrameNum) uint64_t bufferSize = 0; audioCaptureModule_->GetSize(bufferSize); - std::lock_guard lock(cachedAudioDataMutex_); - MEDIA_LOG_I("cachedAudioDataList count: " PUBLIC_LOG_D32, static_cast(cachedAudioDataDeque_.size())); - while (!cachedAudioDataDeque_.empty() && outputBufferQueue_ && recordFrameNum > 0) { - auto tmpData = cachedAudioDataDeque_.front(); - cachedAudioDataDeque_.pop_front(); + std::deque> tempDataDeque; + { + std::lock_guard lock(cachedAudioDataMutex_); + MEDIA_LOG_I("cachedAudioDataList count: " PUBLIC_LOG_D32, static_cast(cachedAudioDataDeque_.size())); + auto endIt = cachedAudioDataDeque_.begin() + + std::min(recordFrameNum, static_cast(cachedAudioDataDeque_.size())); + tempDataDeque.assign(cachedAudioDataDeque_.begin(), endIt); + cachedAudioDataDeque_.erase(cachedAudioDataDeque_.begin(), endIt); + } + while (!tempDataDeque.empty() && outputBufferQueue_ && recordFrameNum > 0) { + auto tmpData = tempDataDeque.front(); + tempDataDeque.pop_front(); std::shared_ptr buffer; AVBufferConfig avBufferConfig; -- Gitee