video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-10-21 c60d61c48c7a1e7b693d4c3f6427e3b616d1f471
csrc/buz/recorder.cpp
@@ -78,7 +78,8 @@
            out_ = new FormatOut(in_->getFPS(), "mp4");
            
            int pid = getpid();
            file_path_ = dir_ + "/" + sole::uuid4().base62() + "-" + std::to_string(pid) + ".mp4";
            std::string filename(sole::uuid4().base62() + "-" + std::to_string(pid) + ".mp4");
            file_path_ = dir_ + "/" + filename;
            auto v = in_->getStream(AVMEDIA_TYPE_VIDEO);
            if (!v){
@@ -88,10 +89,18 @@
            if (!audio){
                a = NULL;
            }
            auto ret = out_->JustWriter(v, a, file_path_.c_str());
            bool ret = out_->JustWriter(v, a, file_path_.c_str());
            if (ret){
                logIt("start record file: %s", file_path_.c_str());
                logIt("start record file: %s", file_path_.c_str());
                return 0;
            }else{
                file_path_ = "./" + filename;
                ret = out_->JustWriter(v, a, file_path_.c_str());
                logIt("failed in dir %s, try file %s to start record file", dir_.c_str(), 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());
@@ -105,12 +114,18 @@
            }
            int pid = getpid();
            file_path_ = dir_ + "/" + sole::uuid4().base62() + "-" + std::to_string(pid) + ".hevc";
            std::string filename(sole::uuid4().base62() + "-" + std::to_string(pid) + ".mp4");
            file_path_ = dir_ + "/" + filename;
            fp_ = fopen(file_path_.c_str(), "wb");
            if (!fp_){
                logIt("write hevc open file error: %s", file_path_.c_str());
                return -1;
                file_path_ = "./" + filename;
                logIt("failed in dir %s, try file %s to start record hevc file", dir_.c_str(), file_path_.c_str());
                fp_ = fopen(file_path_.c_str(), "wb");
                if (!fp_){
                    logIt("failed start record hevc file: %s", file_path_.c_str());
                    return -1;
                }
            }
            logIt("start record file: %s", file_path_.c_str());
@@ -225,15 +240,22 @@
            int ret = mux_hevc(fp, file_path_.c_str());
            fclose(fp);
            if (remove(hevc_file.c_str()) != 0){
                logIt("mux hevc remove file %s failed", hevc_file.c_str());
            if (ret == 0){
                if (remove(hevc_file.c_str()) != 0){
                    logIt("mux hevc remove file %s failed", hevc_file.c_str());
                }
            }else{
                logIt("mux hevc to mp4 error, use raw hevc");
                file_path_ = hevc_file;
            }
            return ret;
            return 0;
        }
        static int read_buffer(void *opaque, uint8_t *buf, int buf_size){
            FILE *fp_open = (FILE*)opaque;
            if (!fp_open) logIt("mux hevc open file error");
           if(!feof(fp_open)){
              int true_size=fread(buf,1,buf_size,fp_open);
              return true_size;
@@ -250,8 +272,14 @@
                return -1;
            }
            if (in->openWithCustomIO(fp, read_buffer) < 0) {
                logIt("mux hevc open custom io error");
            int tryTime = 0;
            while (in->openWithCustomIO(fp, read_buffer) < 0) {
                usleep(10000);
                if (tryTime++ < 100){
                    logIt("mux hevc mux: %d failed open custom io %s, try again", tryTime, outfile);
                    continue;
                }
                logIt("mux hevc try %d time to open custom io, failed", tryTime);
                return -2;
            }
            if (in->open(NULL, NULL) < 0){
@@ -293,14 +321,10 @@
        void Recorder::end_writer(){
            int ret = -1;
            if (in_->IsHEVC()){
                ret = end_write_hevc();
                end_write_hevc();
            }else{
                ret = end_write_h264();
            }
            if (ret < 0){
                logIt("end write file : %s, h265: %d, failed", file_path_.c_str(), in_->IsHEVC());
                end_write_h264();
            }
            logIt("finished record : %s frames: %d", file_path_.c_str(), cur_frame);