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