Compare commits

..

1 Commits

Author SHA1 Message Date
imp_rayjay
1b8046d6c9
Merge 6119ac9c53 into 61a93fab6a 2024-10-14 10:13:16 +08:00
6 changed files with 18 additions and 62 deletions

@ -1 +1 @@
Subproject commit 08c094ea14f259ecf0c356e6243cb47ee96ce292 Subproject commit 46231014e2a7ec1903d4a37e96222481ecc779d8

View File

@ -12,7 +12,6 @@
#define MK_RECORDER_API_H_ #define MK_RECORDER_API_H_
#include "mk_common.h" #include "mk_common.h"
#include "mk_util.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -125,18 +124,6 @@ API_EXPORT int API_CALL mk_recorder_start(int type, const char *vhost, const cha
*/ */
API_EXPORT int API_CALL mk_recorder_stop(int type, const char *vhost, const char *app, const char *stream); API_EXPORT int API_CALL mk_recorder_stop(int type, const char *vhost, const char *app, const char *stream);
/**
* mp4列表
* @param vhost
* @param app app
* @param stream id
* @param file_path
* @param file_repeat
* @param ini
*/
API_EXPORT void API_CALL mk_load_mp4_file(const char *vhost, const char *app, const char *stream, const char *file_path, int file_repeat);
API_EXPORT void API_CALL mk_load_mp4_file2(const char *vhost, const char *app, const char *stream, const char *file_path, int file_repeat, mk_ini ini);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -11,7 +11,6 @@
#include "mk_recorder.h" #include "mk_recorder.h"
#include "Rtmp/FlvMuxer.h" #include "Rtmp/FlvMuxer.h"
#include "Record/Recorder.h" #include "Record/Recorder.h"
#include "Record/MP4Reader.h"
using namespace std; using namespace std;
using namespace toolkit; using namespace toolkit;
@ -84,36 +83,3 @@ API_EXPORT int API_CALL mk_recorder_stop(int type, const char *vhost, const char
assert(vhost && app && stream); assert(vhost && app && stream);
return stopRecord((Recorder::type)type,vhost,app,stream); return stopRecord((Recorder::type)type,vhost,app,stream);
} }
API_EXPORT void API_CALL mk_load_mp4_file(const char *vhost, const char *app, const char *stream, const char *file_path, int file_repeat) {
mINI ini;
mk_load_mp4_file2(vhost, app, stream, file_path, file_repeat, (mk_ini)&ini);
}
API_EXPORT void API_CALL mk_load_mp4_file2(const char *vhost, const char *app, const char *stream, const char *file_path, int file_repeat, mk_ini ini) {
#if ENABLE_MP4
assert(vhost && app && stream && file_path && ini);
ProtocolOption option(*((mINI *)ini));
// mp4支持多track [AUTO-TRANSLATED:b9688762]
// mp4 supports multiple tracks
option.max_track = 16;
// 默认解复用mp4不生成mp4 [AUTO-TRANSLATED:11f2dcee]
// By default, demultiplexing mp4 does not generate mp4
option.enable_mp4 = false;
// 但是如果参数明确指定开启mp4, 那么也允许之 [AUTO-TRANSLATED:b143a9e3]
// But if the parameter explicitly specifies to enable mp4, then it is also allowed
// 强制无人观看时自动关闭 [AUTO-TRANSLATED:f7c85948]
// Force automatic shutdown when no one is watching
option.auto_close = true;
MediaTuple tuple = { vhost, app, stream, "" };
auto reader = std::make_shared<MP4Reader>(tuple, file_path, option);
// sample_ms设置为0从配置文件加载file_repeat可以指定如果配置文件也指定循环解复用那么强制开启 [AUTO-TRANSLATED:23e826b4]
// sample_ms is set to 0, loaded from the configuration file; file_repeat can be specified, if the configuration file also specifies loop demultiplexing,
// then force it to be enabled
reader->startReadMP4(0, true, file_repeat);
#else
WarnL << "MP4-related features are disabled. Please enable the ENABLE_MP4 macro and recompile.";
#endif
}

View File

@ -25,8 +25,13 @@ RUN apt-get update && \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
libssl-dev \ libssl-dev \
libmysqlclient-dev \
libx264-dev \
libfaac-dev \
gcc \ gcc \
g++ \ g++ \
libavcodec-dev libavutil-dev libswscale-dev libresample-dev \
libsdl-dev libusrsctp-dev \
gdb && \ gdb && \
apt-get autoremove -y && \ apt-get autoremove -y && \
apt-get clean -y && \ apt-get clean -y && \
@ -64,9 +69,13 @@ RUN apt-get update && \
tzdata \ tzdata \
curl \ curl \
libssl-dev \ libssl-dev \
libx264-dev \
libfaac-dev \
ffmpeg \ ffmpeg \
gcc \ gcc \
g++ \ g++ \
libavcodec-dev libavutil-dev libswscale-dev libresample-dev \
libsdl-dev libusrsctp-dev \
gdb && \ gdb && \
apt-get autoremove -y && \ apt-get autoremove -y && \
apt-get clean -y && \ apt-get clean -y && \

