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/ffmpeg/format/FormatIn.cpp | 9 ++++
csrc/ffmpeg/format/FormatOut.cpp | 54 ++++++++------------------
csrc/buz/recorder.hpp | 3 +
csrc/buz/recorder.cpp | 3 +
csrc/ffmpeg/format/FormatIn.hpp | 1
5 files changed, 31 insertions(+), 39 deletions(-)
diff --git a/csrc/buz/recorder.cpp b/csrc/buz/recorder.cpp
index 7d2afd7..c3b4d84 100644
--- a/csrc/buz/recorder.cpp
+++ b/csrc/buz/recorder.cpp
@@ -35,6 +35,7 @@
,thrd_(nullptr)
,error_occured_(false)
,audio_(false)
+ ,cur_frame_a(0)
{
// logIt("RECODER ID: %s", id_.c_str());
}
@@ -115,6 +116,8 @@
id_frame_in_file_ = cur_frame;
}
cur_frame++;
+ }else if (in_->isAudioPkt(&np)) {
+ cur = cur_frame_a++;
}
auto ret = out_->writeFrame(&np, cur);
diff --git a/csrc/buz/recorder.hpp b/csrc/buz/recorder.hpp
index 4b22af8..d05ebb8 100644
--- a/csrc/buz/recorder.hpp
+++ b/csrc/buz/recorder.hpp
@@ -58,7 +58,8 @@
int minduration;
int end_frame;
int cur_frame;
-
+ int cur_frame_a;
+
std::list<CPacket> list_pkt_;
std::atomic_bool stop_recorder_;
diff --git a/csrc/ffmpeg/format/FormatIn.cpp b/csrc/ffmpeg/format/FormatIn.cpp
index eeb9621..4399822 100644
--- a/csrc/ffmpeg/format/FormatIn.cpp
+++ b/csrc/ffmpeg/format/FormatIn.cpp
@@ -57,6 +57,7 @@
avcodec_close(dec_ctx_);
dec_ctx_ = NULL;
}
+
}
if (handle_gb28181){
delete handle_gb28181;
@@ -172,6 +173,10 @@
}
return true;
+ }
+
+ const bool FormatIn::IsHEVC()const{
+ return ctx_->streams[vs_idx_]->codecpar->codec_id == AV_CODEC_ID_HEVC;
}
bool FormatIn::openCodec(AVDictionary **options){
@@ -298,7 +303,9 @@
int FormatIn::readPacket(AVPacket *pkt_out){
- return av_read_frame(ctx_, pkt_out);
+ auto flag = av_read_frame(ctx_, pkt_out);
+
+ return flag;
}
int FormatIn::decode(AVFrame* frame, AVPacket *pkt){
diff --git a/csrc/ffmpeg/format/FormatIn.hpp b/csrc/ffmpeg/format/FormatIn.hpp
index 134be20..e904145 100644
--- a/csrc/ffmpeg/format/FormatIn.hpp
+++ b/csrc/ffmpeg/format/FormatIn.hpp
@@ -49,6 +49,7 @@
AVCodecContext *getCodecContext(int type = 0);
AVFormatContext *getFromatContext(){return ctx_;}
const double getFPS()const{return fps_;}
+ const bool IsHEVC()const;
private:
AVFormatContext *ctx_;
AVCodecContext *dec_ctx_;
diff --git a/csrc/ffmpeg/format/FormatOut.cpp b/csrc/ffmpeg/format/FormatOut.cpp
index 830e9ac..2994153 100644
--- a/csrc/ffmpeg/format/FormatOut.cpp
+++ b/csrc/ffmpeg/format/FormatOut.cpp
@@ -395,30 +395,6 @@
}
void FormatOut::adjustPTS(AVPacket *pkt, const int64_t &frame_cnt){
- if (pkt->stream_index >= ctx_->nb_streams){
- logIt("adjustPTS pkt stream index too much");
- return;
- }
-
- if (!in_a_stream_){
- int64_t time_stamp = frame_cnt;
-
- pkt->pos = -1;
- pkt->stream_index = 0;
- //Write PTS
- AVRational time_base = getStream()->time_base;
-
- AVRational time_base_q = { 1, AV_TIME_BASE };
- //Duration between 2 frames (us)
- // int64_t calc_duration = (double)(AV_TIME_BASE)*(1 / fps_); //鍐呴儴鏃堕棿鎴�
- int64_t calc_duration = (int64_t)(AV_TIME_BASE / fps_); //鍐呴儴鏃堕棿鎴�
- //Parameters
- pkt->pts = av_rescale_q(time_stamp*calc_duration, time_base_q, time_base);
- pkt->dts = pkt->pts;
- pkt->duration = av_rescale_q(calc_duration, time_base_q, time_base);
- return;
- }
-
AVStream *in_stream,*out_stream;
int out_idx = -1;
std::vector<AVStream*> in_streams{in_v_stream_, in_a_stream_};
@@ -436,24 +412,28 @@
}
}
if (out_idx == -1) return;
-
out_stream = ctx_->streams[out_idx];
pkt->stream_index = out_idx;
+
+ int64_t time_stamp = frame_cnt;
+
+ if (out_idx == v_idx_){
- // logIt("BEFORE in stream timebase %d:%d, out timebase %d:%d,
- // pts: %lld, dts: %lld, duration: %lld",
- // in_stream->time_base.num, in_stream->time_base.den,
- // out_stream->time_base.num, out_stream->time_base.den,
- // pkt->pts, pkt->dts, pkt->duration);
+ pkt->pos = -1;
+ AVRational time_base = ctx_->streams[out_idx]->time_base;
- //杞崲 PTS/DTS 鏃跺簭
- pkt->pts = av_rescale_q_rnd(pkt->pts,in_stream->time_base,out_stream->time_base,(enum AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
- pkt->dts = av_rescale_q_rnd(pkt->dts, in_stream->time_base, out_stream->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
- pkt->duration = av_rescale_q(pkt->duration, in_stream->time_base, out_stream->time_base);
- pkt->pos = -1;
+ AVRational time_base_q = { 1, AV_TIME_BASE };
+ int64_t calc_duration = (int64_t)(AV_TIME_BASE / fps_); //鍐呴儴鏃堕棿鎴�
+ pkt->pts = av_rescale_q(time_stamp*calc_duration, time_base_q, time_base);
+ pkt->dts = pkt->pts;
+ pkt->duration = av_rescale_q(calc_duration, time_base_q, time_base);
+
+ }else if (out_idx == a_idx_){
- // logIt("AFTER stream %d, pts: %lld, dts: %lld, duration: %lld",
- // pkt->stream_index, pkt->pts, pkt->dts, pkt->duration);
+ pkt->duration = 1024;
+ pkt->pts = pkt->dts = pkt->duration * time_stamp;
+
+ }
}
bool FormatOut::writeFrame(AVPacket *pkt, const int64_t &frame_cnt,
--
Gitblit v1.8.0