Skip to content

Commit 5c2c59b

Browse files
committed
优化推流稳定性
优化拉流稳定性
1 parent 89b5ed6 commit 5c2c59b

File tree

26 files changed

+1436
-506
lines changed

26 files changed

+1436
-506
lines changed

ArLiveLite/.DS_Store

0 Bytes
Binary file not shown.

ArLiveLite/ARCodec.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#ifndef __AR_CODEC_H__
2+
#define __AR_CODEC_H__
3+
4+
//qsv cuvid d3d11va dxva2
5+
typedef enum CodecMethod
6+
{
7+
CM_Adjust= 0,
8+
CM_Soft = 1,
9+
CM_Qsv = 2,
10+
CM_Cuvid = 3,
11+
CM_D3d11va = 4,
12+
CM_Dxva1 = 5,
13+
}CodecMethod;
14+
15+
typedef enum CodecType
16+
{
17+
CT_None = 0,
18+
CT_YUV420 = 1,
19+
CT_H264 = 2,
20+
CT_H265 = 3,
21+
CT_AV1 = 10,
22+
CT_MJpg = 20,
23+
24+
CT_PCM = 100,
25+
CT_AAC,
26+
CT_MP3,
27+
CT_OPUS,
28+
CT_G711A,
29+
CT_G711U,
30+
CT_G719A_32 = 110,
31+
CT_G719A_48,
32+
CT_G719A_64,
33+
CT_G719A = CT_G719A_48,
34+
35+
CT_G722_48 = 120,//16khz
36+
CT_G722_56,//16khz
37+
CT_G722_64,//16khz
38+
39+
CT_G7221_7_24 = 130, //16khz
40+
CT_G7221_7_32, //16khz
41+
CT_G7221_14_24, //32khz
42+
CT_G7221_14_32, //32khz
43+
CT_G7221_14_48, //32khz
44+
}CodecType;
45+
46+
#endif // __AR_CODEC_H__

