正在显示
4 个修改的文件
包含
73 行增加
和
0 行删除
@@ -23,19 +23,53 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -23,19 +23,53 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
23 | 23 | ||
24 | #include <srs_core_forward.hpp> | 24 | #include <srs_core_forward.hpp> |
25 | 25 | ||
26 | +#include <stdlib.h> | ||
27 | + | ||
26 | #include <srs_core_error.hpp> | 28 | #include <srs_core_error.hpp> |
29 | +#include <srs_core_rtmp.hpp> | ||
30 | +#include <srs_core_log.hpp> | ||
27 | 31 | ||
28 | SrsForwarder::SrsForwarder() | 32 | SrsForwarder::SrsForwarder() |
29 | { | 33 | { |
34 | + client = new SrsRtmpClient(); | ||
35 | + port = 1935; | ||
36 | + tid = NULL; | ||
37 | + loop = false; | ||
30 | } | 38 | } |
31 | 39 | ||
32 | SrsForwarder::~SrsForwarder() | 40 | SrsForwarder::~SrsForwarder() |
33 | { | 41 | { |
42 | + srs_freep(client); | ||
43 | + | ||
44 | + if (tid) { | ||
45 | + loop = false; | ||
46 | + st_thread_interrupt(tid); | ||
47 | + st_thread_join(tid, NULL); | ||
48 | + tid = NULL; | ||
49 | + } | ||
34 | } | 50 | } |
35 | 51 | ||
36 | int SrsForwarder::on_publish(std::string vhost, std::string app, std::string stream, std::string forward_server) | 52 | int SrsForwarder::on_publish(std::string vhost, std::string app, std::string stream, std::string forward_server) |
37 | { | 53 | { |
38 | int ret = ERROR_SUCCESS; | 54 | int ret = ERROR_SUCCESS; |
55 | + | ||
56 | + tc_url = "rtmp://"; | ||
57 | + tc_url += vhost; | ||
58 | + tc_url += "/"; | ||
59 | + tc_url += app; | ||
60 | + | ||
61 | + stream_name = stream; | ||
62 | + server = forward_server; | ||
63 | + | ||
64 | + size_t pos = forward_server.find(":"); | ||
65 | + if (pos != std::string::npos) { | ||
66 | + port = ::atoi(forward_server.substr(pos + 1).c_str()); | ||
67 | + server = forward_server.substr(0, pos); | ||
68 | + } | ||
69 | + | ||
70 | + srs_trace("forward stream=%s, tcUrl=%s to server=%s, port=%d", | ||
71 | + stream_name.c_str(), tc_url.c_str(), server.c_str(), port); | ||
72 | + | ||
39 | return ret; | 73 | return ret; |
40 | } | 74 | } |
41 | 75 |
@@ -33,12 +33,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -33,12 +33,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
33 | 33 | ||
34 | class SrsSharedPtrMessage; | 34 | class SrsSharedPtrMessage; |
35 | class SrsOnMetaDataPacket; | 35 | class SrsOnMetaDataPacket; |
36 | +class SrsRtmpClient; | ||
36 | 37 | ||
37 | /** | 38 | /** |
38 | * forward the stream to other servers. | 39 | * forward the stream to other servers. |
39 | */ | 40 | */ |
40 | class SrsForwarder | 41 | class SrsForwarder |
41 | { | 42 | { |
43 | +private: | ||
44 | + std::string tc_url; | ||
45 | + std::string stream_name; | ||
46 | + std::string server; | ||
47 | + int port; | ||
48 | + SrsRtmpClient* client; | ||
49 | + st_thread_t tid; | ||
50 | + bool loop; | ||
42 | public: | 51 | public: |
43 | SrsForwarder(); | 52 | SrsForwarder(); |
44 | virtual ~SrsForwarder(); | 53 | virtual ~SrsForwarder(); |
@@ -163,6 +163,24 @@ SrsResponse::~SrsResponse() | @@ -163,6 +163,24 @@ SrsResponse::~SrsResponse() | ||
163 | { | 163 | { |
164 | } | 164 | } |
165 | 165 | ||
166 | +SrsRtmpClient::SrsRtmpClient() | ||
167 | +{ | ||
168 | + stfd = NULL; | ||
169 | +} | ||
170 | + | ||
171 | +SrsRtmpClient::~SrsRtmpClient() | ||
172 | +{ | ||
173 | + if (stfd) { | ||
174 | + int fd = st_netfd_fileno(stfd); | ||
175 | + st_netfd_close(stfd); | ||
176 | + stfd = NULL; | ||
177 | + | ||
178 | + // st does not close it sometimes, | ||
179 | + // close it manually. | ||
180 | + close(fd); | ||
181 | + } | ||
182 | +} | ||
183 | + | ||
166 | SrsRtmp::SrsRtmp(st_netfd_t client_stfd) | 184 | SrsRtmp::SrsRtmp(st_netfd_t client_stfd) |
167 | { | 185 | { |
168 | protocol = new SrsProtocol(client_stfd); | 186 | protocol = new SrsProtocol(client_stfd); |
@@ -93,6 +93,18 @@ enum SrsClientType | @@ -93,6 +93,18 @@ enum SrsClientType | ||
93 | }; | 93 | }; |
94 | 94 | ||
95 | /** | 95 | /** |
96 | +* implements the client role protocol. | ||
97 | +*/ | ||
98 | +class SrsRtmpClient | ||
99 | +{ | ||
100 | +private: | ||
101 | + st_netfd_t stfd; | ||
102 | +public: | ||
103 | + SrsRtmpClient(); | ||
104 | + virtual ~SrsRtmpClient(); | ||
105 | +}; | ||
106 | + | ||
107 | +/** | ||
96 | * the rtmp provices rtmp-command-protocol services, | 108 | * the rtmp provices rtmp-command-protocol services, |
97 | * a high level protocol, media stream oriented services, | 109 | * a high level protocol, media stream oriented services, |
98 | * such as connect to vhost/app, play stream, get audio/video data. | 110 | * such as connect to vhost/app, play stream, get audio/video data. |
-
请 注册 或 登录 后发表评论