mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-14 12:05:58 +08:00
rtsp/rtmp/mp4支持opus并整理代码
This commit is contained in:
@@ -12,22 +12,16 @@
|
||||
#include "Util/logger.h"
|
||||
#include "Util/base64.h"
|
||||
#include "Extension/AAC.h"
|
||||
#include "Extension/Opus.h"
|
||||
#include "Extension/G711.h"
|
||||
#include "Extension/H264.h"
|
||||
#include "Extension/H265.h"
|
||||
|
||||
using namespace toolkit;
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
DevChannel::DevChannel(const string &vhost,
|
||||
const string &app,
|
||||
const string &stream_id,
|
||||
float duration,
|
||||
bool enable_rtsp,
|
||||
bool enable_rtmp,
|
||||
bool enable_hls,
|
||||
bool enable_mp4) :
|
||||
DevChannel::DevChannel(const string &vhost, const string &app, const string &stream_id, float duration,
|
||||
bool enable_rtsp, bool enable_rtmp, bool enable_hls, bool enable_mp4) :
|
||||
MultiMediaSourceMuxer(vhost, app, stream_id, duration, enable_rtsp, enable_rtmp, enable_hls, enable_mp4) {}
|
||||
|
||||
DevChannel::~DevChannel() {}
|
||||
@@ -109,11 +103,12 @@ void DevChannel::inputH265(const char *data, int len, uint32_t dts, uint32_t pts
|
||||
inputFrame(frame);
|
||||
}
|
||||
|
||||
class AACFrameCacheAble : public AACFrameNoCacheAble{
|
||||
class FrameAutoDelete : public FrameFromPtr{
|
||||
public:
|
||||
template <typename ... ARGS>
|
||||
AACFrameCacheAble(ARGS && ...args) : AACFrameNoCacheAble(std::forward<ARGS>(args)...){};
|
||||
virtual ~AACFrameCacheAble() {
|
||||
FrameAutoDelete(ARGS && ...args) : FrameFromPtr(std::forward<ARGS>(args)...){}
|
||||
|
||||
~FrameAutoDelete() override {
|
||||
delete [] _ptr;
|
||||
};
|
||||
|
||||
@@ -123,31 +118,32 @@ public:
|
||||
};
|
||||
|
||||
void DevChannel::inputAAC(const char *data_without_adts, int len, uint32_t dts, const char *adts_header){
|
||||
if(dts == 0){
|
||||
dts = (uint32_t)_aTicker[1].elapsedTime();
|
||||
if (dts == 0) {
|
||||
dts = (uint32_t) _aTicker[1].elapsedTime();
|
||||
}
|
||||
|
||||
if(adts_header){
|
||||
if(adts_header + 7 == data_without_adts){
|
||||
if (adts_header) {
|
||||
if (adts_header + ADTS_HEADER_LEN == data_without_adts) {
|
||||
//adts头和帧在一起
|
||||
inputFrame(std::make_shared<AACFrameNoCacheAble>((char *)data_without_adts - 7, len + 7, dts, 0, 7));
|
||||
}else{
|
||||
inputFrame(std::make_shared<FrameFromPtr>(_audio->codecId, (char *) data_without_adts - ADTS_HEADER_LEN, len + ADTS_HEADER_LEN, dts, 0, ADTS_HEADER_LEN));
|
||||
} else {
|
||||
//adts头和帧不在一起
|
||||
char *dataWithAdts = new char[len + 7];
|
||||
memcpy(dataWithAdts, adts_header, 7);
|
||||
memcpy(dataWithAdts + 7 , data_without_adts , len);
|
||||
inputFrame(std::make_shared<AACFrameCacheAble>(dataWithAdts, len + 7, dts, 0, 7));
|
||||
char *data_with_adts = new char[len + ADTS_HEADER_LEN];
|
||||
memcpy(data_with_adts, adts_header, ADTS_HEADER_LEN);
|
||||
memcpy(data_with_adts + ADTS_HEADER_LEN, data_without_adts, len);
|
||||
inputFrame(std::make_shared<FrameAutoDelete>(_audio->codecId, data_with_adts, len + ADTS_HEADER_LEN, dts, 0, ADTS_HEADER_LEN));
|
||||
}
|
||||
} else {
|
||||
//没有adts头
|
||||
inputFrame(std::make_shared<FrameFromPtr>(_audio->codecId, (char *) data_without_adts, len, dts, 0, 0));
|
||||
}
|
||||
}
|
||||
|
||||
void DevChannel::inputG711(const char *data, int len, uint32_t dts){
|
||||
void DevChannel::inputAudio(const char *data, int len, uint32_t dts){
|
||||
if (dts == 0) {
|
||||
dts = (uint32_t)_aTicker[1].elapsedTime();
|
||||
dts = (uint32_t) _aTicker[1].elapsedTime();
|
||||
}
|
||||
auto frame = std::make_shared<G711FrameNoCacheAble>((char*)data, len, dts, 0);
|
||||
frame->setCodec(_audio->codecId);
|
||||
inputFrame(frame);
|
||||
inputFrame(std::make_shared<FrameFromPtr>(_audio->codecId, (char *) data, len, dts, 0));
|
||||
}
|
||||
|
||||
void DevChannel::initVideo(const VideoInfo &info) {
|
||||
@@ -165,6 +161,7 @@ void DevChannel::initAudio(const AudioInfo &info) {
|
||||
case CodecAAC : addTrack(std::make_shared<AACTrack>()); break;
|
||||
case CodecG711A :
|
||||
case CodecG711U : addTrack(std::make_shared<G711Track>(info.codecId, info.iSampleRate, info.iChannel, info.iSampleBit)); break;
|
||||
case CodecOpus : addTrack(std::make_shared<OpusTrack>()); break;
|
||||
default: WarnL << "不支持该类型的音频编码类型:" << info.codecId; break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user