ffmpeg rtmp 流媒体实现有两种方式,一种是基于librtmp实现:libavformat/librtmp.c
-
- #define RTMP_CLASS(flavor)\
- static const AVClass lib ## flavor ## _class = {\
- .class_name = "lib" #flavor " protocol",\
- .item_name = av_default_item_name,\
- .option = options,\
- .version = LIBAVUTIL_VERSION_INT,\
- };
-
- RTMP_CLASS(rtmp)
- const URLProtocol ff_librtmp_protocol = {
- .name = "rtmp",
- .url_open = rtmp_open,
- .url_read = rtmp_read,
- .url_write = rtmp_write,
- .url_close = rtmp_close,
- .url_read_pause = rtmp_read_pause,
- .url_read_seek = rtmp_read_seek,
- .url_get_file_handle = rtmp_get_file_handle,
- .priv_data_size = sizeof(LibRTMPContext),
- .priv_data_class = &librtmp_class,
- .flags = URL_PROTOCOL_FLAG_NETWORK,
- };
-
- RTMP_CLASS(rtmpt)
- const URLProtocol ff_librtmpt_protocol = {
- .name = "rtmpt",
- .url_open = rtmp_open,
- .url_read = rtmp_read,
- .url_write = rtmp_write,
- .url_close = rtmp_close,
- .url_read_pause = rtmp_read_pause,
- .url_read_seek = rtmp_read_seek,
- .url_get_file_handle = rtmp_get_file_handle,
- .priv_data_size = sizeof(LibRTMPContext),
- .priv_data_class = &librtmpt_class,
- .flags = URL_PROTOCOL_FLAG_NETWORK,
- };
-
- RTMP_CLASS(rtmpe)
- const URLProtocol ff_librtmpe_protocol = {
- .name = "rtmpe",
- .url_open = rtmp_open,
- .url_read = rtmp_read,
- .url_write = rtmp_write,
- .url_close = rtmp_close,
- .url_read_pause = rtmp_read_pause,
- .url_read_seek = rtmp_read_seek,
- .url_get_file_handle = rtmp_get_file_handle,
- .priv_data_size = sizeof(LibRTMPContext),
- .priv_data_class = &librtmpe_class,
- .flags = URL_PROTOCOL_FLAG_NETWORK,
- };
-
- RTMP_CLASS(rtmpte)
- const URLProtocol ff_librtmpte_protocol = {
- .name = "rtmpte",
- .url_open = rtmp_open,
- .url_read = rtmp_read,
- .url_write = rtmp_write,
- .url_close = rtmp_close,
- .url_read_pause = rtmp_read_pause,
- .url_read_seek = rtmp_read_seek,
- .url_get_file_handle = rtmp_get_file_handle,
- .priv_data_size = sizeof(LibRTMPContext),
- .priv_data_class = &librtmpte_class,
- .flags = URL_PROTOCOL_FLAG_NETWORK,
- };
-
- RTMP_CLASS(rtmps)
- const URLProtocol ff_librtmps_protocol = {
- .name = "rtmps",
- .url_open = rtmp_open,
- .url_read = rtmp_read,
- .url_write = rtmp_write,
- .url_close = rtmp_close,
- .url_read_pause = rtmp_read_pause,
- .url_read_seek = rtmp_read_seek,
- .url_get_file_handle = rtmp_get_file_handle,
- .priv_data_size = sizeof(LibRTMPContext),
- .priv_data_class = &librtmps_class,
- .flags = URL_PROTOCOL_FLAG_NETWORK,
- };
一种是ffmpeg 自己实现的rtmp 协议 libavformat/rtmpproto.c
- #define RTMP_PROTOCOL(flavor) \
- static const AVClass flavor##_class = { \
- .class_name = #flavor, \
- .item_name = av_default_item_name, \
- .option = rtmp_options, \
- .version = LIBAVUTIL_VERSION_INT, \
- }; \
- \
- const URLProtocol ff_##flavor##_protocol = { \
- .name = #flavor, \
- .url_open2 = rtmp_open, \
- .url_read = rtmp_read, \
- .url_read_seek = rtmp_seek, \
- .url_read_pause = rtmp_pause, \
- .url_write = rtmp_write, \
- .url_close = rtmp_close, \
- .priv_data_size = sizeof(RTMPContext), \
- .flags = URL_PROTOCOL_FLAG_NETWORK, \
- .priv_data_class= &flavor##_class, \
- };
-
-
- RTMP_PROTOCOL(rtmp)
- RTMP_PROTOCOL(rtmpe)
- RTMP_PROTOCOL(rtmps)
- RTMP_PROTOCOL(rtmpt)
- RTMP_PROTOCOL(rtmpte)
- RTMP_PROTOCOL(rtmpts)