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.cpp | 45 +++++++++++++++++++++++++-------------------- 1 files changed, 25 insertions(+), 20 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(){ -- Gitblit v1.8.0