ArLiveLite/ArLive2Player.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ ArLive2Player::ArLive2Player(ArLive2Engine*pEngine, const std::string& strPlayId
1717
, b_shutdown_(false)
1818
, b_audio_paused_(false)
1919
, b_video_paused_(false)
20+
, e_play_mode_(AR::ArLivePlayModeLive)
2021
, n_sei_payload_type_(0)
2122
, n_rgba_width_(0)
2223
, n_rgba_height_(0)
@@ -51,9 +52,6 @@ void ArLive2Player::setObserver(AR::ArLivePlayerObserver* observer)
5152
{
5253
observer_ = observer;
5354
}
54-
void ArLive2Player::setLiveOem(AR::ArLiveOem oem)
55-
{
56-
}
5755
int32_t ArLive2Player::setRenderView(void* view)
5856
{
5957
AR::VideoCanvas vidCanvas;
@@ -73,6 +71,14 @@ int32_t ArLive2Player::setRenderFillMode(AR::ArLiveFillMode mode)
7371
ar_engine_->setVideoRenderFillMode(str_local_play_id_.c_str(), mode);
7472
return AR::ArLIVE_OK;
7573
}
74+
int32_t ArLive2Player::setPlayMode(AR::ArLivePlayMode mode)
75+
{
76+
if (ar_player_ != NULL) {
77+
return AR::ArLIVE_ERROR_REFUSED;
78+
}
79+
e_play_mode_ = mode;
80+
return AR::ArLIVE_OK;
81+
}
7682
int32_t ArLive2Player::startPlay(const char* strPlayUrl)
7783
{
7884
if (!main_thread_->IsCurrent()) {
@@ -308,7 +314,6 @@ void ArLive2Player::OnTickUnAttach()
308314
{
309315

310316
}
311-
312317
//* For PlayBuffer
313318
void ArLive2Player::OnBufferVideoRender(VideoData *videoData, int64_t pts)
314319
{
@@ -405,6 +410,10 @@ void ArLive2Player::OnFirstAudioDecoded()
405410
int ArLive2Player::MixAudioData(bool mix, void* audioSamples, uint32_t samplesPerSec, int nChannels)
406411
{
407412
if (b_audio_paused_ && b_video_paused_) {
413+
if (e_play_mode_ == AR::ArLivePlayModeLive) {//@Eric - 如果是直播,保持播放进度
414+
char pMixData[1920];
415+
PlayBuffer::DoAudRender(false, pMixData, samplesPerSec, nChannels, true);
416+
}
408417
return 0;
409418
}
410419
return PlayBuffer::DoAudRender(mix, audioSamples, samplesPerSec, nChannels, b_audio_paused_);
@@ -492,6 +501,11 @@ bool ArLive2Player::OnArPlyAppIsBackground(void* player)
492501
{
493502
return PlayBuffer::AppIsBackground();
494503
}
504+
505+
bool ArLive2Player::OnArPlyIsLiveMode(void* player)
506+
{
507+
return e_play_mode_ == AR::ArLivePlayModeLive;
508+
}
495509
void ArLive2Player::OnArPlyAudio(void*player, const char*pData, int nSampleHz, int nChannels, int64_t pts)
496510
{
497511
PcmData *audioData = new PcmData((char*)pData, (nSampleHz / 100)*nChannels * sizeof(short), nSampleHz, nChannels);

ArLiveLite/ArLive2Player.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ class ArLive2Player : public AR::IArLivePlayer, public RtcTick, public PlayBuffe
2929

3030
//* For AR::IArLivePlayer
3131
virtual void setObserver(AR::ArLivePlayerObserver* observer);
32-
virtual void setLiveOem(AR::ArLiveOem oem);
3332
virtual int32_t setRenderView(void* view);
3433
virtual int32_t setRenderRotation(AR::ArLiveRotation rotation);
3534
virtual int32_t setRenderFillMode(AR::ArLiveFillMode mode);
35+
virtual int32_t setPlayMode(AR::ArLivePlayMode mode);
3636
virtual int32_t startPlay(const char* url);
3737
virtual int32_t stopPlay();
3838
virtual int32_t isPlaying();
@@ -75,6 +75,7 @@ class ArLive2Player : public AR::IArLivePlayer, public RtcTick, public PlayBuffe
7575
virtual bool OnArPlyNeedMoreAudioData(void*player);
7676
virtual bool OnArPlyNeedMoreVideoData(void*player);
7777
virtual bool OnArPlyAppIsBackground(void* player);
78+
virtual bool OnArPlyIsLiveMode(void* player);
7879
virtual void OnArPlyAudio(void*player, const char*pData, int nSampleHz, int nChannels, int64_t pts);
7980
virtual void OnArPlyVideo(void*player, int fmt, int ww, int hh, uint8_t**pData, int*linesize, int64_t pts);
8081
virtual void OnArPlySeiData(void* player, const char* pData, int nLen, int64_t pts);
@@ -91,6 +92,7 @@ class ArLive2Player : public AR::IArLivePlayer, public RtcTick, public PlayBuffe
9192
bool b_shutdown_;
9293
bool b_audio_paused_;
9394
bool b_video_paused_;
95+
AR::ArLivePlayMode e_play_mode_;
9496
int n_sei_payload_type_;
9597
std::string str_play_url_;
9698

ArLiveLite/ArLive2Pusher.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,11 +804,13 @@ void ArLive2Pusher::RecordedDataIsAvailable(const void* audioSamples, const size
804804
while (nAudUsed + nAud10msLen <= nSamples) {
805805
const void* ptr = (char*)audioSamples + nAudUsed*nChannels*sizeof(short);
806806
if (b_audio_paused_) {
807+
#if 0
807808
char muteAudData[1920] = { 0 };
808809
webrtc::MutexLock l(&cs_aac_encoder_);
809810
if (aac_encoder_ != NULL) {
810811
aac_encoder_->Encode(muteAudData, nSamples, nBytesPerSample, nChannels, samplesPerSec, totalDelayMS);
811812
}
813+
#endif
812814
}
813815
else {
814816
webrtc::MutexLock l(&cs_aac_encoder_);

ArLiveLite/codec/AvCodec.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ bool A_AACEncoder::Init(int sample_rate, int num_channels, int bitrate)
5353
return false;
5454
audio_record_sample_hz_ = sample_rate;
5555
audio_record_channels_ = num_channels;
56-
encoder_ = aac_encoder_open(num_channels, sample_rate, sizeof(short)*8, bitrate, false);
56+
encoder_ = aac_encoder_open(num_channels, sample_rate, sizeof(short)*8, bitrate, true);
5757
return true;
5858
}
5959

ArLiveLite/include/ArLiveDef.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,19 @@ enum ArLiveFillMode {
427427

428428
};
429429

430+
/**
431+
* @brief 视频播放模式。
432+
*/
433+
enum ArLivePlayMode {
434+
435+
/// 直播模式 - 暂停的过程中,数据会丢失,保证实时性
436+
ArLivePlayModeLive,
437+
438+
/// 点播模式 - 暂停的过程中,数据不会丢失,恢复后会继续播放
439+
ArLivePlayModeVod
440+
441+
};
442+
430443
/**
431444
* @brief 视频画面顺时针旋转角度。
432445
*/

ArLiveLite/include/IArLivePlayer.hpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,6 @@ class IArLivePlayer {
3333
*/
3434
virtual void setObserver(ArLivePlayerObserver* observer) = 0;
3535

36-
/**
37-
* 设置厂家类型Oem。
38-
*
39-
* 由于各个厂家的标准不统一,比如webrtc的whip方案,
40-
* 需要针对不同厂家用针对性的方案去实现
41-
*
42-
* @param observer oem的厂家枚举,更多信息请查看 {@link ArLiveOem}
43-
*/
44-
virtual void setLiveOem(ArLiveOem oem) = 0;
4536

4637
/**
4738
* 设置播放器的视频渲染 View。 该控件负责显示视频内容。
@@ -76,6 +67,17 @@ class IArLivePlayer {
7667
*/
7768
virtual int32_t setRenderFillMode(ArLiveFillMode mode) = 0;
7869

70+
/**
71+
* 设置播放模式。
72+
*
73+
* @param mode 播放模式 {@link ArLivePlayMode}。
74+
* - ArLivePlayModeLive 【默认值】: 直播模式 - 暂停的过程中,数据会丢失,保证实时性
75+
* - ArLivePlayModeVod: 点播模式 - 暂停的过程中,数据不会丢失,恢复后会继续播放
76+
* @return 返回值 {@link ArLiveCode}
77+
* - ArLIVE_OK: 成功
78+
*/
79+
virtual int32_t setPlayMode(ArLivePlayMode mode) = 0;
80+
7981
/**
8082
* 开始播放音视频流。
8183
*

ArLiveLite/player/ARFFPlayer.cpp

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -342,62 +342,65 @@ bool ARFFPlayer::ReadThreadProcess()
342342
if (ret >= 0) {
343343
n_last_recv_data_time_ = rtc::Time32();
344344
if (packet->stream_index == n_video_stream_idx_) {
345-
int64_t pts = 0;
346345
n_net_vid_band_ += packet->size;
347-
if (packet->flags & AV_PKT_FLAG_KEY) {
348-
346+
int64_t pts = 0;
347+
int64_t dts = 0;
348+
if (packet->dts == AV_NOPTS_VALUE) {
349+
dts = 0;
349350
}
350-
if (packet->dts != 0) {
351-
if (packet->dts == AV_NOPTS_VALUE) {
352-
pts = 0;
353-
}
354-
else {
355-
pts = av_rescale_q(packet->dts, vstream_timebase_, TIMEBASE_MS);
356-
}
351+
else {
352+
dts = av_rescale_q(packet->dts, astream_timebase_, TIMEBASE_MS);
353+
}
354+
if (packet->pts == AV_NOPTS_VALUE) {
355+
pts = 0;
357356
}
358357
else {
359-
if (packet->pts == AV_NOPTS_VALUE) {
360-
pts = 0;
361-
}
362-
else {
363-
pts = av_rescale_q(packet->pts, vstream_timebase_, TIMEBASE_MS);
364-
}
358+
pts = av_rescale_q(packet->pts, astream_timebase_, TIMEBASE_MS);
359+
}
360+
if (dts == 0 && pts != 0) {
361+
dts = pts;
362+
}
363+
if (pts == 0 && dts != 0) {
364+
pts = dts;
365365
}
366366
if (b_no_buffer_) {
367367
OnBufferDecodeVideoData(packet);
368368
av_packet_unref(packet);
369369
delete packet;
370370
}
371371
else {
372-
FFBuffer::RecvVideoData(packet, pts, pts, av_rescale_q(packet->duration, vstream_timebase_, TIMEBASE_MS));
372+
FFBuffer::RecvVideoData(packet, dts, pts, av_rescale_q(packet->duration, vstream_timebase_, TIMEBASE_MS));
373373
}
374374
}
375375
else if (packet->stream_index == n_audio_stream_idx_) {
376-
int64_t pts = 0;
377376
n_net_aud_band_ += packet->size;
378-
if (packet->dts != 0) {
379-
if (packet->dts == AV_NOPTS_VALUE) {
380-
pts = 0;
381-
}
382-
else {
383-
pts = av_rescale_q(packet->dts, astream_timebase_, TIMEBASE_MS);
384-
}
377+
int64_t pts = 0;
378+
int64_t dts = 0;
379+
if (packet->dts == AV_NOPTS_VALUE) {
380+
dts = 0;
385381
}
386382
else {
387-
if (packet->pts == AV_NOPTS_VALUE) {
388-
pts = 0;
389-
}
390-
else {
391-
pts = av_rescale_q(packet->pts, astream_timebase_, TIMEBASE_MS);
392-
}
383+
dts = av_rescale_q(packet->dts, astream_timebase_, TIMEBASE_MS);
384+
}
385+
if (packet->pts == AV_NOPTS_VALUE) {
386+
pts = 0;
387+
}
388+
else {
389+
pts = av_rescale_q(packet->pts, astream_timebase_, TIMEBASE_MS);
390+
}
391+
if (dts == 0 && pts != 0) {
392+
dts = pts;
393+
}
394+
if (pts == 0 && dts != 0) {
395+
pts = dts;
393396
}
394397
if (b_no_buffer_) {
395398
OnBufferDecodeAudioData(packet);
396399
av_packet_unref(packet);
397400
delete packet;
398401
}
399402
else {
400-
FFBuffer::RecvAudioData(packet, pts, pts, av_rescale_q(packet->duration, astream_timebase_, TIMEBASE_MS));
403+
FFBuffer::RecvAudioData(packet, dts, pts, av_rescale_q(packet->duration, astream_timebase_, TIMEBASE_MS));
401404
}
402405
}
403406
}

ArLiveLite/player/FFBuffer.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,28 @@ void FFBuffer::DoTick()
9696
if (lst_video_recv_.size() > 0) {
9797
vidCacheTime = lst_video_recv_.back()->dts_ - lst_video_recv_.front()->dts_;
9898
vidFirstDtsTime = lst_video_recv_.front()->dts_;
99+
100+
if (rtc::TimeUTCMillis() - lst_video_recv_.front()->recv_time_ >= n_cacheing_time_) {
101+
RTC_LOG(LS_NONE) << "RenderVideo cache pts: " << lst_video_recv_.front()->pts_ << " curTime: " << rtc::TimeMillis();
102+
vidCacheTime = n_cacheing_time_;
103+
rtc::CritScope l(&cs_video_decode_);
104+
lst_video_decode_.push_back(lst_video_recv_.front());
105+
lst_video_recv_.pop_front();
106+
}
99107
}
100108
}
101109
{
102110
rtc::CritScope cs(&cs_audio_recv_);
103111
if (lst_audio_recv_.size() > 0) {
104112
audCacheTime = lst_audio_recv_.back()->dts_ - lst_audio_recv_.front()->dts_;
105113
audFirstDtsTime = lst_audio_recv_.front()->dts_;
114+
115+
if (rtc::TimeUTCMillis() - lst_audio_recv_.front()->recv_time_ >= n_cacheing_time_) {
116+
audCacheTime = n_cacheing_time_;
117+
rtc::CritScope l(&cs_audio_decode_);
118+
lst_audio_decode_.push_back(lst_audio_recv_.front());
119+
lst_audio_recv_.pop_front();
120+
}
106121
}
107122
}
108123
//RTC_LOG(LS_INFO) << "DoTick audCacheTime: " << audCacheTime << " vidCacheTime: " << vidCacheTime;
@@ -434,6 +449,7 @@ void FFBuffer::RecvVideoData(AVPacket* pkt, int64_t dts, int64_t pts, int64_t du
434449
recvPkt->dts_ = dts;
435450
recvPkt->pts_ = pts;
436451
recvPkt->duration_ = duration;
452+
recvPkt->recv_time_ = rtc::TimeUTCMillis();
437453

438454
rtc::CritScope cs(&cs_video_recv_);
439455
lst_video_recv_.push_back(recvPkt);
@@ -454,6 +470,7 @@ void FFBuffer::RecvAudioData(AVPacket* pkt, int64_t dts, int64_t pts, int64_t du
454470
recvPkt->dts_ = dts;
455471
recvPkt->pts_ = pts;
456472
recvPkt->duration_ = duration;
473+
recvPkt->recv_time_ = rtc::TimeUTCMillis();
457474

458475
rtc::CritScope cs(&cs_audio_recv_);
459476
lst_audio_recv_.push_back(recvPkt);

0 commit comments

Comments
 (0)