From 762251329bca80422a8e65d0cdb36e86e84883cf Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 27 九月 2019 11:11:45 +0800 Subject: [PATCH] bug fix --- csrc/ffmpeg/format/FormatIn.cpp | 13 ---- csrc/ffmpeg/format/FormatOut.hpp | 9 +- csrc/ffmpeg/format/FormatOut.cpp | 99 +++++++++++++++++--------------- goffmpeg.go | 7 + csrc/cffmpeg.cpp | 2 csrc/buz/recorder.cpp | 2 csrc/ffmpeg/format/FormatIn.hpp | 2 7 files changed, 64 insertions(+), 70 deletions(-) diff --git a/csrc/buz/recorder.cpp b/csrc/buz/recorder.cpp index 09bdf19..7b6a483 100644 --- a/csrc/buz/recorder.cpp +++ b/csrc/buz/recorder.cpp @@ -74,7 +74,7 @@ int pid = getpid(); file_path_ = dir_ + "/" + sole::uuid4().base62() + "-" + std::to_string(pid) + ".mp4"; - auto ret = out_->JustWriter(in_->allStreams(), file_path_.c_str()); + auto ret = out_->JustWriter(in_->getStream(AVMEDIA_TYPE_VIDEO), in_->getStream(AVMEDIA_TYPE_AUDIO), file_path_.c_str()); if (ret){ logIt("start record file: %s", file_path_.c_str()); return 0; diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp index 331aa3b..af3d0c1 100644 --- a/csrc/cffmpeg.cpp +++ b/csrc/cffmpeg.cpp @@ -19,7 +19,7 @@ cffmpeg c_ffmpeg_create(const int log, const char *logfile){ bool logit = false; - if (log) logit = true; + if (log != 0) logit = true; return new Wrapper(logit, logfile); } diff --git a/csrc/ffmpeg/format/FormatIn.cpp b/csrc/ffmpeg/format/FormatIn.cpp index bee3ae7..eeb9621 100644 --- a/csrc/ffmpeg/format/FormatIn.cpp +++ b/csrc/ffmpeg/format/FormatIn.cpp @@ -274,19 +274,6 @@ return NULL; } - std::vector<AVStream*> FormatIn::allStreams(){ - std::vector<AVStream*> vec; - auto v = getStream(AVMEDIA_TYPE_VIDEO); - if (v){ - vec.push_back(v); - } - auto a = getStream(AVMEDIA_TYPE_AUDIO); - if (a){ - vec.push_back(a); - } - return vec; - } - AVCodecContext *FormatIn::getCodecContext(int type){ return dec_ctx_; } diff --git a/csrc/ffmpeg/format/FormatIn.hpp b/csrc/ffmpeg/format/FormatIn.hpp index 4eb7847..134be20 100644 --- a/csrc/ffmpeg/format/FormatIn.hpp +++ b/csrc/ffmpeg/format/FormatIn.hpp @@ -3,7 +3,6 @@ #include <stdint.h> #include <memory> -#include <vector> #include "PsToEs.hpp" struct AVFormatContext; @@ -47,7 +46,6 @@ bool allocCodec(AVCodec *dec, AVStream *s, AVDictionary **options); public: AVStream *getStream(int type = -1); - std::vector<AVStream*> allStreams(); AVCodecContext *getCodecContext(int type = 0); AVFormatContext *getFromatContext(){return ctx_;} const double getFPS()const{return fps_;} diff --git a/csrc/ffmpeg/format/FormatOut.cpp b/csrc/ffmpeg/format/FormatOut.cpp index 3dabfc8..a0cad4a 100644 --- a/csrc/ffmpeg/format/FormatOut.cpp +++ b/csrc/ffmpeg/format/FormatOut.cpp @@ -31,6 +31,8 @@ ,record_(false) ,fps_(0.0f) ,format_name_("mp4") + ,in_v_stream_(NULL) + ,in_a_stream_(NULL) {} FormatOut::~FormatOut() @@ -275,61 +277,63 @@ return true; } - bool FormatOut::copyCodecFromIn(std::vector<AVStream*> in){ - - for (int i = 0; i < in.size(); i++){ - - AVStream *in_stream = in[i]; - - AVStream *out_stream = avformat_new_stream(ctx_, in_stream->codec->codec); - if(!out_stream) - { - logIt("Failed allocating output stream.\n"); - return false; - } - - //灏嗚緭鍑烘祦鐨勭紪鐮佷俊鎭鍒跺埌杈撳叆娴� - auto ret = avcodec_copy_context(out_stream->codec, in_stream->codec); - if(ret<0) - { - logIt("Failed to copy context from input to output stream codec context\n"); - return false; - } - - if (in_stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){ - v_idx_ = i; - logIt("copy video from instream"); - - out_stream->codecpar->codec_tag = out_stream->codec->codec_tag = 0; - - if(ctx_->oformat->flags & AVFMT_GLOBALHEADER) - out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; - } - if (in_stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){ - logIt("copy audio from instream"); - a_idx_ = i; - - out_stream->codecpar->codec_tag = out_stream->codec->codec_tag = 0; - - if(ctx_->oformat->flags & AVFMT_GLOBALHEADER) - out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; - - } + bool FormatOut::addStream(AVStream *s){ + AVStream *in_stream = s; + + AVStream *out_stream = avformat_new_stream(ctx_, in_stream->codec->codec); + if(!out_stream) + { + logIt("Failed allocating output stream.\n"); + return false; } - - in_streams_ = in; - + //灏嗚緭鍑烘祦鐨勭紪鐮佷俊鎭鍒跺埌杈撳叆娴� + auto ret = avcodec_copy_context(out_stream->codec, in_stream->codec); + if(ret<0) + { + logIt("Failed to copy context from input to output stream codec context\n"); + return false; + } + out_stream->codecpar->codec_tag = out_stream->codec->codec_tag = 0; + + if(ctx_->oformat->flags & AVFMT_GLOBALHEADER) + out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + return true; } - bool FormatOut::JustWriter(std::vector<AVStream*> in, const char *filename){ + bool FormatOut::copyCodecFromIn(AVStream *v, AVStream *a){ + if (v){ + v_idx_ = 0; + in_v_stream_ = v; + + if (!addStream(v)){ + logIt("format out add video stream error"); + return false; + }else{ + logIt("copy video from instream"); + } + } + if (a){ + a_idx_ = 1; + in_a_stream_ = a; + if (!addStream(a)){ + logIt("format out add audio stream error"); + return false; + }else{ + logIt("copy audio from instream"); + } + } + return true; + } + + bool FormatOut::JustWriter(AVStream *v, AVStream *a, const char *filename){ if(ctx_){ clear(); } bool flag = open(NULL, format_name_.c_str()); - flag = copyCodecFromIn(in) && flag; + flag = copyCodecFromIn(v, a) && flag; if(!flag){ logIt("FormatOut JustWriter error from in"); return false; @@ -396,7 +400,7 @@ return; } - if (pkt->pts == AV_NOPTS_VALUE && pkt->pts == AV_NOPTS_VALUE){ + if (!in_a_stream_){ int64_t time_stamp = frame_cnt; pkt->pos = -1; @@ -417,7 +421,8 @@ AVStream *in_stream,*out_stream; int out_idx = -1; - for (auto i : in_streams_){ + std::vector<AVStream*> in_streams{in_v_stream_, in_a_stream_}; + for (auto i : in_streams){ if (i->index == pkt->stream_index){ if (i->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){ out_idx = v_idx_; diff --git a/csrc/ffmpeg/format/FormatOut.hpp b/csrc/ffmpeg/format/FormatOut.hpp index 238d22f..9aa9b15 100644 --- a/csrc/ffmpeg/format/FormatOut.hpp +++ b/csrc/ffmpeg/format/FormatOut.hpp @@ -4,7 +4,6 @@ #include <stdlib.h> #include <memory> #include <string> -#include <vector> struct AVFormatContext; struct AVStream; @@ -35,11 +34,12 @@ int encode(AVPacket *pkt, AVFrame *frame); public: - bool copyCodecFromIn(std::vector<AVStream*> in); + bool addStream(AVStream *s); + bool copyCodecFromIn(AVStream *v, AVStream *a); bool openResource(const char *filename, const int flags); bool closeResource(); - bool JustWriter(std::vector<AVStream*> in, const char *filename); + bool JustWriter(AVStream *v, AVStream *a, const char *filename); bool EncodeWriter(const char *filename); bool writeFrame(AVPacket *pkt, const int64_t &frame_cnt, bool interleaved = true); void adjustPTS(AVPacket *pkt, const int64_t &frame_cnt); @@ -73,7 +73,8 @@ std::string format_name_; // rec - std::vector<AVStream*> in_streams_; + AVStream *in_v_stream_; + AVStream *in_a_stream_; }; } #endif \ No newline at end of file diff --git a/goffmpeg.go b/goffmpeg.go index 5fca4a9..c341b73 100644 --- a/goffmpeg.go +++ b/goffmpeg.go @@ -77,7 +77,9 @@ func New(conf Config) *GoFFMPEG { var l *C.char - f := C.wrap_fn_create(0, l) + + logit := 0 + f := C.wrap_fn_create(C.int(logit), l) if f == nil { return nil @@ -102,7 +104,8 @@ lf := C.CString(logfile) defer C.free(unsafe.Pointer(lf)) - f := C.wrap_fn_create(1, lf) + logit := 1 + f := C.wrap_fn_create(C.int(logit), lf) if f == nil { return nil } -- Gitblit v1.8.0