From a4cfd08f442fbf6febf06c98bbbed1723aaf5fd4 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期六, 28 九月 2019 11:03:24 +0800
Subject: [PATCH] change audio pts

---
 csrc/buz/recorder.cpp |   69 +++++++++++++++++++++-------------
 1 files changed, 43 insertions(+), 26 deletions(-)

diff --git a/csrc/buz/recorder.cpp b/csrc/buz/recorder.cpp
index af5a1fc..c3b4d84 100644
--- a/csrc/buz/recorder.cpp
+++ b/csrc/buz/recorder.cpp
@@ -34,6 +34,8 @@
         ,func_rec_info_(nullptr)
         ,thrd_(nullptr)
         ,error_occured_(false)
+        ,audio_(false)
+        ,cur_frame_a(0)
         {
             // logIt("RECODER ID: %s", id_.c_str());
         }
@@ -59,7 +61,7 @@
             
         }
 
-        int Recorder::init_writer(){
+        int Recorder::init_writer(const bool audio){
             if (out_) {
                 delete out_;
             }
@@ -69,13 +71,26 @@
                 return -1;
             }
 
-            out_ = new FormatOut(in_->getStream(), "mp4");
+            out_ = new FormatOut(in_->getFPS(), "mp4");
+            
+            int pid = getpid();
+            file_path_ = dir_ + "/" + sole::uuid4().base62() + "-" + std::to_string(pid) + ".mp4";
 
-            file_path_ = dir_ + "/" + sole::uuid4().base62() + ".mp4";
-            auto ret = out_->JustWriter(in_->getStream(), file_path_.c_str());
+            auto v = in_->getStream(AVMEDIA_TYPE_VIDEO);
+            if (!v){
+                return -2;
+            }
+            AVStream *a = in_->getStream(AVMEDIA_TYPE_AUDIO);
+            if (!audio){
+                a = NULL;
+            }
+            auto ret = out_->JustWriter(v, a, file_path_.c_str());
             if (ret){
+                logIt("start record file: %s", file_path_.c_str());
                 return 0;
             }
+
+            logIt("failed to start record: %s", file_path_.c_str());
 
             return -1;
         }
@@ -90,17 +105,25 @@
                 return 1;
             }
 
-            int64_t cur = cur_frame++;
             AVPacket &op = pkt.data->getAVPacket();
             AVPacket np(op);
             av_copy_packet(&np, &op);
-            auto ret = out_->writeFrame(np, cur);
-            av_packet_unref(&np);
-            if (!ret) return -1;
             
-            if(pkt.id == id_frame_){
-                id_frame_in_file_ = cur_frame-1;
+            int64_t cur = cur_frame;
+            if (in_->isVideoPkt(&np)){
+
+                if(pkt.id == id_frame_){
+                    id_frame_in_file_ = cur_frame;
+                }
+                cur_frame++;
+            }else if (in_->isAudioPkt(&np)) {
+                cur = cur_frame_a++;
             }
+            
+            auto ret = out_->writeFrame(&np, cur);
+            av_packet_unref(&np);
+            
+            if (!ret) return -1;
             
             // logIt("WRITE FRAME ID: %d, RECORD ID: %d", pkt.id, id_frame_);
             return 0;
@@ -162,10 +185,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 +200,8 @@
                 minduration = fps * mind;
                 end_frame = minduration;
             }
+
+            audio_ = audio;
 
             // logIt("minduration %d maxduration %d curduration %d", minduration, maxduration, end_frame);    
 
@@ -221,11 +246,8 @@
 
             if(id_frame_ == -1){
                 //wait I 
-                if (list_pkt_.empty()) {
-                    AVPacket &avpkt = pkt.data->getAVPacket();
-                    if (!(avpkt.flags & AV_PKT_FLAG_KEY)){
-                        return -1;
-                    }
+                if (!audio_ && in_->isAudioPkt(&pkt.data->getAVPacket())){
+                    return 0;
                 }
 
                 maybe_dump_gop();
@@ -248,12 +270,8 @@
             std::lock_guard<std::mutex> locker(mutex_pkt_);
             bool i = false;
             for (auto &p : lst){
-                if (!i){
-                    AVPacket &avpkt = p.data->getAVPacket();
-                    if (!(avpkt.flags & AV_PKT_FLAG_KEY)){
-                        continue;
-                    }
-                    i = true;
+                if (!audio_ && in_->isAudioPkt(&p.data->getAVPacket())){
+                    continue;
                 }
                 
                 list_pkt_.push_back(p);
@@ -270,9 +288,8 @@
             while (list_pkt_.size() > minduration) {
                 list_pkt_.pop_front();
                 while(!list_pkt_.empty()){
-                    auto &cache = list_pkt_.front();
-                    AVPacket &avpkt = cache.data->getAVPacket();
-                    if (!(avpkt.flags & AV_PKT_FLAG_KEY)){
+                    auto &i = list_pkt_.front();
+                    if (!(i.data->getAVPacket().flags & AV_PKT_FLAG_KEY)){
                         list_pkt_.pop_front();
                     }else{
                         break;

--
Gitblit v1.8.0