Skip to content

Commit 0737a9b

Browse files
committed
DEMO-2792
1 parent 1176083 commit 0737a9b

3 files changed

Lines changed: 154 additions & 3 deletions

File tree

windows/APIExample/APIExample/Advanced/RTMPStream/AgoraRtmpStreaming.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,30 @@ void CAgoraRtmpStreamingDlgRtcEngineEventHandler::onRtmpStreamingStateChanged(co
104104
}
105105

106106

107+
108+
void CAgoraRtmpStreamingDlgRtcEngineEventHandler::onStreamUnpublished(const char *url)
109+
{
110+
if (m_hMsgHanlder) {
111+
PStreamPublished streamPublished = new StreamPublished;
112+
int len = strlen(url);
113+
char* publishUrl = new char[len + 1];
114+
memset(publishUrl, 0, sizeof(publishUrl));
115+
strcpy_s(publishUrl, len, url);
116+
::PostMessage(m_hMsgHanlder, WM_MSGID(EID_RTMP_STREAM_STATE_UNPUBLISHED), (WPARAM)streamPublished, 0);
117+
}
118+
}
119+
120+
void CAgoraRtmpStreamingDlgRtcEngineEventHandler::onStreamPublished(const char *url, int error)
121+
{
122+
if (m_hMsgHanlder) {
123+
int len = strlen(url);
124+
char* publishUrl = new char[len + 1];
125+
memset(publishUrl, 0, sizeof(publishUrl));
126+
strcpy_s(publishUrl, len, url);
127+
::PostMessage(m_hMsgHanlder, WM_MSGID(EID_RTMP_STREAM_STATE_PUBLISHED), (WPARAM)publishUrl, error);
128+
}
129+
}
130+
107131
IMPLEMENT_DYNAMIC(CAgoraRtmpStreamingDlg, CDialogEx)
108132

109133
CAgoraRtmpStreamingDlg::CAgoraRtmpStreamingDlg(CWnd* pParent /*=nullptr*/)
@@ -145,11 +169,14 @@ BEGIN_MESSAGE_MAP(CAgoraRtmpStreamingDlg, CDialogEx)
145169
ON_MESSAGE(WM_MSGID(EID_RTMP_STREAM_STATE_CHANGED), &CAgoraRtmpStreamingDlg::OnEIDRtmpStateChanged)
146170
ON_MESSAGE(WM_MSGID(EID_USER_JOINED), &CAgoraRtmpStreamingDlg::OnEIDUserJoined)
147171
ON_MESSAGE(WM_MSGID(EID_USER_OFFLINE), &CAgoraRtmpStreamingDlg::OnEIDUserOffline)
172+
ON_MESSAGE(WM_MSGID(EID_RTMP_STREAM_STATE_PUBLISHED), &CAgoraRtmpStreamingDlg::OnEIDStreamPublished)
173+
ON_MESSAGE(WM_MSGID(EID_RTMP_STREAM_STATE_UNPUBLISHED), &CAgoraRtmpStreamingDlg::OnEIDStreamUnpublished)
148174
ON_BN_CLICKED(IDC_BUTTON_JOINCHANNEL, &CAgoraRtmpStreamingDlg::OnBnClickedButtonJoinchannel)
149175
ON_BN_CLICKED(IDC_BUTTON_ADDSTREAM, &CAgoraRtmpStreamingDlg::OnBnClickedButtonAddstream)
150176
ON_BN_CLICKED(IDC_BUTTON_REMOVE_STREAM, &CAgoraRtmpStreamingDlg::OnBnClickedButtonRemoveStream)
151177
ON_BN_CLICKED(IDC_BUTTON_REMOVE_ALLSTREAM, &CAgoraRtmpStreamingDlg::OnBnClickedButtonRemoveAllstream)
152178
ON_LBN_SELCHANGE(IDC_LIST_INFO_BROADCASTING, &CAgoraRtmpStreamingDlg::OnSelchangeListInfoBroadcasting)
179+
ON_WM_TIMER()
153180
END_MESSAGE_MAP()
154181

155182

@@ -631,5 +658,84 @@ BOOL CAgoraRtmpStreamingDlg::PreTranslateMessage(MSG* pMsg)
631658
return CDialogEx::PreTranslateMessage(pMsg);
632659
}
633660

