From 93f44a10e2e8942e57e62bb210a2ca7d206a51b7 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期二, 24 九月 2019 11:26:44 +0800 Subject: [PATCH] add rec audio; --- csrc/worker/stream.cpp | 42 +++++++++++++++++++----------------------- 1 files changed, 19 insertions(+), 23 deletions(-) diff --git a/csrc/worker/stream.cpp b/csrc/worker/stream.cpp index 1828304..9fe11da 100644 --- a/csrc/worker/stream.cpp +++ b/csrc/worker/stream.cpp @@ -1,7 +1,11 @@ #include "stream.hpp" -#include "../ffmpeg/data/CodedData.hpp" +extern "C"{ +#include <libavcodec/avcodec.h> +} + #include "../ffmpeg/format/FormatIn.hpp" +#include "../ffmpeg/data/CodedData.hpp" namespace cffmpeg_wrap{ stream::stream(ffwrapper::FormatIn *in, const int maxSize) @@ -12,50 +16,42 @@ stream::~stream(){ std::lock_guard<std::mutex> locker(mutex_avpkt_); - list_avpkt_.clear(); + list_pkt_.clear(); } - int stream::SetPacket(std::shared_ptr<ffwrapper::CodedData> data){ + int stream::SetPacket(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ if (data){ - auto audio = streamRef_->isAudioPkt(data->getAVPacket()); // 濡傛灉鍖呮槸闊抽鍖�,浣嗘槸涓嶄娇鐢ㄩ煶棰�,鐩存帴杩斿洖 - if (!audio_ && audio){ + if (!audio_ && streamRef_->isAudioPkt(&data->getAVPacket())){ return 0; } std::lock_guard<std::mutex> locker(mutex_avpkt_); - list_avpkt_.push_back(data); + list_pkt_.push_back({data, id}); - while(list_avpkt_.size() > max_size_){ - list_avpkt_.pop_front(); - while(!list_avpkt_.empty()){ - auto &cache = list_avpkt_.front(); - AVPacket &avpkt = cache->getAVPacket(); - if (!(avpkt.flags & AV_PKT_FLAG_KEY)){ - list_avpkt_.pop_front(); - }else{ - break; - } - } + while(list_pkt_.size() > max_size_/2*3){ + list_pkt_.pop_front(); } - return list_avpkt_.size(); + + return list_pkt_.size(); } return 0; } void stream::GetPacket(unsigned char **pktData, int *size, int *key){ std::lock_guard<std::mutex> l(mutex_avpkt_); - if(list_avpkt_.empty()){ + if(list_pkt_.empty()){ return; } - auto data = list_avpkt_.front(); - auto pkt = data->getAVPacket(); + + auto data = list_pkt_.front(); + list_pkt_.pop_front(); + + auto pkt = data.data->getAVPacket(); *key = pkt.flags & AV_PKT_FLAG_KEY; *size = pkt.size; *pktData = (unsigned char *)malloc(*size); memcpy(*pktData, pkt.data, pkt.size); - - list_avpkt_.pop_front(); } } \ No newline at end of file -- Gitblit v1.8.0