Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
GB28181Android
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
规范查询wiki:
http://gitlab.anweitech.com/root/AW-Project-Manage/wikis/pages
Open sidebar
Administrator
GB28181Android
Commits
880da58b
提交
880da58b
authored
9月 14, 2018
作者:
autulin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
通过打点初步确定目前版本的问题:avcodec_encode_video2方法耗时过长
上级
9c2280b8
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
28 行增加
和
1 行删除
+28
-1
GB28181_sender.cpp
gb28181library/src/main/cpp/GB28181_sender.cpp
+6
-1
gb28181_muxer.cpp
gb28181library/src/main/cpp/gb28181_muxer.cpp
+22
-0
没有找到文件。
gb28181library/src/main/cpp/GB28181_sender.cpp
浏览文件 @
880da58b
...
...
@@ -40,16 +40,19 @@ int GB28181_sender::addPkt(uint8_t *pkt) {
void
*
GB28181_sender
::
processSend
(
void
*
obj
)
{
GB28181_sender
*
gb28181Sender
=
(
GB28181_sender
*
)
obj
;
while
(
gb28181Sender
->
isRuning
)
{
uint64_t
start_t
=
getCurrentTime
();
uint8_t
*
pkt_buf
=
*
gb28181Sender
->
pkt_queue
.
wait_and_pop
().
get
();
uint16_t
len
=
bytes2short
(
pkt_buf
);
uint64_t
t1
=
getCurrentTime
();
// char strBuf[16];
// sprintf(strBuf, "get pkt len: %d", len);
int
n
;
switch
(
gb28181Sender
->
args
->
outType
)
{
case
0
:
// udp
n
=
gb28181Sender
->
sendData
(
pkt_buf
+
2
,
len
);
LOGE
(
"get pkt len: %d. sent %d. (queue left size: %d)"
,
len
,
n
,
gb28181Sender
->
pkt_queue
.
size
());
LOGE
(
"
[sender]
get pkt len: %d. sent %d. (queue left size: %d)"
,
len
,
n
,
gb28181Sender
->
pkt_queue
.
size
());
break
;
case
1
:
// tcp
break
;
...
...
@@ -61,6 +64,8 @@ void *GB28181_sender::processSend(void *obj) {
}
delete
(
pkt_buf
);
uint64_t
t2
=
getCurrentTime
();
LOGI
(
"[sender]队列获取用时:%lld
\t
发送用时:%lld"
,
t1
-
start_t
,
t2
-
t1
);
}
LOGI
(
"发送结束"
);
gb28181Sender
->
closeSender
();
...
...
gb28181library/src/main/cpp/gb28181_muxer.cpp
浏览文件 @
880da58b
...
...
@@ -360,24 +360,35 @@ int GB28181Muxer::mux(GB28181Muxer *gb28181Muxer) {
int
nSize
=
0
;
memset
(
szTempPacketHead
,
0
,
256
);
uint64_t
start_t
=
getCurrentTime
();
// read next frame
uint8_t
*
picture_buf
=
*
gb28181Muxer
->
video_queue
.
wait_and_pop
().
get
();
uint64_t
t1
=
getCurrentTime
();
// 视频输入格式转换,变成pkt
int64_t
v_time
=
bytes2long
(
picture_buf
);
int
in_y_size
=
gb28181Muxer
->
arguments
->
in_width
*
gb28181Muxer
->
arguments
->
in_height
;
gb28181Muxer
->
custom_filter
(
gb28181Muxer
,
picture_buf
+
8
,
in_y_size
,
gb28181Muxer
->
arguments
->
v_custom_format
);
delete
(
picture_buf
);
uint64_t
t2
=
getCurrentTime
();
gb28181Muxer
->
pFrame
->
pts
=
(
v_time
-
gb28181Muxer
->
startTime
)
*
90
;
LOGE
(
"v_time: %lld, get a pts:%lld (audio queue left num: %d, video queue left num: %d)"
,
v_time
,
gb28181Muxer
->
pFrame
->
pts
,
audio_queue
.
size
(),
video_queue
.
size
());
int
got_picture
;
// 送入编码器
int
ret
=
avcodec_encode_video2
(
gb28181Muxer
->
pCodecCtx
,
gb28181Muxer
->
nextPkt
,
gb28181Muxer
->
pFrame
,
&
got_picture
);
if
(
ret
<
0
)
{
LOGE
(
"Failed to encode!11111111111111
\n
"
);
}
uint64_t
t3
=
getCurrentTime
();
// 读到了下一帧
int64_t
newPts
=
gb28181Muxer
->
nextPkt
->
pts
;
// 计算写入音频的个数
...
...
@@ -430,6 +441,8 @@ int GB28181Muxer::mux(GB28181Muxer *gb28181Muxer) {
gb28181Muxer
->
nextPkt
=
t
;
// LOGE("now frame:%ld", h264_encoder->nowPkt->pts);
uint64_t
t4
=
getCurrentTime
();
while
(
audioCnt
>
0
)
{
uint8_t
*
audioFrame
=
*
gb28181Muxer
->
audio_queue
.
wait_and_pop
().
get
();
int64_t
audioPts
=
gb28181Muxer
->
audioFrameCnt
*
3600
;
// 音频默认25帧,90000/25=3600
...
...
@@ -446,7 +459,16 @@ int GB28181Muxer::mux(GB28181Muxer *gb28181Muxer) {
audioCnt
--
;
delete
(
audioFrame
);
}
uint64_t
t5
=
getCurrentTime
();
gb28181Sender
->
addPkt
(
pkt_full
);
LOGI
(
"[muxer]从队列取:%lld
\t
格式转换:%lld
\t
送入编码器:%lld
\t
视频Header制作:%lld
\t
音频Header制作:%lld
\t
"
,
t1
-
start_t
,
t2
-
t1
,
t3
-
t2
,
t4
-
t3
,
t5
-
t4
)
}
LOGE
(
"mux over!"
);
return
0
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论