From be9c1d1f659b0ff31f656424c478e83a4f7c53b5 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 20 九月 2019 11:44:19 +0800 Subject: [PATCH] update ffmpeg --- csrc/buz/recorder.cpp | 28 +++++++++++++++++++++++----- 1 files changed, 23 insertions(+), 5 deletions(-) diff --git a/csrc/buz/recorder.cpp b/csrc/buz/recorder.cpp index af5a1fc..86afe89 100644 --- a/csrc/buz/recorder.cpp +++ b/csrc/buz/recorder.cpp @@ -34,6 +34,7 @@ ,func_rec_info_(nullptr) ,thrd_(nullptr) ,error_occured_(false) + ,audio_(false) { // logIt("RECODER ID: %s", id_.c_str()); } @@ -59,7 +60,7 @@ } - int Recorder::init_writer(){ + int Recorder::init_writer(const bool audio){ if (out_) { delete out_; } @@ -69,10 +70,18 @@ return -1; } - out_ = new FormatOut(in_->getStream(), "mp4"); + out_ = new FormatOut(in_->getFPS(), "mp4"); + AVStream *vs = in_->getStream(0); + AVStream *as = in_->getStream(1); + if (!vs) return -1; + if (audio && !as) logIt("there is no audio"); + + std::vector<AVStream*> in; + in.push_back(vs); + if (audio && as) in.push_back(as); file_path_ = dir_ + "/" + sole::uuid4().base62() + ".mp4"; - auto ret = out_->JustWriter(in_->getStream(), file_path_.c_str()); + auto ret = out_->JustWriter(in, file_path_.c_str()); if (ret){ return 0; } @@ -162,10 +171,10 @@ end_writer(); } - int Recorder::Run(const char* output, const int mind, const int maxd){ + int Recorder::Run(const char* output, const int mind, const int maxd, const bool audio){ dir_ = output; - int ret = init_writer(); + int ret = init_writer(audio); if(ret != 0){ logIt("recorder init writer error"); return -1; @@ -177,6 +186,8 @@ minduration = fps * mind; end_frame = minduration; } + + audio_ = audio; // logIt("minduration %d maxduration %d curduration %d", minduration, maxduration, end_frame); @@ -221,6 +232,10 @@ if(id_frame_ == -1){ //wait I + if (!audio_ && in_->isAudioPkt(pkt.data->getAVPacket())){ + return 0; + } + if (list_pkt_.empty()) { AVPacket &avpkt = pkt.data->getAVPacket(); if (!(avpkt.flags & AV_PKT_FLAG_KEY)){ @@ -249,6 +264,9 @@ bool i = false; for (auto &p : lst){ if (!i){ + if (!audio_ && in_->isAudioPkt(p.data->getAVPacket())){ + continue; + } AVPacket &avpkt = p.data->getAVPacket(); if (!(avpkt.flags & AV_PKT_FLAG_KEY)){ continue; -- Gitblit v1.8.0