csrc/buz/recorder.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
csrc/cffmpeg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
csrc/ffmpeg/format/FormatIn.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
csrc/ffmpeg/format/FormatIn.hpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
csrc/ffmpeg/format/FormatOut.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
csrc/ffmpeg/format/FormatOut.hpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
goffmpeg.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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; 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); } 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_; } 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_;} 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_; 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 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 }