From 529a90df418bd92d206dfeabfb2e1d01b454ad32 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 09 十月 2020 17:30:03 +0800
Subject: [PATCH] h264 mp4
---
csrc/ffmpeg/format/FormatOut.hpp | 2 +-
csrc/ffmpeg/format/FormatOut.cpp | 45 +++++++++++++++++++++++++--------------------
2 files changed, 26 insertions(+), 21 deletions(-)
diff --git a/csrc/ffmpeg/format/FormatOut.cpp b/csrc/ffmpeg/format/FormatOut.cpp
index b18c68c..d686d8e 100644
--- a/csrc/ffmpeg/format/FormatOut.cpp
+++ b/csrc/ffmpeg/format/FormatOut.cpp
@@ -467,7 +467,7 @@
bool interleaved/* = true*/){
adjustPTS(pkt, frame_cnt);
- auto ret = writeFrame2(pkt, interleaved);
+ auto ret = writeFrameInternal(pkt, interleaved);
if (!ret){
logIt("write to file failed, pkt.pts: %lld, dts: %lld, frame count: %d",
pkt->pts, pkt->dts, frame_cnt);
@@ -475,34 +475,39 @@
return ret;
}
- bool FormatOut::writeFrame2(AVPacket *pkt, bool interleaved){
-
+ static bool write_frame(AVFormatContext *ctx, AVPacket *pkt, bool interleaved){
+ int ret = 0;
+ if(interleaved){
+ ret = av_interleaved_write_frame(ctx, pkt);
+ }else{
+ // returns 1 if flushed and there is no more data to flush
+ ret = av_write_frame(ctx, pkt);
+ }
+
+ if(ret < -22 || ret == 0){
+ return true;
+ }
+
+ return false;
+ }
+
+ bool FormatOut::writeFrameInternal(AVPacket *pkt, bool interleaved){
+
// h264_mp4toanatax
if (bsf_h264){
if (av_bsf_send_packet(bsf_h264, pkt) < 0){
logIt("bsf_h264 send packet failed");
return true;
}
- if (av_bsf_receive_packet(bsf_h264, pkt) < 0){
- logIt("bsf_h264 recv packet failed");
- return true;
+ int ret;
+ while((ret = av_bsf_receive_packet(bsf_h264, pkt)) == 0){
+ if (!write_frame(ctx_, pkt, interleaved)) return false;
}
+
+ if (ret == AVERROR(EAGAIN)) return true;
}
- //
- int ret = 0;
- if(interleaved){
- ret = av_interleaved_write_frame(ctx_, pkt);
- }else{
- // returns 1 if flushed and there is no more data to flush
- ret = av_write_frame(ctx_, pkt);
- }
-
- if(ret < -22 || ret == 0){
- return true;
- }
-
- return false;
+ return write_frame(ctx_, pkt, interleaved);
}
bool FormatOut::writeTrailer(){
diff --git a/csrc/ffmpeg/format/FormatOut.hpp b/csrc/ffmpeg/format/FormatOut.hpp
index 62b5d02..86739bc 100644
--- a/csrc/ffmpeg/format/FormatOut.hpp
+++ b/csrc/ffmpeg/format/FormatOut.hpp
@@ -47,7 +47,7 @@
bool endWriter();
bool writeHeader(AVDictionary **options = NULL);
- bool writeFrame2(AVPacket *pkt, bool interleaved);
+ bool writeFrameInternal(AVPacket *pkt, bool interleaved);
bool writeTrailer();
public:
AVStream *getStream();
--
Gitblit v1.8.0