661+
LRESULT CAgoraRtmpStreamingDlg::OnEIDStreamUnpublished(WPARAM wParam, LPARAM lParam)
662+
{
663+
char* url = (char*)wParam;
664+
665+
if (m_mapRepublishFlag.find(url) != m_mapRepublishFlag.end()
666+
&& m_mapRemoveFlag.find(url) != m_mapRemoveFlag.end()) {
667+
if (m_mapRepublishFlag[url]
668+
&& !m_mapRemoveFlag[url]) {//republish, removePublish when error
669+
m_rtcEngine->addPublishStreamUrl(url, false);
670+
}
671+
}
634672

673+
delete[] url;
674+
url = nullptr;
675+
return 0;
676+
}
635677

678+
LRESULT CAgoraRtmpStreamingDlg::OnEIDStreamPublished(WPARAM wParam, LPARAM lParam)
679+
{
680+
char* url = (char*)wParam;
681+
int error = lParam;
682+
683+
if (error == 1 || error == 10 || error == 154) {
684+
m_mapRemoveFlag[url] = false;
685+
m_rtcEngine->removePublishStreamUrl(url);
686+
m_mapRepublishFlag[url] = true;
687+
CString strUrl;
688+
strUrl.Format(_T("%S"), url);
689+
for (int i = 0; i < m_cmbRtmpUrl.GetCount(); ++i) {
690+
CString strText;
691+
m_cmbRtmpUrl.GetLBText(i, strText);
692+
if (strText.Compare(strUrl) == 0) {
693+
m_cmbRtmpUrl.DeleteString(i);
694+
break;
695+
}
696+
}
697+
698+
if (m_urlSet.find(strUrl) != m_urlSet.end()) {
699+
m_urlSet.erase(strUrl);
700+
}
701+
702+
if (m_cmbRtmpUrl.GetCurSel() < 0 && m_cmbRtmpUrl.GetCount() > 0)
703+
m_cmbRtmpUrl.SetCurSel(0);
704+
}
705+
else if (error == 155) {
706+
m_rtcEngine->addPublishStreamUrl(url, false);
707+
708+
if (m_mapUrlToTimer.find(url) == m_mapUrlToTimer.end()) {
709+
LastTimer_Republish_id++;
710+
m_mapUrlToTimer[url] = LastTimer_Republish_id;
711+
m_mapTimerToUrl[LastTimer_Republish_id] = url;
712+
m_mapTimerToRepublishCount[LastTimer_Republish_id] = 1;
713+
714+
SetTimer(LastTimer_Republish_id, 1000, NULL);
715+
}
716+
717+
}
718+
719+
720+
delete[] url;
721+
url = nullptr;
722+
return 0;
723+
}
724+
725+
726+
void CAgoraRtmpStreamingDlg::OnTimer(UINT_PTR nIDEvent)
727+
{
728+
if (m_mapTimerToRepublishCount.find(nIDEvent)
729+
!= m_mapTimerToRepublishCount.end()) {
730+
if (m_mapTimerToRepublishCount[nIDEvent] == 5) {
731+
KillTimer(nIDEvent);
732+
m_mapUrlToTimer.erase(m_mapTimerToUrl[nIDEvent]);
733+
m_mapTimerToRepublishCount.erase(nIDEvent);
734+
m_mapTimerToUrl.erase(nIDEvent);
735+
return;
736+
}
737+
738+
m_mapTimerToRepublishCount[nIDEvent]++;
739+
m_rtcEngine->addPublishStreamUrl(m_mapTimerToUrl[nIDEvent].c_str(), false);
740+
}
741+
}

windows/APIExample/APIExample/Advanced/RTMPStream/AgoraRtmpStreaming.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma once
1+
#pragma once
22
#include "AGVideoWnd.h"
33
#include <set>
44

@@ -73,6 +73,36 @@ class CAgoraRtmpStreamingDlgRtcEngineEventHandler
7373
*/
7474
virtual void onRtmpStreamingStateChanged(const char *url, RTMP_STREAM_PUBLISH_STATE state, RTMP_STREAM_PUBLISH_ERROR errCode)override;
7575

