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
a573d730
Commit
a573d730
authored
5 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
提高rtsp客户端兼容性
parent
2b511a05
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
98 行增加
和
77 行删除
+98
-77
src/Rtsp/Rtsp.cpp
+97
-76
src/Rtsp/Rtsp.h
+1
-1
没有找到文件。
src/Rtsp/Rtsp.cpp
查看文件 @
a573d730
...
...
@@ -85,74 +85,84 @@ string SdpTrack::toString() const {
}
return
_printer
;
}
static
TrackType
toTrackType
(
const
string
&
str
)
{
if
(
str
==
""
)
{
return
TrackTitle
;
}
if
(
str
==
"video"
)
{
return
TrackVideo
;
}
if
(
str
==
"audio"
)
{
return
TrackAudio
;
}
return
TrackInvalid
;
}
void
SdpParser
::
load
(
const
string
&
sdp
)
{
_track_map
.
clear
();
string
key
;
SdpTrack
::
Ptr
track
=
std
::
make_shared
<
SdpTrack
>
();
{
_track_vec
.
clear
();
string
key
;
SdpTrack
::
Ptr
track
=
std
::
make_shared
<
SdpTrack
>
();
auto
lines
=
split
(
sdp
,
"
\n
"
);
for
(
auto
&
line
:
lines
){
trim
(
line
);
if
(
line
.
size
()
<
2
||
line
[
1
]
!=
'='
){
continue
;
}
char
opt
=
line
[
0
];
string
opt_val
=
line
.
substr
(
2
);
switch
(
opt
){
case
'o'
:
track
->
_o
=
opt_val
;
break
;
case
's'
:
track
->
_s
=
opt_val
;
break
;
case
'i'
:
track
->
_i
=
opt_val
;
break
;
case
'c'
:
track
->
_c
=
opt_val
;
break
;
case
't'
:
track
->
_t
=
opt_val
;
break
;
case
'b'
:
track
->
_b
=
opt_val
;
break
;
case
'm'
:{
_track_map
[
key
]
=
track
;
track
=
std
::
make_shared
<
SdpTrack
>
();
key
=
FindField
(
opt_val
.
data
(),
nullptr
,
" "
);
track
->
_m
=
opt_val
;
auto
lines
=
split
(
sdp
,
"
\n
"
);
for
(
auto
&
line
:
lines
)
{
trim
(
line
);
if
(
line
.
size
()
<
2
||
line
[
1
]
!=
'='
)
{
continue
;
}
break
;
case
'a'
:{
string
attr
=
FindField
(
opt_val
.
data
(),
nullptr
,
":"
);
if
(
attr
.
empty
()){
track
->
_attr
[
opt_val
]
=
""
;
}
else
{
track
->
_attr
[
attr
]
=
FindField
(
opt_val
.
data
(),
":"
,
nullptr
);
char
opt
=
line
[
0
];
string
opt_val
=
line
.
substr
(
2
);
switch
(
opt
)
{
case
'o'
:
track
->
_o
=
opt_val
;
break
;
case
's'
:
track
->
_s
=
opt_val
;
break
;
case
'i'
:
track
->
_i
=
opt_val
;
break
;
case
'c'
:
track
->
_c
=
opt_val
;
break
;
case
't'
:
track
->
_t
=
opt_val
;
break
;
case
'b'
:
track
->
_b
=
opt_val
;
break
;
case
'm'
:
{
track
->
_type
=
toTrackType
(
key
);
_track_vec
.
emplace_back
(
track
);
track
=
std
::
make_shared
<
SdpTrack
>
();
key
=
FindField
(
opt_val
.
data
(),
nullptr
,
" "
);
track
->
_m
=
opt_val
;
}
break
;
case
'a'
:
{
string
attr
=
FindField
(
opt_val
.
data
(),
nullptr
,
":"
);
if
(
attr
.
empty
())
{
track
->
_attr
[
opt_val
]
=
""
;
}
else
{
track
->
_attr
[
attr
]
=
FindField
(
opt_val
.
data
(),
":"
,
nullptr
);
}
}
break
;
default
:
track
->
_other
[
opt
]
=
opt_val
;
break
;
}
break
;
default
:
track
->
_other
[
opt
]
=
opt_val
;
break
;
}
track
->
_type
=
toTrackType
(
key
);
_track_vec
.
emplace_back
(
track
);
}
_track_map
[
key
]
=
track
;
for
(
auto
&
pr
:
_track_map
)
{
auto
&
track
=
*
pr
.
second
;
if
(
pr
.
first
==
""
)
{
track
.
_type
=
TrackTitle
;
}
else
if
(
pr
.
first
==
"video"
)
{
track
.
_type
=
TrackVideo
;
}
else
if
(
pr
.
first
==
"audio"
)
{
track
.
_type
=
TrackAudio
;
}
else
{
track
.
_type
=
TrackInvalid
;
}
for
(
auto
&
track_ptr
:
_track_vec
)
{
auto
&
track
=
*
track_ptr
;
auto
it
=
track
.
_attr
.
find
(
"range"
);
if
(
it
!=
track
.
_attr
.
end
())
{
char
name
[
16
]
=
{
0
},
start
[
16
]
=
{
0
},
end
[
16
]
=
{
0
};
...
...
@@ -198,9 +208,9 @@ bool SdpParser::available() const {
}
SdpTrack
::
Ptr
SdpParser
::
getTrack
(
TrackType
type
)
const
{
for
(
auto
&
pr
:
_track_map
){
if
(
pr
.
second
->
_type
==
type
){
return
pr
.
second
;
for
(
auto
&
track
:
_track_vec
){
if
(
track
->
_type
==
type
){
return
track
;
}
}
return
nullptr
;
...
...
@@ -208,31 +218,42 @@ SdpTrack::Ptr SdpParser::getTrack(TrackType type) const {
vector
<
SdpTrack
::
Ptr
>
SdpParser
::
getAvailableTrack
()
const
{
vector
<
SdpTrack
::
Ptr
>
ret
;
auto
video
=
getTrack
(
TrackVideo
);
if
(
video
){
ret
.
emplace_back
(
video
);
}
auto
audio
=
getTrack
(
TrackAudio
);
if
(
audio
){
ret
.
emplace_back
(
audio
);
bool
audio_added
=
false
;
bool
video_added
=
false
;
for
(
auto
&
track
:
_track_vec
){
if
(
track
->
_type
==
TrackAudio
){
if
(
!
audio_added
){
ret
.
emplace_back
(
track
);
audio_added
=
true
;
}
continue
;
}
if
(
track
->
_type
==
TrackVideo
){
if
(
!
video_added
){
ret
.
emplace_back
(
track
);
video_added
=
true
;
}
continue
;
}
}
return
ret
;
return
std
::
move
(
ret
)
;
}
string
SdpParser
::
toString
()
const
{
string
title
,
audio
,
video
;
for
(
auto
&
pr
:
_track_map
){
switch
(
pr
.
second
->
_type
){
for
(
auto
&
track
:
_track_vec
){
switch
(
track
->
_type
){
case
TrackTitle
:{
title
=
pr
.
second
->
toString
();
title
=
track
->
toString
();
}
break
;
case
TrackVideo
:{
video
=
pr
.
second
->
toString
();
video
=
track
->
toString
();
}
break
;
case
TrackAudio
:{
audio
=
pr
.
second
->
toString
();
audio
=
track
->
toString
();
}
break
;
default
:
...
...
This diff is collapsed.
Click to expand it.
src/Rtsp/Rtsp.h
查看文件 @
a573d730
...
...
@@ -122,7 +122,7 @@ public:
vector
<
SdpTrack
::
Ptr
>
getAvailableTrack
()
const
;
string
toString
()
const
;
private
:
map
<
string
,
SdpTrack
::
Ptr
>
_track_map
;
vector
<
SdpTrack
::
Ptr
>
_track_vec
;
};
/**
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论