View File

@ -122,17 +122,12 @@ private:
std::list<std::pair<uint64_t, Frame::Ptr>> _cache; std::list<std::pair<uint64_t, Frame::Ptr>> _cache;
}; };
std::shared_ptr<MediaSinkInterface> MultiMediaSourceMuxer::makeRecorder(MediaSource &sender, Recorder::type type) { static std::shared_ptr<MediaSinkInterface> makeRecorder(MediaSource &sender, const vector<Track::Ptr> &tracks, Recorder::type type, const ProtocolOption &option){
auto recorder = Recorder::createRecorder(type, sender.getMediaTuple(), _option); auto recorder = Recorder::createRecorder(type, sender.getMediaTuple(), option);
for (auto &track : getTracks()) { for (auto &track : tracks) {
recorder->addTrack(track); recorder->addTrack(track);
} }
recorder->addTrackCompleted(); recorder->addTrackCompleted();
if (_ring) {
_ring->flushGop([&](const Frame::Ptr &frame) {
recorder->inputFrame(frame);
});
}
return recorder; return recorder;
} }
@ -310,7 +305,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
// 开始录制 [AUTO-TRANSLATED:36d99250] // 开始录制 [AUTO-TRANSLATED:36d99250]
// Start recording // Start recording
_option.hls_save_path = custom_path; _option.hls_save_path = custom_path;
auto hls = dynamic_pointer_cast<HlsRecorder>(makeRecorder(sender, type)); auto hls = dynamic_pointer_cast<HlsRecorder>(makeRecorder(sender, getTracks(), type, _option));
if (hls) { if (hls) {
// 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92] // 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92]
// Set the event listener for HlsMediaSource // Set the event listener for HlsMediaSource
@ -330,7 +325,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
// Start recording // Start recording
_option.mp4_save_path = custom_path; _option.mp4_save_path = custom_path;
_option.mp4_max_second = max_second; _option.mp4_max_second = max_second;
_mp4 = makeRecorder(sender, type); _mp4 = makeRecorder(sender, getTracks(), type, _option);
} else if (!start && _mp4) { } else if (!start && _mp4) {
// 停止录制 [AUTO-TRANSLATED:3dee9292] // 停止录制 [AUTO-TRANSLATED:3dee9292]
// Stop recording // Stop recording
@ -343,7 +338,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
// 开始录制 [AUTO-TRANSLATED:36d99250] // 开始录制 [AUTO-TRANSLATED:36d99250]
// Start recording // Start recording
_option.hls_save_path = custom_path; _option.hls_save_path = custom_path;
auto hls = dynamic_pointer_cast<HlsFMP4Recorder>(makeRecorder(sender, type)); auto hls = dynamic_pointer_cast<HlsFMP4Recorder>(makeRecorder(sender, getTracks(), type, _option));
if (hls) { if (hls) {
// 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92] // 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92]
// Set the event listener for HlsMediaSource // Set the event listener for HlsMediaSource
@ -359,7 +354,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
} }
case Recorder::type_fmp4: { case Recorder::type_fmp4: {
if (start && !_fmp4) { if (start && !_fmp4) {
auto fmp4 = dynamic_pointer_cast<FMP4MediaSourceMuxer>(makeRecorder(sender, type)); auto fmp4 = dynamic_pointer_cast<FMP4MediaSourceMuxer>(makeRecorder(sender, getTracks(), type, _option));
if (fmp4) { if (fmp4) {
fmp4->setListener(shared_from_this()); fmp4->setListener(shared_from_this());
} }
@ -371,7 +366,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
} }
case Recorder::type_ts: { case Recorder::type_ts: {
if (start && !_ts) { if (start && !_ts) {
auto ts = dynamic_pointer_cast<TSMediaSourceMuxer>(makeRecorder(sender, type)); auto ts = dynamic_pointer_cast<TSMediaSourceMuxer>(makeRecorder(sender, getTracks(), type, _option));
if (ts) { if (ts) {
ts->setListener(shared_from_this()); ts->setListener(shared_from_this());
} }

View File

@ -232,7 +232,6 @@ protected:
private: private:
void createGopCacheIfNeed(); void createGopCacheIfNeed();
std::shared_ptr<MediaSinkInterface> makeRecorder(MediaSource &sender, Recorder::type type);
private: private:
bool _is_enable = false; bool _is_enable = false;