@@ -91,11 +91,11 @@ static int MixAudio(int iChannelNum, short* sourceData1, short* sourceData2, flo
9191
9292#ifdef WEBRTC_ANDROID
9393// android 的某些机型,音频播放的线程实时性不高,所以一次性需要更多的数据
94- const int kMaxAudioPlaySize = 15 ;
94+ const int kMaxAudioPlaySize = 30 ;
9595#else
96- const int kMaxAudioPlaySize = 5 ;
96+ const int kMaxAudioPlaySize = 20 ;
9797#endif
98- const int kMaxVedeoPlaySize = 3 ;
98+ const int kMaxVedeoPlaySize = kMaxAudioPlaySize / 2 ;
9999
100100
101101PlayBuffer::PlayBuffer (void )
@@ -104,6 +104,8 @@ PlayBuffer::PlayBuffer(void)
104104 , b_video_decoded_(false )
105105 , b_audio_decoded_(false )
106106 , b_app_in_background_(false )
107+ , n_last_render_video_time_(0 )
108+ , n_last_render_video_pts_(0 )
107109{
108110 aud_data_resamp_ = new char [kMaxDataSizeSamples ];
109111 memset (aud_data_resamp_, 0 , kMaxDataSizeSamples );
@@ -120,22 +122,40 @@ PlayBuffer::~PlayBuffer(void)
120122
121123int PlayBuffer::DoVidRender (bool bVideoPaused)
122124{
123- VideoData* vidPkt = NULL ;
124- {
125- rtc::CritScope cs (&cs_video_play_);
126- if (lst_video_play_.size () > 0 ) {
127- vidPkt = lst_video_play_.front ();
128- lst_video_play_.pop_front ();
125+ bool bRender = false ;
126+ while (1 ) {
127+ VideoData* vidPkt = NULL ;
128+ {
129+ rtc::CritScope cs (&cs_video_play_);
130+ if (lst_video_play_.size () > 0 ) {
131+ vidPkt = lst_video_play_.front ();
132+ if (n_last_render_video_pts_ == 0 || n_last_render_video_pts_ > vidPkt->pts_ ) {
133+ n_last_render_video_time_ = rtc::TimeUTCMillis ();
134+ n_last_render_video_pts_ = vidPkt->pts_ ;
135+ }
136+ if (vidPkt->pts_ <= (rtc::TimeUTCMillis () - n_last_render_video_time_) + n_last_render_video_pts_) {
137+ lst_video_play_.pop_front ();
138+ }
139+ else {
140+ vidPkt = NULL ;
141+ }
142+ }
129143 }
130- }
131144
132- if (vidPkt != NULL ) {
133- // RTC_LOG(LS_INFO) << "DoRender video pts: " << vidPkt->pts_ << " plytime: " << play_pts_time_;
134- if (!bVideoPaused && !b_app_in_background_) {
135- OnBufferVideoRender (vidPkt, vidPkt->pts_ );
145+ if (vidPkt != NULL ) {
146+ // RTC_LOG(LS_INFO) << "DoRender video pts: " << vidPkt->pts_ << " plytime: " << play_pts_time_;
147+ if (!bVideoPaused && !b_app_in_background_) {
148+ if (!bRender) {// @Eric - 跳帧处理,防止一次性输出过多
149+ OnBufferVideoRender (vidPkt, vidPkt->pts_ );
150+ }
151+ bRender = true ;
152+ }
153+ delete vidPkt;
154+ vidPkt = NULL ;
155+ }
156+ else {
157+ break ;
136158 }
137- delete vidPkt;
138- vidPkt = NULL ;
139159 }
140160
141161 return 0 ;
@@ -148,9 +168,11 @@ int PlayBuffer::DoAudRender(bool mix, void* audioSamples, uint32_t samplesPerSec
148168 {// *
149169 rtc::CritScope cs (&cs_audio_play_);
150170 // RTC_LOG(LS_INFO) << "Audio list size: " << lst_audio_play_.size();
171+
151172 if (lst_audio_play_.size () > 0 ) {
152173 audPkt = lst_audio_play_.front ();
153174 lst_audio_play_.pop_front ();
175+
154176 }
155177
156178 }
@@ -182,6 +204,10 @@ int PlayBuffer::DoAudRender(bool mix, void* audioSamples, uint32_t samplesPerSec
182204 memcpy (audioSamples, pOutputPcm, a_frame_size);
183205 }
184206 }
207+ {
208+ n_last_render_video_time_ = rtc::TimeUTCMillis ();
209+ n_last_render_video_pts_ = audPkt->pts_ ;
210+ }
185211 delete audPkt;
186212 audPkt = NULL ;
187213 }
@@ -298,6 +324,10 @@ bool PlayBuffer::NeedMoreVideoPlyData()
298324 rtc::CritScope cs (&cs_video_play_);
299325 return lst_video_play_.size () <= kMaxVedeoPlaySize ;
300326}
327+ bool PlayBuffer::AppIsBackground ()
328+ {
329+ return b_app_in_background_;
330+ }
301331void PlayBuffer::PlayVideoData (VideoData* videoData)
302332{
303333 // RTC_LOG(LS_INFO) << "PlayVideoData pts: " << videoData->pts_;
@@ -341,7 +371,7 @@ void PlayBuffer::PlayVideoData(VideoData* videoData)
341371 //@Eric - 跳帧处理 - 防止缓存太多:内存报警,渲染延时增大
342372 while (lst_video_play_.size() > 1) {
343373 int64_t timeGap = lst_video_play_.back()->pts_ - lst_video_play_.front()->pts_;
344- if (timeGap < (kMaxAudioPlaySize << 1) * 10) {
374+ if (timeGap < (kMaxVideoPlaySize << 1) * 10) {
345375 break;
346376 }
347377 VideoData* pkt = lst_video_play_.front();
@@ -363,27 +393,39 @@ void PlayBuffer::PlayAudioData(PcmData*pcmData)
363393 int64_t dropPts = -1 ;
364394 {
365395 rtc::CritScope cs (&cs_audio_play_);
396+ lst_audio_play_.push_back (pcmData);
397+
366398 // @Eric - 跳帧处理 - 防止缓存太多:延时增大
367- while (lst_audio_play_.size () > (kMaxAudioPlaySize << 1 )) {
399+ if (lst_audio_play_.size () >= kMaxAudioPlaySize ) {// 清一半缓存
400+ while (lst_audio_play_.size () > kMaxAudioPlaySize /2 ) {
401+ PcmData* pkt = lst_audio_play_.front ();
402+ dropPts = pkt->pts_ ;
403+ lst_audio_play_.pop_front ();
404+ delete pkt;
405+
406+ OnBufferAudioDropped ();
407+ }
408+ }
409+ }
410+
411+ #if 0
412+ if (b_app_in_background_) {
413+ if (lst_audio_play_.size() > 0) {
368414 PcmData* pkt = lst_audio_play_.front();
369415 dropPts = pkt->pts_;
370- lst_audio_play_.pop_front ();
371- delete pkt;
372-
373- OnBufferAudioDropped ();
374416 }
375- lst_audio_play_.push_back (pcmData);
376417 }
418+ #endif
377419
378420 if (dropPts != -1 ) {
379421 // @Eric - 跳帧处理 - 防止缓存太多:内存报警,渲染延时增大
380422 while (lst_video_play_.size () > 1 ) {
381423 if (lst_video_play_.front ()->pts_ > dropPts) {
382424 break ;
383425 }
384- VideoData* pkt = lst_video_play_.front ();
426+ VideoData* vidPkt = lst_video_play_.front ();
385427 lst_video_play_.pop_front ();
386- delete pkt ;
428+ delete vidPkt ;
387429
388430 OnBufferVideoDropped ();
389431 }
0 commit comments