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
7c6b612a
Unverified
Commit
7c6b612a
authored
Jul 06, 2023
by
xiangshengjye
Committed by
GitHub
Jul 06, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
c sdk新增mpeg-ps/ts打包接口 (#2620)
parent
6b9889a8
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
119 行增加
和
0 行删除
+119
-0
api/include/mk_frame.h
+53
-0
api/source/mk_frame.cpp
+66
-0
没有找到文件。
api/include/mk_frame.h
查看文件 @
7c6b612a
...
...
@@ -166,6 +166,59 @@ API_EXPORT void API_CALL mk_frame_merger_input(mk_frame_merger ctx, mk_frame fra
*/
API_EXPORT
void
API_CALL
mk_frame_merger_flush
(
mk_frame_merger
ctx
);
//////////////////////////////////////////////////////////////////////
typedef
struct
mk_mpeg_muxer_t
*
mk_mpeg_muxer
;
/**
* mpeg-ps/ts 打包器输出回调函数
* @param user_data 设置回调时的用户数据指针
* @param muxer 对象
* @param frame 帧数据
* @param size 帧数据长度
* @param timestamp 时间戳
* @param key_pos 是否关键帧
*/
typedef
void
(
API_CALL
*
on_mk_mpeg_muxer_frame
)(
void
*
user_data
,
mk_mpeg_muxer
muxer
,
const
char
*
frame
,
size_t
size
,
uint64_t
timestamp
,
int
key_pos
);
/**
* mpeg-ps/ts 打包器
* @param cb 打包回调函数
* @param user_data 回调用户数据指针
* @param is_ps 是否是ps
* @return 打包器对象
*/
API_EXPORT
mk_mpeg_muxer
API_CALL
mk_mpeg_muxer_create
(
on_mk_mpeg_muxer_frame
cb
,
void
*
user_data
,
int
is_ps
);
/**
* 删除mpeg-ps/ts 打包器
* @param ctx 打包器
*/
API_EXPORT
void
API_CALL
mk_mpeg_muxer_release
(
mk_mpeg_muxer
ctx
);
/**
* 添加音视频track
* @param ctx mk_mpeg_muxer对象
* @param track mk_track对象,音视频轨道
*/
API_EXPORT
void
API_CALL
mk_mpeg_muxer_init_track
(
mk_mpeg_muxer
ctx
,
void
*
track
);
/**
* 初始化track完毕后调用此函数,
* 在单track(只有音频或视频)时,因为ZLMediaKit不知道后续是否还要添加track,所以会多等待3秒钟
* 如果产生的流是单Track类型,请调用此函数以便加快流生成速度,当然不调用该函数,影响也不大(会多等待3秒)
* @param ctx 对象指针
*/
API_EXPORT
void
API_CALL
mk_mpeg_muxer_init_complete
(
mk_mpeg_muxer
ctx
);
/**
* 输入frame对象
* @param ctx mk_mpeg_muxer对象
* @param frame 帧对象
* @return 1代表成功,0失败
*/
API_EXPORT
int
API_CALL
mk_mpeg_muxer_input_frame
(
mk_mpeg_muxer
ctx
,
mk_frame
frame
);
#ifdef __cplusplus
}
#endif
...
...
api/source/mk_frame.cpp
查看文件 @
7c6b612a
...
...
@@ -9,10 +9,12 @@
*/
#include "mk_frame.h"
#include "mk_track.h"
#include "Extension/Frame.h"
#include "Extension/H264.h"
#include "Extension/H265.h"
#include "Extension/AAC.h"
#include "Record/MPEG.h"
using
namespace
mediakit
;
...
...
@@ -204,3 +206,66 @@ API_EXPORT void API_CALL mk_frame_merger_input(mk_frame_merger ctx, mk_frame fra
cb
(
user_data
,
dts
,
pts
,
(
mk_buffer
)(
&
buffer
),
have_key_frame
);
});
}
//////////////////////////////////////////////////////////////////////
class
MpegMuxerForC
:
public
MpegMuxer
{
public
:
using
onMuxer
=
std
::
function
<
void
(
const
char
*
frame
,
size_t
size
,
uint64_t
timestamp
,
int
key_pos
)
>
;
MpegMuxerForC
(
bool
is_ps
)
:
MpegMuxer
(
is_ps
)
{
_cb
=
nullptr
;
}
~
MpegMuxerForC
()
{
MpegMuxer
::
flush
();
};
void
setOnMuxer
(
onMuxer
cb
)
{
_cb
=
std
::
move
(
cb
);
}
private
:
void
onWrite
(
std
::
shared_ptr
<
toolkit
::
Buffer
>
buffer
,
uint64_t
timestamp
,
bool
key_pos
)
override
{
if
(
_cb
)
{
if
(
!
buffer
)
{
_cb
(
nullptr
,
0
,
timestamp
,
key_pos
);
}
else
{
_cb
(
buffer
->
data
(),
buffer
->
size
(),
timestamp
,
key_pos
);
}
}
}
private
:
onMuxer
_cb
;
};
API_EXPORT
mk_mpeg_muxer
API_CALL
mk_mpeg_muxer_create
(
on_mk_mpeg_muxer_frame
cb
,
void
*
user_data
,
int
is_ps
){
assert
(
cb
);
auto
ret
=
new
MpegMuxerForC
(
is_ps
);
std
::
shared_ptr
<
void
>
ptr
(
user_data
,
[](
void
*
)
{});
ret
->
setOnMuxer
([
cb
,
ptr
,
ret
](
const
char
*
frame
,
size_t
size
,
uint64_t
timestamp
,
int
key_pos
)
{
cb
(
ptr
.
get
(),
reinterpret_cast
<
mk_mpeg_muxer
>
(
ret
),
frame
,
size
,
timestamp
,
key_pos
);
});
return
reinterpret_cast
<
mk_mpeg_muxer
>
(
ret
);
}
API_EXPORT
void
API_CALL
mk_mpeg_muxer_release
(
mk_mpeg_muxer
ctx
){
assert
(
ctx
);
auto
ptr
=
reinterpret_cast
<
MpegMuxerForC
*>
(
ctx
);
delete
ptr
;
}
API_EXPORT
void
API_CALL
mk_mpeg_muxer_init_track
(
mk_mpeg_muxer
ctx
,
void
*
track
)
{
assert
(
ctx
&&
track
);
auto
ptr
=
reinterpret_cast
<
MpegMuxerForC
*>
(
ctx
);
ptr
->
addTrack
(
*
((
Track
::
Ptr
*
)
track
));
}
API_EXPORT
void
API_CALL
mk_mpeg_muxer_init_complete
(
mk_mpeg_muxer
ctx
)
{
assert
(
ctx
);
auto
ptr
=
reinterpret_cast
<
MpegMuxerForC
*>
(
ctx
);
ptr
->
addTrackCompleted
();
}
API_EXPORT
int
API_CALL
mk_mpeg_muxer_input_frame
(
mk_mpeg_muxer
ctx
,
mk_frame
frame
){
assert
(
ctx
&&
frame
);
auto
ptr
=
reinterpret_cast
<
MpegMuxerForC
*>
(
ctx
);
return
ptr
->
inputFrame
(
*
((
Frame
::
Ptr
*
)
frame
));
}
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论