Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
360eba2c
Commit
360eba2c
authored
Jul 30, 2019
by
zqsong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MP4录制添加H265支持
parent
fbf0469e
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
329 行增加
和
12 行删除
+329
-12
CMakeLists.txt
+22
-0
src/Extension/Factory.cpp
+7
-1
src/Extension/SPSParser.c
+0
-0
src/Extension/SPSParser.h
+253
-0
src/MediaFile/Mp4Maker.cpp
+0
-0
src/MediaFile/Mp4Maker.h
+33
-2
tests/test_server.cpp
+14
-9
没有找到文件。
CMakeLists.txt
查看文件 @
360eba2c
...
...
@@ -36,6 +36,7 @@ set(ENABLE_MYSQL true)
set
(
ENABLE_MP4V2 true
)
set
(
ENABLE_FAAC true
)
set
(
ENABLE_X264 true
)
set
(
MP4_H265RECORD true
)
#添加两个静态库
if
(
ENABLE_HLS
)
...
...
@@ -47,6 +48,12 @@ else()
set
(
LINK_LIB_LIST zlmediakit zltoolkit
)
endif
()
if
(
MP4_H265RECORD
)
message
(
STATUS
"MP4_H265RECORD defined"
)
add_definitions
(
-DMP4_H265RECORD
)
set
(
MediaServer_Root
${
CMAKE_SOURCE_DIR
}
/3rdpart/media-server
)
list
(
APPEND LINK_LIB_LIST mov flv
)
endif
()
#查找openssl是否安装
find_package
(
OpenSSL QUIET
)
if
(
OPENSSL_FOUND AND ENABLE_OPENSSL
)
...
...
@@ -111,6 +118,21 @@ if(ENABLE_HLS)
endif
(
WIN32
)
endif
()
if
(
MP4_H265RECORD
)
aux_source_directory
(
${
MediaServer_Root
}
/libmov/include src_mov
)
aux_source_directory
(
${
MediaServer_Root
}
/libmov/source src_mov
)
include_directories
(
${
MediaServer_Root
}
/libmov/include
)
aux_source_directory
(
${
MediaServer_Root
}
/libflv/include src_flv
)
aux_source_directory
(
${
MediaServer_Root
}
/libflv/source src_flv
)
include_directories
(
${
MediaServer_Root
}
/libflv/include
)
add_library
(
mov STATIC
${
src_mov
}
)
add_library
(
flv STATIC
${
src_flv
}
)
if
(
WIN32
)
set_target_properties
(
mov flv PROPERTIES COMPILE_FLAGS
${
VS_FALGS
}
)
endif
(
WIN32
)
endif
()
if
(
WIN32
)
list
(
APPEND LINK_LIB_LIST WS2_32 Iphlpapi shlwapi
)
set_target_properties
(
zltoolkit PROPERTIES COMPILE_FLAGS
${
VS_FALGS
}
)
...
...
src/Extension/Factory.cpp
查看文件 @
360eba2c
...
...
@@ -76,8 +76,14 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
if
(
strcasecmp
(
track
->
_codec
.
data
(),
"h265"
)
==
0
)
{
//a=fmtp:96 sprop-sps=QgEBAWAAAAMAsAAAAwAAAwBdoAKAgC0WNrkky/AIAAADAAgAAAMBlQg=; sprop-pps=RAHA8vA8kAA=
int
pt
;
int
pt
,
id
;
char
sprop_vps
[
128
]
=
{
0
},
sprop_sps
[
128
]
=
{
0
},
sprop_pps
[
128
]
=
{
0
};
if
(
5
==
sscanf
(
track
->
_fmtp
.
data
(),
"%d profile-id=%d; sprop-sps=%127[^;]; sprop-pps=%127[^;]; sprop-vps=%127[^;]"
,
&
pt
,
&
id
,
sprop_sps
,
sprop_pps
,
sprop_vps
))
{
auto
vps
=
decodeBase64
(
sprop_vps
);
auto
sps
=
decodeBase64
(
sprop_sps
);
auto
pps
=
decodeBase64
(
sprop_pps
);
return
std
::
make_shared
<
H265Track
>
(
vps
,
sps
,
pps
,
0
,
0
,
0
);
}
if
(
4
==
sscanf
(
track
->
_fmtp
.
data
(),
"%d sprop-vps=%127[^;]; sprop-sps=%127[^;]; sprop-pps=%127[^;]"
,
&
pt
,
sprop_vps
,
sprop_sps
,
sprop_pps
))
{
auto
vps
=
decodeBase64
(
sprop_vps
);
auto
sps
=
decodeBase64
(
sprop_sps
);
...
...
src/Extension/SPSParser.c
查看文件 @
360eba2c
差异被折叠。
点击展开。
src/Extension/SPSParser.h
查看文件 @
360eba2c
...
...
@@ -7,6 +7,15 @@
#define QP_MAX_NUM (51 + 6*6) // The maximum supported qp
#define HEVC_MAX_SHORT_TERM_RPS_COUNT 64
#define T_PROFILE_HEVC_MAIN 1
#define T_PROFILE_HEVC_MAIN_10 2
#define T_PROFILE_HEVC_MAIN_STILL_PICTURE 3
#define T_PROFILE_HEVC_REXT 4
/**
* Chromaticity coordinates of the source primaries.
*/
...
...
@@ -67,6 +76,62 @@ enum T_AVColorSpace {
};
enum
{
// 7.4.3.1: vps_max_layers_minus1 is in [0, 62].
HEVC_MAX_LAYERS
=
63
,
// 7.4.3.1: vps_max_sub_layers_minus1 is in [0, 6].
HEVC_MAX_SUB_LAYERS
=
7
,
// 7.4.3.1: vps_num_layer_sets_minus1 is in [0, 1023].
HEVC_MAX_LAYER_SETS
=
1024
,
// 7.4.2.1: vps_video_parameter_set_id is u(4).
HEVC_MAX_VPS_COUNT
=
16
,
// 7.4.3.2.1: sps_seq_parameter_set_id is in [0, 15].
HEVC_MAX_SPS_COUNT
=
16
,
// 7.4.3.3.1: pps_pic_parameter_set_id is in [0, 63].
HEVC_MAX_PPS_COUNT
=
64
,
// A.4.2: MaxDpbSize is bounded above by 16.
HEVC_MAX_DPB_SIZE
=
16
,
// 7.4.3.1: vps_max_dec_pic_buffering_minus1[i] is in [0, MaxDpbSize - 1].
HEVC_MAX_REFS
=
HEVC_MAX_DPB_SIZE
,
// 7.4.3.2.1: num_short_term_ref_pic_sets is in [0, 64].
HEVC_MAX_SHORT_TERM_REF_PIC_SETS
=
64
,
// 7.4.3.2.1: num_long_term_ref_pics_sps is in [0, 32].
HEVC_MAX_LONG_TERM_REF_PICS
=
32
,
// A.3: all profiles require that CtbLog2SizeY is in [4, 6].
HEVC_MIN_LOG2_CTB_SIZE
=
4
,
HEVC_MAX_LOG2_CTB_SIZE
=
6
,
// E.3.2: cpb_cnt_minus1[i] is in [0, 31].
HEVC_MAX_CPB_CNT
=
32
,
// A.4.1: in table A.6 the highest level allows a MaxLumaPs of 35 651 584.
HEVC_MAX_LUMA_PS
=
35651584
,
// A.4.1: pic_width_in_luma_samples and pic_height_in_luma_samples are
// constrained to be not greater than sqrt(MaxLumaPs * 8). Hence height/
// width are bounded above by sqrt(8 * 35651584) = 16888.2 samples.
HEVC_MAX_WIDTH
=
16888
,
HEVC_MAX_HEIGHT
=
16888
,
// A.4.1: table A.6 allows at most 22 tile rows for any level.
HEVC_MAX_TILE_ROWS
=
22
,
// A.4.1: table A.6 allows at most 20 tile columns for any level.
HEVC_MAX_TILE_COLUMNS
=
20
,
// 7.4.7.1: in the worst case (tiles_enabled_flag and
// entropy_coding_sync_enabled_flag are both set), entry points can be
// placed at the beginning of every Ctb row in every tile, giving an
// upper bound of (num_tile_columns_minus1 + 1) * PicHeightInCtbsY - 1.
// Only a stream with very high resolution and perverse parameters could
// get near that, though, so set a lower limit here with the maximum
// possible value for 4K video (at most 135 16x16 Ctb rows).
HEVC_MAX_ENTRY_POINT_OFFSETS
=
HEVC_MAX_TILE_COLUMNS
*
135
,
};
/**
* rational number numerator/denominator
*/
...
...
@@ -170,6 +235,189 @@ typedef struct T_PPS {
int
iChromaQpDiff
;
}
T_PPS
;
typedef
struct
T_HEVCWindow
{
unsigned
int
left_offset
;
unsigned
int
right_offset
;
unsigned
int
top_offset
;
unsigned
int
bottom_offset
;
}
T_HEVCWindow
;
typedef
struct
T_VUI
{
T_AVRational
sar
;
int
overscan_info_present_flag
;
int
overscan_appropriate_flag
;
int
video_signal_type_present_flag
;
int
video_format
;
int
video_full_range_flag
;
int
colour_description_present_flag
;
uint8_t
colour_primaries
;
uint8_t
transfer_characteristic
;
uint8_t
matrix_coeffs
;
int
chroma_loc_info_present_flag
;
int
chroma_sample_loc_type_top_field
;
int
chroma_sample_loc_type_bottom_field
;
int
neutra_chroma_indication_flag
;
int
field_seq_flag
;
int
frame_field_info_present_flag
;
int
default_display_window_flag
;
T_HEVCWindow
def_disp_win
;
int
vui_timing_info_present_flag
;
uint32_t
vui_num_units_in_tick
;
uint32_t
vui_time_scale
;
int
vui_poc_proportional_to_timing_flag
;
int
vui_num_ticks_poc_diff_one_minus1
;
int
vui_hrd_parameters_present_flag
;
int
bitstream_restriction_flag
;
int
tiles_fixed_structure_flag
;
int
motion_vectors_over_pic_boundaries_flag
;
int
restricted_ref_pic_lists_flag
;
int
min_spatial_segmentation_idc
;
int
max_bytes_per_pic_denom
;
int
max_bits_per_min_cu_denom
;
int
log2_max_mv_length_horizontal
;
int
log2_max_mv_length_vertical
;
}
T_VUI
;
typedef
struct
T_PTLCommon
{
uint8_t
profile_space
;
uint8_t
tier_flag
;
uint8_t
profile_idc
;
uint8_t
profile_compatibility_flag
[
32
];
uint8_t
level_idc
;
uint8_t
progressive_source_flag
;
uint8_t
interlaced_source_flag
;
uint8_t
non_packed_constraint_flag
;
uint8_t
frame_only_constraint_flag
;
}
T_PTLCommon
;
typedef
struct
T_PTL
{
T_PTLCommon
general_ptl
;
T_PTLCommon
sub_layer_ptl
[
HEVC_MAX_SUB_LAYERS
];
uint8_t
sub_layer_profile_present_flag
[
HEVC_MAX_SUB_LAYERS
];
uint8_t
sub_layer_level_present_flag
[
HEVC_MAX_SUB_LAYERS
];
}
T_PTL
;
typedef
struct
T_ScalingList
{
/* This is a little wasteful, since sizeID 0 only needs 8 coeffs,
* and size ID 3 only has 2 arrays, not 6. */
uint8_t
sl
[
4
][
6
][
64
];
uint8_t
sl_dc
[
2
][
6
];
}
T_ScalingList
;
typedef
struct
T_ShortTermRPS
{
unsigned
int
num_negative_pics
;
int
num_delta_pocs
;
int
rps_idx_num_delta_pocs
;
int32_t
delta_poc
[
32
];
uint8_t
used
[
32
];
}
T_ShortTermRPS
;
typedef
struct
T_HEVCSPS
{
unsigned
vps_id
;
int
chroma_format_idc
;
uint8_t
separate_colour_plane_flag
;
///< output (i.e. cropped) values
int
output_width
,
output_height
;
T_HEVCWindow
output_window
;
T_HEVCWindow
pic_conf_win
;
int
bit_depth
;
int
bit_depth_chroma
;
int
pixel_shift
;
// enum AVPixelFormat pix_fmt;
unsigned
int
log2_max_poc_lsb
;
int
pcm_enabled_flag
;
int
max_sub_layers
;
struct
{
int
max_dec_pic_buffering
;
int
num_reorder_pics
;
int
max_latency_increase
;
}
temporal_layer
[
HEVC_MAX_SUB_LAYERS
];
uint8_t
temporal_id_nesting_flag
;
T_VUI
vui
;
T_PTL
ptl
;
uint8_t
scaling_list_enable_flag
;
T_ScalingList
scaling_list
;
unsigned
int
nb_st_rps
;
T_ShortTermRPS
st_rps
[
HEVC_MAX_SHORT_TERM_RPS_COUNT
];
uint8_t
amp_enabled_flag
;
uint8_t
sao_enabled
;
uint8_t
long_term_ref_pics_present_flag
;
uint16_t
lt_ref_pic_poc_lsb_sps
[
32
];
uint8_t
used_by_curr_pic_lt_sps_flag
[
32
];
uint8_t
num_long_term_ref_pics_sps
;
struct
{
uint8_t
bit_depth
;
uint8_t
bit_depth_chroma
;
unsigned
int
log2_min_pcm_cb_size
;
unsigned
int
log2_max_pcm_cb_size
;
uint8_t
loop_filter_disable_flag
;
}
pcm
;
uint8_t
sps_temporal_mvp_enabled_flag
;
uint8_t
sps_strong_intra_smoothing_enable_flag
;
unsigned
int
log2_min_cb_size
;
unsigned
int
log2_diff_max_min_coding_block_size
;
unsigned
int
log2_min_tb_size
;
unsigned
int
log2_max_trafo_size
;
unsigned
int
log2_ctb_size
;
unsigned
int
log2_min_pu_size
;
int
max_transform_hierarchy_depth_inter
;
int
max_transform_hierarchy_depth_intra
;
int
transform_skip_rotation_enabled_flag
;
int
transform_skip_context_enabled_flag
;
int
implicit_rdpcm_enabled_flag
;
int
explicit_rdpcm_enabled_flag
;
int
intra_smoothing_disabled_flag
;
int
persistent_rice_adaptation_enabled_flag
;
///< coded frame dimension in various units
int
width
;
int
height
;
int
ctb_width
;
int
ctb_height
;
int
ctb_size
;
int
min_cb_width
;
int
min_cb_height
;
int
min_tb_width
;
int
min_tb_height
;
int
min_pu_width
;
int
min_pu_height
;
int
tb_mask
;
int
hshift
[
3
];
int
vshift
[
3
];
int
qp_bd_offset
;
uint8_t
data
[
4096
];
int
data_size
;
}
T_HEVCSPS
;
typedef
struct
T_GetBitContext
{
uint8_t
*
pu8Buf
;
/*Ö¸ÏòSPS start*/
int
iBufSize
;
/*SPS ³¤¶È*/
...
...
@@ -180,8 +428,13 @@ typedef struct T_GetBitContext{
int
h264DecSeqParameterSet
(
void
*
pvBuf
,
T_SPS
*
ptSps
);
int
h265DecSeqParameterSet
(
void
*
pvBufSrc
,
T_HEVCSPS
*
p_sps
);
void
h264GetWidthHeight
(
T_SPS
*
ptSps
,
int
*
piWidth
,
int
*
piHeight
);
void
h265GetWidthHeight
(
T_HEVCSPS
*
ptSps
,
int
*
piWidth
,
int
*
piHeight
);
void
h264GeFramerate
(
T_SPS
*
ptSps
,
float
*
pfFramerate
);
void
h265GeFramerate
(
T_HEVCSPS
*
ptSps
,
float
*
pfFramerate
);
#if defined (__cplusplus)
}
...
...
src/MediaFile/Mp4Maker.cpp
查看文件 @
360eba2c
差异被折叠。
点击展开。
src/MediaFile/Mp4Maker.h
查看文件 @
360eba2c
...
...
@@ -40,6 +40,12 @@
#include "Common/MediaSink.h"
#include "Extension/Track.h"
#ifdef MP4_H265RECORD
#include "mov-writer.h"
#include "mpeg4-hevc.h"
#endif
using
namespace
toolkit
;
namespace
mediakit
{
...
...
@@ -57,6 +63,22 @@ public:
string
strStreamId
;
//流ID
string
strVhost
;
//vhost
};
class
MovH265Info
{
public
:
#ifdef MP4_H265RECORD
mov_writer_t
*
pMov
;
struct
mpeg4_hevc_t
hevc
;
int
videoTrack
;
int
audioTrack
;
int
width
;
int
height
;
const
uint8_t
*
ptr
;
FILE
*
pFile
;
#endif
};
class
Mp4Maker
:
public
MediaSink
{
public
:
typedef
std
::
shared_ptr
<
Mp4Maker
>
Ptr
;
...
...
@@ -82,14 +104,22 @@ private:
void
asyncClose
();
//时间戳:参考频率1000
void
inputH264
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui32TimeStamp
);
void
inputH264
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui32TimeStamp
);
void
inputH265
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui32TimeStamp
);
//时间戳:参考频率1000
void
inputAAC
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui32TimeStamp
);
void
inputH264_l
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui64Duration
);
void
inputH264_l
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui64Duration
);
void
inputH265_l
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui32TimeStamp
);
void
inputAAC_l
(
void
*
pData
,
uint32_t
ui32Length
,
uint32_t
ui64Duration
);
private
:
MovH265Info
_movH265info
;
int
_h265Record
=
0
;
uint8_t
_sBbuffer
[
2
*
1024
*
1024
];
MP4FileHandle
_hMp4
=
MP4_INVALID_FILE_HANDLE
;
MP4TrackId
_hVideo
=
MP4_INVALID_TRACK_ID
;
MP4TrackId
_hAudio
=
MP4_INVALID_TRACK_ID
;
string
_strPath
;
...
...
@@ -106,6 +136,7 @@ private:
bool
_haveVideo
=
false
;
int
_audioSampleRate
;
int
_audioChannel
;
};
}
/* namespace mediakit */
...
...
tests/test_server.cpp
查看文件 @
360eba2c
...
...
@@ -180,7 +180,7 @@ void initEventListener() {
NoticeCenter
::
Instance
().
addListener
(
nullptr
,
Broadcast
::
kBroadcastMediaChanged
,
[](
BroadcastMediaChangedArgs
)
{
if
(
schema
==
RTMP_SCHEMA
&&
app
==
"live"
)
{
lock_guard
<
mutex
>
lck
(
s_mtxFlvRecorder
);
if
(
bRegist
)
{
if
(
/*bRegist*/
0
)
{
DebugL
<<
"开始录制RTMP:"
<<
schema
<<
" "
<<
vhost
<<
" "
<<
app
<<
" "
<<
stream
;
GET_CONFIG
(
string
,
http_root
,
Http
::
kRootPath
);
auto
path
=
...
...
@@ -239,8 +239,9 @@ int main(int argc,char *argv[]) {
//这里是拉流地址,支持rtmp/rtsp协议,负载必须是H264+AAC
//如果是其他不识别的音视频将会被忽略(譬如说h264+adpcm转发后会去除音频)
auto
urlList
=
{
"rtmp://live.hkstv.hk.lxdns.com/live/hks1"
,
"rtmp://live.hkstv.hk.lxdns.com/live/hks2"
auto
urlList
=
{
// "rtsp://admin:admin123@192.168.5.82/",
"rtsp://192.168.5.24/live/chn0"
,
//rtsp链接支持输入用户名密码
/*"rtsp://admin:jzan123456@192.168.0.122/"*/
};
map
<
string
,
PlayerProxy
::
Ptr
>
proxyMap
;
...
...
@@ -259,7 +260,7 @@ int main(int argc,char *argv[]) {
//rtsp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4
//rtmp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"live"
,
to_string
(
i
).
data
()));
PlayerProxy
::
Ptr
player
(
new
PlayerProxy
(
DEFAULT_VHOST
,
"live"
,
to_string
(
i
).
data
()
,
true
,
true
,
true
,
true
));
//指定RTP over TCP(播放rtsp时有效)
(
*
player
)[
kRtpType
]
=
Rtsp
::
RTP_TCP
;
//开始播放,如果播放失败或者播放中止,将会自动重试若干次,重试次数在配置文件中配置,默认一直重试
...
...
@@ -276,7 +277,7 @@ int main(int argc,char *argv[]) {
" http-flv地址 : http://127.0.0.1/live/0.flv
\n
"
" rtsp地址 : rtsp://127.0.0.1/live/0
\n
"
" rtmp地址 : rtmp://127.0.0.1/live/0"
;
#if 1
//加载证书,证书包含公钥和私钥
SSL_Initor
::
Instance
().
loadCertificate
((
exeDir
()
+
"ssl.p12"
).
data
());
//信任某个自签名证书
...
...
@@ -293,12 +294,12 @@ int main(int argc,char *argv[]) {
//简单的telnet服务器,可用于服务器调试,但是不能使用23端口,否则telnet上了莫名其妙的现象
//测试方法:telnet 127.0.0.1 9000
TcpServer
::
Ptr
shellSrv
(
new
TcpServer
());
//
TcpServer::Ptr shellSrv(new TcpServer());
TcpServer
::
Ptr
rtspSrv
(
new
TcpServer
());
TcpServer
::
Ptr
rtmpSrv
(
new
TcpServer
());
TcpServer
::
Ptr
httpSrv
(
new
TcpServer
());
shellSrv
->
start
<
ShellSession
>
(
shellPort
);
//
shellSrv->start<ShellSession>(shellPort);
rtspSrv
->
start
<
RtspSession
>
(
rtspPort
);
//默认554
rtmpSrv
->
start
<
RtmpSession
>
(
rtmpPort
);
//默认1935
//http服务器,支持websocket
...
...
@@ -312,15 +313,17 @@ int main(int argc,char *argv[]) {
//支持ssl加密的rtsp服务器,可用于诸如亚马逊echo show这样的设备访问
TcpServer
::
Ptr
rtspSSLSrv
(
new
TcpServer
());
rtspSSLSrv
->
start
<
RtspSessionWithSSL
>
(
rtspsPort
);
//默认322
//服务器支持动态切换端口(不影响现有连接)
NoticeCenter
::
Instance
().
addListener
(
ReloadConfigTag
,
Broadcast
::
kBroadcastReloadConfig
,[
&
](
BroadcastReloadConfigArgs
){
//重新创建服务器
#if 0
if(shellPort != mINI::Instance()[Shell::kPort].as<uint16_t>()){
shellPort = mINI::Instance()[Shell::kPort];
shellSrv->start<ShellSession>(shellPort);
InfoL << "重启shell服务器:" << shellPort;
}
#endif
if
(
rtspPort
!=
mINI
::
Instance
()[
Rtsp
::
kPort
].
as
<
uint16_t
>
()){
rtspPort
=
mINI
::
Instance
()[
Rtsp
::
kPort
];
rtspSrv
->
start
<
RtspSession
>
(
rtspPort
);
...
...
@@ -331,6 +334,7 @@ int main(int argc,char *argv[]) {
rtmpSrv
->
start
<
RtmpSession
>
(
rtmpPort
);
InfoL
<<
"重启rtmp服务器"
<<
rtmpPort
;
}
#if 1
if
(
httpPort
!=
mINI
::
Instance
()[
Http
::
kPort
].
as
<
uint16_t
>
()){
httpPort
=
mINI
::
Instance
()[
Http
::
kPort
];
httpSrv
->
start
<
EchoWebSocketSession
>
(
httpPort
);
...
...
@@ -341,6 +345,7 @@ int main(int argc,char *argv[]) {
httpsSrv
->
start
<
SSLEchoWebSocketSession
>
(
httpsPort
);
InfoL
<<
"重启https服务器"
<<
httpsPort
;
}
#endif
if
(
rtspsPort
!=
mINI
::
Instance
()[
Rtsp
::
kSSLPort
].
as
<
uint16_t
>
()){
rtspsPort
=
mINI
::
Instance
()[
Rtsp
::
kSSLPort
];
...
...
@@ -348,7 +353,7 @@ int main(int argc,char *argv[]) {
InfoL
<<
"重启rtsps服务器"
<<
rtspsPort
;
}
});
#endif
//设置退出信号处理函数
static
semaphore
sem
;
signal
(
SIGINT
,
[](
int
)
{
sem
.
post
();
});
// 设置退出信号
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论