player增加speed,pause扩展,seek支持秒级定位,MP4按时间戳生成文件

This commit is contained in:
baiyfcu
2021-08-09 18:28:43 +08:00
parent 9e5d325e43
commit 0ed902509a
25 changed files with 455 additions and 52 deletions

View File

@@ -43,6 +43,16 @@ public:
_on_seek_data = user_data;
}
void setOnPause(on_mk_media_pause cb, void* user_data) {
_on_pause = cb;
_on_pause_data = user_data;
}
void setOnSpeed(on_mk_media_speed cb, void* user_data) {
_on_speed = cb;
_on_speed_data = user_data;
}
void setOnRegist(on_mk_media_source_regist cb, void *user_data){
_on_regist = cb;
_on_regist_data = user_data;
@@ -72,6 +82,23 @@ protected:
}
return _on_seek(_on_seek_data,ui32Stamp);
}
// 通知暂停
bool pause(MediaSource &sender) override {
if (!_on_pause)
{
return false;
}
return _on_pause(_on_pause_data);
}
//通知倍数播放
bool speed(MediaSource& sender, float speed) override {
if (!_on_speed)
{
return false;
}
return _on_speed(_on_pause_data, speed);
}
// 观看总人数
int totalReaderCount(MediaSource &sender) override{
return _channel->totalReaderCount();
@@ -87,8 +114,12 @@ private:
DevChannel::Ptr _channel;
on_mk_media_close _on_close = nullptr;
on_mk_media_seek _on_seek = nullptr;
on_mk_media_pause _on_pause = nullptr;
on_mk_media_speed _on_speed = nullptr;
on_mk_media_source_regist _on_regist = nullptr;
void *_on_seek_data;
void* _on_seek_data;
void* _on_pause_data;
void* _on_speed_data;
void *_on_close_data;
void *_on_regist_data;
};
@@ -105,6 +136,20 @@ API_EXPORT void API_CALL mk_media_set_on_seek(mk_media ctx, on_mk_media_seek cb,
(*obj)->setOnSeek(cb, user_data);
}
API_EXPORT void API_CALL mk_media_set_on_pause(mk_media ctx, on_mk_media_pause cb, void* user_data)
{
assert(ctx);
MediaHelper::Ptr* obj = (MediaHelper::Ptr*) ctx;
(*obj)->setOnPause(cb, user_data);
}
API_EXPORT void API_CALL mk_media_set_on_speed(mk_media ctx, on_mk_media_speed cb, void* user_data)
{
assert(ctx);
MediaHelper::Ptr* obj = (MediaHelper::Ptr*) ctx;
(*obj)->setOnSpeed(cb, user_data);
}
API_EXPORT void API_CALL mk_media_set_on_regist(mk_media ctx, on_mk_media_source_regist cb, void *user_data){
assert(ctx);
MediaHelper::Ptr *obj = (MediaHelper::Ptr *) ctx;

View File

@@ -11,6 +11,8 @@
#include "mk_player.h"
#include "Util/logger.h"
#include "Player/MediaPlayer.h"
#include "Extension/H264.h"
using namespace std;
using namespace toolkit;
using namespace mediakit;
@@ -167,6 +169,16 @@ API_EXPORT void API_CALL mk_player_pause(mk_player ctx, int pause) {
});
}
API_EXPORT void API_CALL mk_player_speed(mk_player ctx, float speed) {
assert(ctx);
MediaPlayerForC& obj = **((MediaPlayerForC::Ptr*)ctx);
auto player = obj.getPlayer();
player->getPoller()->async([speed, player]() {
//切换线程后再操作
player->speed(speed);
});
}
API_EXPORT void API_CALL mk_player_seekto(mk_player ctx, float progress) {
assert(ctx);
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *)ctx);
@@ -177,6 +189,16 @@ API_EXPORT void API_CALL mk_player_seekto(mk_player ctx, float progress) {
});
}
API_EXPORT void API_CALL mk_player_seektoByPos(mk_player ctx, int seekPos){
assert(ctx);
MediaPlayerForC& obj = **((MediaPlayerForC::Ptr*)ctx);
auto player = obj.getPlayer();
player->getPoller()->async([seekPos, player]() {
//切换线程后再操作
player->seekTo((uint32_t)seekPos);
});
}
static void mk_player_set_on_event(mk_player ctx, on_mk_play_event cb, void *user_data, int type) {
assert(ctx);
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *)ctx);
@@ -204,6 +226,32 @@ API_EXPORT int API_CALL mk_player_video_codecId(mk_player ctx){
return track ? track->getCodecId() : CodecInvalid;
}
API_EXPORT int API_CALL mk_player_video_codecId_vendor_head(mk_player ctx, char* vendor, char* head, int* head_len)
{
assert(ctx);
MediaPlayerForC& obj = **((MediaPlayerForC::Ptr*)ctx);
auto track = dynamic_pointer_cast<VideoTrack>(obj->getTrack(TrackVideo));
int codecId = track ? track->getCodecId() : CodecInvalid;
if (codecId == CodecH264)
{
auto h264Track = dynamic_pointer_cast<H264Track>(obj->getTrack(TrackVideo));
auto pps = h264Track->getPps();
auto ppsLen = pps.size();
if (ppsLen >= (4 + 16))
{
std::string temVendor = std::string(pps.c_str() + 4, 16);
memcpy(vendor, temVendor.c_str(), temVendor.length());
if (ppsLen > (4 + 16))
{
std::string temHead = std::string(pps.c_str() + 20, ppsLen - 20);
memcpy(head, temHead.c_str(), temHead.length());
*head_len = temHead.length();
}
}
}
return codecId;
}
API_EXPORT int API_CALL mk_player_video_width(mk_player ctx) {
assert(ctx);
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *)ctx);
@@ -265,6 +313,14 @@ API_EXPORT float API_CALL mk_player_progress(mk_player ctx) {
return obj->getProgress();
}
API_EXPORT int API_CALL mk_player_progress_pos(mk_player ctx)
{
assert(ctx);
MediaPlayerForC& obj = **((MediaPlayerForC::Ptr*)ctx);
return obj->getProgressPos();
}
API_EXPORT float API_CALL mk_player_loss_rate(mk_player ctx, int track_type) {
assert(ctx);
MediaPlayerForC &obj = **((MediaPlayerForC::Ptr *)ctx);