mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
rtmp: Add a new option 'rtmp_subscribe'
This option specifies the name of live stream to subscribe. Defaults to rtmp_playpath. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
f9e77c1762
commit
00cb52c65c
@ -237,6 +237,11 @@ value will be sent.
|
|||||||
Stream identifier to play or to publish. This option overrides the
|
Stream identifier to play or to publish. This option overrides the
|
||||||
parameter specified in the URI.
|
parameter specified in the URI.
|
||||||
|
|
||||||
|
@item rtmp_subscribe
|
||||||
|
Name of live stream to subscribe to. By default no value will be sent.
|
||||||
|
It is only sent if the option is specified or if rtmp_live
|
||||||
|
is set to live.
|
||||||
|
|
||||||
@item rtmp_swfurl
|
@item rtmp_swfurl
|
||||||
URL of the SWF player for the media. By default no value will be sent.
|
URL of the SWF player for the media. By default no value will be sent.
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ typedef struct RTMPContext {
|
|||||||
char* flashver; ///< version of the flash plugin
|
char* flashver; ///< version of the flash plugin
|
||||||
char* swfurl; ///< url of the swf player
|
char* swfurl; ///< url of the swf player
|
||||||
char* pageurl; ///< url of the web page
|
char* pageurl; ///< url of the web page
|
||||||
|
char* subscribe; ///< name of live stream to subscribe
|
||||||
int server_bw; ///< server bandwidth
|
int server_bw; ///< server bandwidth
|
||||||
int client_buffer_time; ///< client buffer time in ms
|
int client_buffer_time; ///< client buffer time in ms
|
||||||
int flush_interval; ///< number of packets flushed in the same request (RTMPT only)
|
int flush_interval; ///< number of packets flushed in the same request (RTMPT only)
|
||||||
@ -604,21 +605,22 @@ static int gen_bytes_read(URLContext *s, RTMPContext *rt, uint32_t ts)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gen_fcsubscribe_stream(URLContext *s, RTMPContext *rt)
|
static int gen_fcsubscribe_stream(URLContext *s, RTMPContext *rt,
|
||||||
|
const char *subscribe)
|
||||||
{
|
{
|
||||||
RTMPPacket pkt;
|
RTMPPacket pkt;
|
||||||
uint8_t *p;
|
uint8_t *p;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if ((ret = ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE,
|
if ((ret = ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE,
|
||||||
0, 27 + strlen(rt->playpath))) < 0)
|
0, 27 + strlen(subscribe))) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
p = pkt.data;
|
p = pkt.data;
|
||||||
ff_amf_write_string(&p, "FCSubscribe");
|
ff_amf_write_string(&p, "FCSubscribe");
|
||||||
ff_amf_write_number(&p, ++rt->nb_invokes);
|
ff_amf_write_number(&p, ++rt->nb_invokes);
|
||||||
ff_amf_write_null(&p);
|
ff_amf_write_null(&p);
|
||||||
ff_amf_write_string(&p, rt->playpath);
|
ff_amf_write_string(&p, subscribe);
|
||||||
|
|
||||||
ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size,
|
ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size,
|
||||||
rt->prev_pkt[1]);
|
rt->prev_pkt[1]);
|
||||||
@ -1036,9 +1038,15 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt)
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (rt->is_input) {
|
if (rt->is_input) {
|
||||||
/* Send the FCSubscribe command if live stream. */
|
/* Send the FCSubscribe command when the name of live
|
||||||
if (rt->live == -1) {
|
* stream is defined by the user or if it's a live stream. */
|
||||||
if ((ret = gen_fcsubscribe_stream(s, rt)) < 0)
|
if (rt->subscribe) {
|
||||||
|
if ((ret = gen_fcsubscribe_stream(s, rt,
|
||||||
|
rt->subscribe)) < 0)
|
||||||
|
return ret;
|
||||||
|
} else if (rt->live == -1) {
|
||||||
|
if ((ret = gen_fcsubscribe_stream(s, rt,
|
||||||
|
rt->playpath)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1624,6 +1632,7 @@ static const AVOption rtmp_options[] = {
|
|||||||
{"recorded", "recorded stream", 0, AV_OPT_TYPE_CONST, {0}, 0, 0, DEC, "rtmp_live"},
|
{"recorded", "recorded stream", 0, AV_OPT_TYPE_CONST, {0}, 0, 0, DEC, "rtmp_live"},
|
||||||
{"rtmp_pageurl", "URL of the web page in which the media was embedded. By default no value will be sent.", OFFSET(pageurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC},
|
{"rtmp_pageurl", "URL of the web page in which the media was embedded. By default no value will be sent.", OFFSET(pageurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC},
|
||||||
{"rtmp_playpath", "Stream identifier to play or to publish", OFFSET(playpath), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
|
{"rtmp_playpath", "Stream identifier to play or to publish", OFFSET(playpath), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
|
||||||
|
{"rtmp_subscribe", "Name of live stream to subscribe to. Defaults to rtmp_playpath.", OFFSET(subscribe), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC},
|
||||||
{"rtmp_swfurl", "URL of the SWF player. By default no value will be sent", OFFSET(swfurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
|
{"rtmp_swfurl", "URL of the SWF player. By default no value will be sent", OFFSET(swfurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
|
||||||
{"rtmp_tcurl", "URL of the target stream. Defaults to proto://host[:port]/app.", OFFSET(tcurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
|
{"rtmp_tcurl", "URL of the target stream. Defaults to proto://host[:port]/app.", OFFSET(tcurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC},
|
||||||
{ NULL },
|
{ NULL },
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_MAJOR 54
|
#define LIBAVFORMAT_VERSION_MAJOR 54
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 13
|
#define LIBAVFORMAT_VERSION_MINOR 13
|
||||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
#define LIBAVFORMAT_VERSION_MICRO 1
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
LIBAVFORMAT_VERSION_MINOR, \
|
LIBAVFORMAT_VERSION_MINOR, \
|
||||||
|
Loading…
Reference in New Issue
Block a user