mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
ingest rtmp to rtmp by srs-librtmp
This commit is contained in:
parent
608b28f223
commit
f17f5de7d1
1 changed files with 141 additions and 7 deletions
|
@ -30,20 +30,154 @@ gcc srs_ingest_rtmp.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_ingest
|
||||||
|
|
||||||
#include "../../objs/include/srs_librtmp.h"
|
#include "../../objs/include/srs_librtmp.h"
|
||||||
|
|
||||||
|
#define trace(msg, ...) printf(msg, ##__VA_ARGS__);printf("\n")
|
||||||
|
#define verbose(msg, ...) printf(msg, ##__VA_ARGS__);printf("\n")
|
||||||
|
#if 1
|
||||||
|
#undef verbose
|
||||||
|
#define verbose(msg, ...) (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int connect_ic(srs_rtmp_t irtmp);
|
||||||
|
int connect_oc(srs_rtmp_t ortmp);
|
||||||
|
int proxy(srs_rtmp_t irtmp, srs_rtmp_t ortmp);
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
// user option parse index.
|
||||||
|
int opt = 0;
|
||||||
|
// user options.
|
||||||
|
char* in_rtmp_url; char* out_rtmp_url;
|
||||||
|
// rtmp handler
|
||||||
|
srs_rtmp_t irtmp, ortmp;
|
||||||
|
|
||||||
if (argc <= 2) {
|
if (argc <= 2) {
|
||||||
printf("ingest RTMP and publish to RTMP server\n"
|
printf("ingest RTMP and publish to RTMP server\n"
|
||||||
"Usage: %s <in_rtmp_url> <out_rtmp_url>\n"
|
"Usage: %s <-i in_rtmp_url> <-y out_rtmp_url>\n"
|
||||||
" in_rtmp_url input rtmp url, ingest from this url.\n"
|
" in_rtmp_url input rtmp url, ingest from this url.\n"
|
||||||
" out_rtmp_url output rtmp url, publish to this url.\n",
|
" out_rtmp_url output rtmp url, publish to this url.\n"
|
||||||
|
"For example:\n"
|
||||||
|
" %s -i rtmp://127.0.0.1/live/livestream -y rtmp://127.0.0.1/live/demo\n",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
exit(1);
|
ret = 1;
|
||||||
|
exit(ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("ingest RTMP and publish to RTMP server like edge.\n");
|
// parse options in FFMPEG format.
|
||||||
printf("srs(simple-rtmp-server) client librtmp library.\n");
|
while ((opt = getopt(argc, argv, "i:y:")) != -1) {
|
||||||
printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision());
|
switch (opt) {
|
||||||
|
case 'i':
|
||||||
|
in_rtmp_url = optarg;
|
||||||
|
break;
|
||||||
|
case 'y':
|
||||||
|
out_rtmp_url = optarg;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
trace("ingest RTMP and publish to RTMP server like edge.");
|
||||||
|
trace("srs(simple-rtmp-server) client librtmp library.");
|
||||||
|
trace("version: %d.%d.%d", srs_version_major(), srs_version_minor(), srs_version_revision());
|
||||||
|
trace("input: %s", in_rtmp_url);
|
||||||
|
trace("output: %s", out_rtmp_url);
|
||||||
|
|
||||||
|
irtmp = srs_rtmp_create(in_rtmp_url);
|
||||||
|
ortmp = srs_rtmp_create(out_rtmp_url);
|
||||||
|
|
||||||
|
ret = proxy(irtmp, ortmp);
|
||||||
|
trace("proxy completed");
|
||||||
|
|
||||||
|
srs_rtmp_destroy(irtmp);
|
||||||
|
srs_rtmp_destroy(ortmp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int proxy(srs_rtmp_t irtmp, srs_rtmp_t ortmp)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
// packet data
|
||||||
|
int type, size;
|
||||||
|
u_int32_t timestamp = 0;
|
||||||
|
char* data = NULL;
|
||||||
|
|
||||||
|
if ((ret = connect_ic(irtmp)) != 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if ((ret = connect_oc(ortmp)) != 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
trace("start proxy RTMP stream");
|
||||||
|
for (;;) {
|
||||||
|
if ((ret = srs_read_packet(irtmp, &type, ×tamp, &data, &size)) != 0) {
|
||||||
|
trace("irtmp get packet failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
verbose("irtmp got packet: type=%s, time=%d, size=%d",
|
||||||
|
srs_type2string(type), timestamp, size);
|
||||||
|
|
||||||
|
if ((ret = srs_write_packet(ortmp, type, timestamp, data, size)) != 0) {
|
||||||
|
trace("irtmp get packet failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
verbose("ortmp sent packet: type=%s, time=%d, size=%d",
|
||||||
|
srs_type2string(type), timestamp, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int connect_ic(srs_rtmp_t irtmp)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if ((ret = srs_simple_handshake(irtmp)) != 0) {
|
||||||
|
trace("irtmp simple handshake failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
trace("irtmp simple handshake success");
|
||||||
|
|
||||||
|
if ((ret = srs_connect_app(irtmp)) != 0) {
|
||||||
|
trace("irtmp connect vhost/app failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
trace("irtmp connect vhost/app success");
|
||||||
|
|
||||||
|
if ((ret = srs_play_stream(irtmp)) != 0) {
|
||||||
|
trace("irtmp play stream failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
trace("irtmp play stream success");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int connect_oc(srs_rtmp_t ortmp)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if ((ret = srs_simple_handshake(ortmp)) != 0) {
|
||||||
|
trace("ortmp simple handshake failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
trace("ortmp simple handshake success");
|
||||||
|
|
||||||
|
if ((ret = srs_connect_app(ortmp)) != 0) {
|
||||||
|
trace("ortmp connect vhost/app failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
trace("ortmp connect vhost/app success");
|
||||||
|
|
||||||
|
if ((ret = srs_publish_stream(ortmp)) != 0) {
|
||||||
|
trace("ortmp publish stream failed. ret=%d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
trace("ortmp publish stream success");
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue