正在显示
6 个修改的文件
包含
49 行增加
和
18 行删除
| @@ -116,6 +116,7 @@ cd simple-rtmp-server/trunk | @@ -116,6 +116,7 @@ cd simple-rtmp-server/trunk | ||
| 116 | 116 | ||
| 117 | <strong>See also:</strong> | 117 | <strong>See also:</strong> |
| 118 | * Usage: How to delivery RTMP?([CN][v1_CN_SampleRTMP], [EN][v1_EN_SampleRTMP]) | 118 | * Usage: How to delivery RTMP?([CN][v1_CN_SampleRTMP], [EN][v1_EN_SampleRTMP]) |
| 119 | +* Usage: How to delivery RTMP Cluster?([CN][v1_CN_SampleRTMPCluster], [EN][v1_EN_SampleRTMPCluster]) | ||
| 119 | * Usage: How to delivery HTTP FLV Live Streaming?([CN][v2_CN_SampleHttpFlv], [EN][v2_EN_SampleHttpFlv]) | 120 | * Usage: How to delivery HTTP FLV Live Streaming?([CN][v2_CN_SampleHttpFlv], [EN][v2_EN_SampleHttpFlv]) |
| 120 | * Usage: How to delivery HTTP FLV Live Streaming Cluster?([CN][v2_CN_SampleHttpFlvCluster], [EN][v2_EN_SampleHttpFlvCluster]) | 121 | * Usage: How to delivery HTTP FLV Live Streaming Cluster?([CN][v2_CN_SampleHttpFlvCluster], [EN][v2_EN_SampleHttpFlvCluster]) |
| 121 | * Usage: How to delivery HLS?([CN][v1_CN_SampleHLS], [EN][v1_EN_SampleHLS]) | 122 | * Usage: How to delivery HLS?([CN][v1_CN_SampleHLS], [EN][v1_EN_SampleHLS]) |
| @@ -343,6 +344,7 @@ Remark: | @@ -343,6 +344,7 @@ Remark: | ||
| 343 | 344 | ||
| 344 | ### SRS 2.0 history | 345 | ### SRS 2.0 history |
| 345 | 346 | ||
| 347 | +* v2.0, 2015-05-24, fix [#404](https://github.com/simple-rtmp-server/srs/issues/404) register handler then start http thread. 2.0.167. | ||
| 346 | * v2.0, 2015-05-23, refine the thread, protocol, kbps code. 2.0.166 | 348 | * v2.0, 2015-05-23, refine the thread, protocol, kbps code. 2.0.166 |
| 347 | * v2.0, 2015-05-23, fix [#391](https://github.com/simple-rtmp-server/srs/issues/391) copy request for async call. | 349 | * v2.0, 2015-05-23, fix [#391](https://github.com/simple-rtmp-server/srs/issues/391) copy request for async call. |
| 348 | * v2.0, 2015-05-22, fix [#397](https://github.com/simple-rtmp-server/srs/issues/397) the USER_HZ maybe not 100. 2.0.165 | 350 | * v2.0, 2015-05-22, fix [#397](https://github.com/simple-rtmp-server/srs/issues/397) the USER_HZ maybe not 100. 2.0.165 |
| @@ -843,6 +845,8 @@ Winlin | @@ -843,6 +845,8 @@ Winlin | ||
| 843 | [v1_EN_Git]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_Git | 845 | [v1_EN_Git]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_Git |
| 844 | [v1_CN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleRTMP | 846 | [v1_CN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleRTMP |
| 845 | [v1_EN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleRTMP | 847 | [v1_EN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleRTMP |
| 848 | +[v1_CN_SampleRTMPCluster]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleRTMPCluster | ||
| 849 | +[v1_EN_SampleRTMPCluster]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleRTMPCluster | ||
| 846 | [v1_CN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleHLS | 850 | [v1_CN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleHLS |
| 847 | [v1_EN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleHLS | 851 | [v1_EN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleHLS |
| 848 | [v1_CN_SampleTranscode2HLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleTranscode2HLS | 852 | [v1_CN_SampleTranscode2HLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleTranscode2HLS |
| @@ -504,11 +504,7 @@ if [ $__SRS_BUILD_NGINX = YES ]; then | @@ -504,11 +504,7 @@ if [ $__SRS_BUILD_NGINX = YES ]; then | ||
| 504 | # srs will write ts/m3u8 file use current user, | 504 | # srs will write ts/m3u8 file use current user, |
| 505 | # nginx default use nobody, so cannot read the ts/m3u8 created by srs. | 505 | # nginx default use nobody, so cannot read the ts/m3u8 created by srs. |
| 506 | cp ${SRS_OBJS}/nginx/conf/nginx.conf ${SRS_OBJS}/nginx/conf/nginx.conf.bk | 506 | cp ${SRS_OBJS}/nginx/conf/nginx.conf ${SRS_OBJS}/nginx/conf/nginx.conf.bk |
| 507 | - if [ $OS_IS_OSX = YES ]; then | ||
| 508 | - sed -i '' "s/^.user nobody;/user `whoami`;/g" ${SRS_OBJS}/nginx/conf/nginx.conf | ||
| 509 | - else | ||
| 510 | - sed -i "s/^.user nobody;/user `whoami`;/g" ${SRS_OBJS}/nginx/conf/nginx.conf | ||
| 511 | - fi | 507 | + $SED '' "s/^.user nobody;/user `whoami`;/g" ${SRS_OBJS}/nginx/conf/nginx.conf |
| 512 | fi | 508 | fi |
| 513 | 509 | ||
| 514 | # the demo dir. | 510 | # the demo dir. |
| 1 | #!/bin/bash | 1 | #!/bin/bash |
| 2 | 2 | ||
| 3 | +OS_IS_OSX=NO | ||
| 4 | +uname -s|grep Darwin >/dev/null 2>&1 | ||
| 5 | +ret=$?; if [[ 0 -eq $ret ]]; then | ||
| 6 | + OS_IS_OSX=YES | ||
| 7 | +fi | ||
| 8 | +echo "Is OSX: ${OS_IS_OSX}" | ||
| 9 | + | ||
| 10 | +# the sed command | ||
| 11 | +SED="sed -i" | ||
| 12 | +if [ $OS_IS_OSX = YES ]; then SED="sed -i ''"; fi | ||
| 13 | + | ||
| 3 | # when export srs-librtmp single files | 14 | # when export srs-librtmp single files |
| 4 | # package the whole project to srs_librtmp.h and srs_librtmp.cpp | 15 | # package the whole project to srs_librtmp.h and srs_librtmp.cpp |
| 5 | # | 16 | # |
| @@ -59,7 +70,7 @@ function build_module_hpp() | @@ -59,7 +70,7 @@ function build_module_hpp() | ||
| 59 | for item in ${SRS_LIBRTMP_OBJS[*]}; do | 70 | for item in ${SRS_LIBRTMP_OBJS[*]}; do |
| 60 | FILE_NAME="${item%.*}" | 71 | FILE_NAME="${item%.*}" |
| 61 | echo "// following is generated by ${FILE_NAME}.hpp" >> $FILE && | 72 | echo "// following is generated by ${FILE_NAME}.hpp" >> $FILE && |
| 62 | - sed -i "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp && | 73 | + $SED "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp && |
| 63 | cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp >>$FILE | 74 | cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp >>$FILE |
| 64 | ret=$?; if [[ $ret -ne 0 ]]; then | 75 | ret=$?; if [[ $ret -ne 0 ]]; then |
| 65 | echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.hpp. {${BLACK}" | 76 | echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.hpp. {${BLACK}" |
| @@ -78,7 +89,7 @@ function build_module_cpp() | @@ -78,7 +89,7 @@ function build_module_cpp() | ||
| 78 | for item in ${SRS_LIBRTMP_OBJS[*]}; do | 89 | for item in ${SRS_LIBRTMP_OBJS[*]}; do |
| 79 | FILE_NAME="${item%.*}" | 90 | FILE_NAME="${item%.*}" |
| 80 | echo "// following is generated by ${FILE_NAME}.cpp" >> $FILE && | 91 | echo "// following is generated by ${FILE_NAME}.cpp" >> $FILE && |
| 81 | - sed -i "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp && | 92 | + $SED "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp && |
| 82 | cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp >>$FILE | 93 | cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp >>$FILE |
| 83 | ret=$?; if [[ $ret -ne 0 ]]; then | 94 | ret=$?; if [[ $ret -ne 0 ]]; then |
| 84 | echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.cpp. {${BLACK}" | 95 | echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.cpp. {${BLACK}" |
| @@ -1854,17 +1854,20 @@ int SrsHttpServer::http_mount(SrsSource* s, SrsRequest* r) | @@ -1854,17 +1854,20 @@ int SrsHttpServer::http_mount(SrsSource* s, SrsRequest* r) | ||
| 1854 | 1854 | ||
| 1855 | sflvs[sid] = entry; | 1855 | sflvs[sid] = entry; |
| 1856 | 1856 | ||
| 1857 | - // start http stream cache thread | ||
| 1858 | - if ((ret = entry->cache->start()) != ERROR_SUCCESS) { | ||
| 1859 | - srs_error("http: start stream cache failed. ret=%d", ret); | ||
| 1860 | - return ret; | ||
| 1861 | - } | ||
| 1862 | - | ||
| 1863 | // mount the http flv stream. | 1857 | // mount the http flv stream. |
| 1858 | + // we must register the handler, then start the thread, | ||
| 1859 | + // for the thread will cause thread switch context. | ||
| 1860 | + // @see https://github.com/simple-rtmp-server/srs/issues/404 | ||
| 1864 | if ((ret = mux.handle(mount, entry->stream)) != ERROR_SUCCESS) { | 1861 | if ((ret = mux.handle(mount, entry->stream)) != ERROR_SUCCESS) { |
| 1865 | srs_error("http: mount flv stream for vhost=%s failed. ret=%d", sid.c_str(), ret); | 1862 | srs_error("http: mount flv stream for vhost=%s failed. ret=%d", sid.c_str(), ret); |
| 1866 | return ret; | 1863 | return ret; |
| 1867 | } | 1864 | } |
| 1865 | + | ||
| 1866 | + // start http stream cache thread | ||
| 1867 | + if ((ret = entry->cache->start()) != ERROR_SUCCESS) { | ||
| 1868 | + srs_error("http: start stream cache failed. ret=%d", ret); | ||
| 1869 | + return ret; | ||
| 1870 | + } | ||
| 1868 | srs_trace("http: mount flv stream for vhost=%s, mount=%s", sid.c_str(), mount.c_str()); | 1871 | srs_trace("http: mount flv stream for vhost=%s, mount=%s", sid.c_str(), mount.c_str()); |
| 1869 | } else { | 1872 | } else { |
| 1870 | entry = sflvs[sid]; | 1873 | entry = sflvs[sid]; |
| @@ -786,6 +786,13 @@ int SrsServer::http_handle() | @@ -786,6 +786,13 @@ int SrsServer::http_handle() | ||
| 786 | return ret; | 786 | return ret; |
| 787 | } | 787 | } |
| 788 | #endif | 788 | #endif |
| 789 | + | ||
| 790 | +#ifdef SRS_AUTO_HTTP_SERVER | ||
| 791 | + // for SRS go-sharp to detect the status of HTTP server of SRS HTTP FLV Cluster. | ||
| 792 | + if ((ret = http_stream_mux->mux.handle("/api/v1/versions", new SrsGoApiVersion())) != ERROR_SUCCESS) { | ||
| 793 | + return ret; | ||
| 794 | + } | ||
| 795 | +#endif | ||
| 789 | 796 | ||
| 790 | return ret; | 797 | return ret; |
| 791 | } | 798 | } |
| @@ -134,7 +134,9 @@ int SrsFlvEncoder::write_metadata(char type, char* data, int size) | @@ -134,7 +134,9 @@ int SrsFlvEncoder::write_metadata(char type, char* data, int size) | ||
| 134 | tag_stream->write_3bytes(size); | 134 | tag_stream->write_3bytes(size); |
| 135 | 135 | ||
| 136 | if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) { | 136 | if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) { |
| 137 | - srs_error("write flv data tag failed. ret=%d", ret); | 137 | + if (!srs_is_client_gracefully_close(ret)) { |
| 138 | + srs_error("write flv data tag failed. ret=%d", ret); | ||
| 139 | + } | ||
| 138 | return ret; | 140 | return ret; |
| 139 | } | 141 | } |
| 140 | 142 | ||
| @@ -168,7 +170,9 @@ int SrsFlvEncoder::write_audio(int64_t timestamp, char* data, int size) | @@ -168,7 +170,9 @@ int SrsFlvEncoder::write_audio(int64_t timestamp, char* data, int size) | ||
| 168 | tag_stream->write_1bytes((timestamp >> 24) & 0xFF); | 170 | tag_stream->write_1bytes((timestamp >> 24) & 0xFF); |
| 169 | 171 | ||
| 170 | if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) { | 172 | if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) { |
| 171 | - srs_error("write flv audio tag failed. ret=%d", ret); | 173 | + if (!srs_is_client_gracefully_close(ret)) { |
| 174 | + srs_error("write flv audio tag failed. ret=%d", ret); | ||
| 175 | + } | ||
| 172 | return ret; | 176 | return ret; |
| 173 | } | 177 | } |
| 174 | 178 | ||
| @@ -221,13 +225,17 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s | @@ -221,13 +225,17 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s | ||
| 221 | 225 | ||
| 222 | // write tag header. | 226 | // write tag header. |
| 223 | if ((ret = _fs->write(header, header_size, NULL)) != ERROR_SUCCESS) { | 227 | if ((ret = _fs->write(header, header_size, NULL)) != ERROR_SUCCESS) { |
| 224 | - srs_error("write flv tag header failed. ret=%d", ret); | 228 | + if (!srs_is_client_gracefully_close(ret)) { |
| 229 | + srs_error("write flv tag header failed. ret=%d", ret); | ||
| 230 | + } | ||
| 225 | return ret; | 231 | return ret; |
| 226 | } | 232 | } |
| 227 | 233 | ||
| 228 | // write tag data. | 234 | // write tag data. |
| 229 | if ((ret = _fs->write(tag, tag_size, NULL)) != ERROR_SUCCESS) { | 235 | if ((ret = _fs->write(tag, tag_size, NULL)) != ERROR_SUCCESS) { |
| 230 | - srs_error("write flv tag failed. ret=%d", ret); | 236 | + if (!srs_is_client_gracefully_close(ret)) { |
| 237 | + srs_error("write flv tag failed. ret=%d", ret); | ||
| 238 | + } | ||
| 231 | return ret; | 239 | return ret; |
| 232 | } | 240 | } |
| 233 | 241 | ||
| @@ -238,7 +246,9 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s | @@ -238,7 +246,9 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s | ||
| 238 | } | 246 | } |
| 239 | tag_stream->write_4bytes(tag_size + header_size); | 247 | tag_stream->write_4bytes(tag_size + header_size); |
| 240 | if ((ret = _fs->write(pre_size, sizeof(pre_size), NULL)) != ERROR_SUCCESS) { | 248 | if ((ret = _fs->write(pre_size, sizeof(pre_size), NULL)) != ERROR_SUCCESS) { |
| 241 | - srs_error("write flv previous tag size failed. ret=%d", ret); | 249 | + if (!srs_is_client_gracefully_close(ret)) { |
| 250 | + srs_error("write flv previous tag size failed. ret=%d", ret); | ||
| 251 | + } | ||
| 242 | return ret; | 252 | return ret; |
| 243 | } | 253 | } |
| 244 | 254 |
-
请 注册 或 登录 后发表评论