mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-12 19:24:22 +08:00
addTrack/inputFrame接口支持返回值;新增全局添加静音音频接口
This commit is contained in:
@@ -254,30 +254,29 @@ const AVCodecContext *FFmpegDecoder::getContext() const {
|
||||
return _context.get();
|
||||
}
|
||||
|
||||
void FFmpegDecoder::inputFrame_l(const Frame::Ptr &frame) {
|
||||
bool FFmpegDecoder::inputFrame_l(const Frame::Ptr &frame) {
|
||||
if (_do_merger) {
|
||||
_merger.inputFrame(frame, [&](uint32_t dts, uint32_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
||||
return _merger.inputFrame(frame, [&](uint32_t dts, uint32_t pts, const Buffer::Ptr &buffer, bool have_idr) {
|
||||
decodeFrame(buffer->data(), buffer->size(), dts, pts);
|
||||
});
|
||||
} else {
|
||||
decodeFrame(frame->data(), frame->size(), frame->dts(), frame->pts());
|
||||
}
|
||||
return decodeFrame(frame->data(), frame->size(), frame->dts(), frame->pts());
|
||||
}
|
||||
|
||||
void FFmpegDecoder::inputFrame(const Frame::Ptr &frame) {
|
||||
bool FFmpegDecoder::inputFrame(const Frame::Ptr &frame) {
|
||||
if (!TaskManager::isEnabled()) {
|
||||
inputFrame_l(frame);
|
||||
} else {
|
||||
auto frame_cache = Frame::getCacheAbleFrame(frame);
|
||||
addDecodeTask(frame->keyFrame(), [this, frame_cache]() {
|
||||
inputFrame_l(frame_cache);
|
||||
//此处模拟解码太慢导致的主动丢帧
|
||||
//usleep(100 * 1000);
|
||||
});
|
||||
return inputFrame_l(frame);
|
||||
}
|
||||
auto frame_cache = Frame::getCacheAbleFrame(frame);
|
||||
addDecodeTask(frame->keyFrame(), [this, frame_cache]() {
|
||||
inputFrame_l(frame_cache);
|
||||
//此处模拟解码太慢导致的主动丢帧
|
||||
//usleep(100 * 1000);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
void FFmpegDecoder::decodeFrame(const char *data, size_t size, uint32_t dts, uint32_t pts) {
|
||||
bool FFmpegDecoder::decodeFrame(const char *data, size_t size, uint32_t dts, uint32_t pts) {
|
||||
TimeTicker2(30, TraceL);
|
||||
|
||||
auto pkt = alloc_av_packet();
|
||||
@@ -291,7 +290,7 @@ void FFmpegDecoder::decodeFrame(const char *data, size_t size, uint32_t dts, uin
|
||||
if (ret != AVERROR_INVALIDDATA) {
|
||||
WarnL << "avcodec_send_packet failed:" << ffmpeg_err(ret);
|
||||
}
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
@@ -311,6 +310,7 @@ void FFmpegDecoder::decodeFrame(const char *data, size_t size, uint32_t dts, uin
|
||||
}
|
||||
onDecode(out_frame);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void FFmpegDecoder::setOnDecode(FFmpegDecoder::onDec cb) {
|
||||
|
||||
@@ -95,15 +95,15 @@ public:
|
||||
FFmpegDecoder(const Track::Ptr &track);
|
||||
~FFmpegDecoder();
|
||||
|
||||
void inputFrame(const Frame::Ptr &frame) override;
|
||||
bool inputFrame(const Frame::Ptr &frame) override;
|
||||
void setOnDecode(onDec cb);
|
||||
void flush();
|
||||
const AVCodecContext *getContext() const;
|
||||
|
||||
private:
|
||||
void onDecode(const FFmpegFrame::Ptr &frame);
|
||||
void inputFrame_l(const Frame::Ptr &frame);
|
||||
void decodeFrame(const char *data, size_t size, uint32_t dts, uint32_t pts);
|
||||
bool inputFrame_l(const Frame::Ptr &frame);
|
||||
bool decodeFrame(const char *data, size_t size, uint32_t dts, uint32_t pts);
|
||||
|
||||
private:
|
||||
bool _do_merger = false;
|
||||
|
||||
@@ -84,7 +84,7 @@ int main(int argc, char *argv[]) {
|
||||
});
|
||||
});
|
||||
auto delegate = std::make_shared<FrameWriterInterfaceHelper>([decoder](const Frame::Ptr &frame) {
|
||||
decoder->inputFrame(frame);
|
||||
return decoder->inputFrame(frame);
|
||||
});
|
||||
videoTrack->addDelegate(delegate);
|
||||
}
|
||||
@@ -106,7 +106,7 @@ int main(int argc, char *argv[]) {
|
||||
audio_player->playPCM((const char *) (pcm->get()->data[0]), len);
|
||||
});
|
||||
auto audio_delegate = std::make_shared<FrameWriterInterfaceHelper>( [decoder](const Frame::Ptr &frame) {
|
||||
decoder->inputFrame(frame);
|
||||
return decoder->inputFrame(frame);
|
||||
});
|
||||
audioTrack->addDelegate(audio_delegate);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user