mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-28 14:16:32 +08:00
c sdk新增mpeg-ps/ts打包接口 (#2620)
This commit is contained in:
parent
6b9889a883
commit
7c6b612a4d
@ -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);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,10 +9,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mk_frame.h"
|
#include "mk_frame.h"
|
||||||
|
#include "mk_track.h"
|
||||||
#include "Extension/Frame.h"
|
#include "Extension/Frame.h"
|
||||||
#include "Extension/H264.h"
|
#include "Extension/H264.h"
|
||||||
#include "Extension/H265.h"
|
#include "Extension/H265.h"
|
||||||
#include "Extension/AAC.h"
|
#include "Extension/AAC.h"
|
||||||
|
#include "Record/MPEG.h"
|
||||||
|
|
||||||
using namespace mediakit;
|
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);
|
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));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user