diff --git a/trunk/research/librtmp/Makefile b/trunk/research/librtmp/Makefile old mode 100755 new mode 100644 index 76b420dfd..54d0a6737 --- a/trunk/research/librtmp/Makefile +++ b/trunk/research/librtmp/Makefile @@ -3,7 +3,7 @@ GCC = gcc ifeq ($(HANDSHAKE),) ST_ALL = help else - ST_ALL = srs_flv_parser srs_flv_injecter srs_publish srs_play srs_ingest_flv srs_ingest_rtmp + ST_ALL = srs_flv_parser srs_flv_injecter srs_publish srs_play srs_ingest_flv srs_ingest_rtmp srs_detect_rtmp endif .PHONY: default clean help ssl nossl @@ -11,17 +11,19 @@ endif default: $(ST_ALL) help: - @echo "Usage: make |||||||" + @echo "Usage: make |||" @echo " help display this help" @echo " clean cleanup build" @echo " ssl all tools link ssl" @echo " nossl all tools never link ssl" + @echo "ssl/nossl will build the following tools:" @echo " srs_flv_parser parse flv file, print detail info." @echo " srs_flv_injecter inject keyframes information to metadata." @echo " srs_publish publish program using srs-librtmp" @echo " srs_play play program using srs-librtmp" @echo " srs_ingest_flv ingest flv file and publish to RTMP server." @echo " srs_ingest_rtmp ingest RTMP and publish to RTMP server." + @echo " srs_detect_rtmp detect RTMP stream info." @echo "Remark: about simple/complex handshake, see: http://blog.csdn.net/win_lin/article/details/13006803" @echo "Remark: srs Makefile will auto invoke this by --with/without-ssl, " @echo " that is, if user specified ssl(by --with-ssl), srs will make this by 'make ssl'" @@ -30,7 +32,7 @@ help: @echo "Remark: before make this sample, user must make the srs, with/without ssl" clean: - @rm -f srs_flv_parser srs_flv_injecter srs_publish srs_play srs_ingest_flv srs_ingest_rtmp + @rm -f srs_flv_parser srs_flv_injecter srs_publish srs_play srs_ingest_flv srs_ingest_rtmp srs_detect_rtmp # srs library root SRS_OBJS = ../../objs @@ -81,3 +83,6 @@ srs_ingest_flv: srs_ingest_flv.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIB srs_ingest_rtmp: srs_ingest_rtmp.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(GCC) srs_ingest_rtmp.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_ingest_rtmp + +srs_detect_rtmp: srs_detect_rtmp.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) + $(GCC) srs_detect_rtmp.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_detect_rtmp diff --git a/trunk/research/librtmp/srs_detect_rtmp.c b/trunk/research/librtmp/srs_detect_rtmp.c new file mode 100644 index 000000000..853c2a797 --- /dev/null +++ b/trunk/research/librtmp/srs_detect_rtmp.c @@ -0,0 +1,91 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/** +gcc srs_detect_rtmp.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_detect_rtmp +*/ + +#include +#include + +#include "../../objs/include/srs_librtmp.h" + +int main(int argc, char** argv) +{ + srs_rtmp_t rtmp; + + // packet data + int type, size; + u_int32_t timestamp = 0; + char* data; + + if (argc <= 1) { + printf("detect stream on RTMP server\n" + "Usage: %s \n" + " rtmp_url RTMP stream url to play\n" + "For example:\n" + " %s rtmp://127.0.0.1:1935/live/livestream\n", + argv[0]); + int ret = 1; + exit(ret); + return ret; + } + + rtmp = srs_rtmp_create(argv[1]); + + printf("detect rtmp stream\n"); + printf("srs(simple-rtmp-server) client librtmp library.\n"); + printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); + printf("rtmp url: %s\n", rtmp); + + if (srs_simple_handshake(rtmp) != 0) { + printf("simple handshake failed.\n"); + goto rtmp_destroy; + } + printf("simple handshake success\n"); + + if (srs_connect_app(rtmp) != 0) { + printf("connect vhost/app failed.\n"); + goto rtmp_destroy; + } + printf("connect vhost/app success\n"); + + if (srs_play_stream(rtmp) != 0) { + printf("play stream failed.\n"); + goto rtmp_destroy; + } + printf("play stream success\n"); + + for (;;) { + if (srs_read_packet(rtmp, &type, ×tamp, &data, &size) != 0) { + goto rtmp_destroy; + } + printf("got packet: type=%s, time=%d, size=%d\n", srs_type2string(type), timestamp, size); + + free(data); + } + +rtmp_destroy: + srs_rtmp_destroy(rtmp); + + return 0; +} diff --git a/trunk/src/app/srs_app_avc_aac.hpp b/trunk/src/app/srs_app_avc_aac.hpp index a196051de..790f921e3 100644 --- a/trunk/src/app/srs_app_avc_aac.hpp +++ b/trunk/src/app/srs_app_avc_aac.hpp @@ -32,6 +32,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include +class SrsStream; + #define SRS_MAX_CODEC_SAMPLE 128 // Sampling rate. The following values are defined: diff --git a/trunk/src/srs/srs.upp b/trunk/src/srs/srs.upp index 228c37241..e30f5a8fb 100755 --- a/trunk/src/srs/srs.upp +++ b/trunk/src/srs/srs.upp @@ -115,6 +115,7 @@ file ..\utest\srs_utest_handshake.hpp, ..\utest\srs_utest_handshake.cpp, research readonly separator, + ..\..\research\librtmp\srs_detect_rtmp.c, ..\..\research\librtmp\srs_flv_injecter.c, ..\..\research\librtmp\srs_flv_parser.c, ..\..\research\librtmp\srs_ingest_flv.c,