76+
/** @deprecated This method is deprecated, use the \ref agora::rtc::IRtcEngineEventHandler::onRtmpStreamingStateChanged "onRtmpStreamingStateChanged" callback instead.
77+
78+
Reports the result of calling the \ref agora::rtc::IRtcEngine::removePublishStreamUrl "removePublishStreamUrl" method. (CDN live only.)
79+
80+
This callback indicates whether you have successfully removed an RTMP stream from the CDN.
81+
82+
@param url The RTMP URL address.
83+
*/
84+
virtual void onStreamUnpublished(const char *url) override;
85+
86+
/** @deprecated This method is deprecated, use the \ref agora::rtc::IRtcEngineEventHandler::onRtmpStreamingStateChanged "onRtmpStreamingStateChanged" callback instead.
87+
88+
Reports the result of calling the \ref IRtcEngine::addPublishStreamUrl "addPublishStreamUrl" method. (CDN live only.)
89+
90+
@param url The RTMP URL address.
91+
@param error Error code: #ERROR_CODE_TYPE. Main errors include:
92+
- #ERR_OK (0): The publishing succeeds.
93+
- #ERR_FAILED (1): The publishing fails.
94+
- #ERR_INVALID_ARGUMENT (2): Invalid argument used. If, for example, you did not call \ref agora::rtc::IRtcEngine::setLiveTranscoding "setLiveTranscoding" to configure LiveTranscoding before calling \ref agora::rtc::IRtcEngine::addPublishStreamUrl "addPublishStreamUrl", the SDK reports #ERR_INVALID_ARGUMENT.
95+
- #ERR_TIMEDOUT (10): The publishing timed out.
96+
- #ERR_ALREADY_IN_USE (19): The chosen URL address is already in use for CDN live streaming.
97+
- #ERR_RESOURCE_LIMITED (22): The backend system does not have enough resources for the CDN live streaming.
98+
- #ERR_ENCRYPTED_STREAM_NOT_ALLOWED_PUBLISH (130): You cannot publish an encrypted stream.
99+
- #ERR_PUBLISH_STREAM_CDN_ERROR (151)
100+
- #ERR_PUBLISH_STREAM_NUM_REACH_LIMIT (152)
101+
- #ERR_PUBLISH_STREAM_NOT_AUTHORIZED (153)
102+
- #ERR_PUBLISH_STREAM_INTERNAL_SERVER_ERROR (154)
103+
- #ERR_PUBLISH_STREAM_FORMAT_NOT_SUPPORTED (156)
104+
*/
105+
virtual void onStreamPublished(const char *url, int error);
76106
private:
77107
HWND m_hMsgHanlder;
78108
};
@@ -119,6 +149,9 @@ class CAgoraRtmpStreamingDlg : public CDialogEx
119149
int m_removeUrlCount = 0;
120150
std::set<CString> m_urlSet;
121151

152+
std::map<std::string, bool> m_mapRepublishFlag;
153+
std::map<std::string, bool> m_mapRemoveFlag;// remove falg when leavechannel
154+
122155
LiveTranscoding m_liveTransCoding;
123156
public:
124157
virtual BOOL OnInitDialog();
@@ -134,6 +167,9 @@ class CAgoraRtmpStreamingDlg : public CDialogEx
134167
afx_msg LRESULT OnEIDLeaveChannel(WPARAM wParam, LPARAM lParam);
135168
afx_msg LRESULT OnEIDRtmpStateChanged(WPARAM wParam, LPARAM lParam);
136169
afx_msg void OnSelchangeListInfoBroadcasting();
170+
afx_msg LRESULT OnEIDStreamUnpublished(WPARAM wParam, LPARAM lParam);
171+
afx_msg LRESULT OnEIDStreamPublished(WPARAM wParam, LPARAM lParam);
172+
afx_msg void OnTimer(UINT_PTR nIDEvent);
137173
virtual BOOL PreTranslateMessage(MSG* pMsg);
138174

139175
CEdit m_edtChannelName;
@@ -151,4 +187,9 @@ class CAgoraRtmpStreamingDlg : public CDialogEx
151187
CStatic m_staVideoArea;
152188
CStatic m_staDetail;
153189
CButton m_chkTransCoding;
190+
int LastTimer_Republish_id = 100000;
191+
192+
std::map<std::string, int> m_mapUrlToTimer;
193+
std::map<int, std::string> m_mapTimerToUrl;
194+
std::map<int, int> m_mapTimerToRepublishCount;
154195
};

windows/APIExample/APIExample/stdafx.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,12 @@ using namespace agora::media;
8282
#define EID_LOCAL_VIDEO_STATS 0x00000013
8383
#define EID_CHANNEL_MEDIA_RELAY_STATE_CHNAGENED 0x00000014
8484
#define EID_CHANNEL_MEDIA_RELAY_EVENT 0x00000015
85-
86-
85+
#define EID_RTMP_STREAM_STATE_PUBLISHED 0x00000016
86+
#define EID_RTMP_STREAM_STATE_UNPUBLISHED 0x00000017
87+
typedef struct _StreamPublished {
88+
char* url;
89+
int error;
90+
}StreamPublished, *PStreamPublished, *LPStreamPublished;
8791

8892
typedef struct _tagRtmpStreamStateChanged {
8993
char* url;

0 commit comments

Comments
 (0)