From 4d215a8e2bc0de5e4ab2c4c2bc3b52df6afc7408 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Thu, 1 Aug 2019 22:21:55 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_server.cpp b/tests/test_server.cpp index c34fd255..7aaac9f7 100644 --- a/tests/test_server.cpp +++ b/tests/test_server.cpp @@ -258,7 +258,7 @@ int main(int argc,char *argv[]) { //rtsp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4 //rtmp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4 - PlayerProxy::Ptr player(new PlayerProxy(DEFAULT_VHOST, "live", to_string(i).data(),false,false,false,true)); + PlayerProxy::Ptr player(new PlayerProxy(DEFAULT_VHOST, "live", to_string(i).data())); //指定RTP over TCP(播放rtsp时有效) (*player)[kRtpType] = Rtsp::RTP_TCP; //开始播放,如果播放失败或者播放中止,将会自动重试若干次,重试次数在配置文件中配置,默认一直重试 From d3d7fe1bd1bab81b2c9a4e69dfe1475e3b0e00e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E6=A5=9A?= <771730766@qq.com> Date: Thu, 1 Aug 2019 22:28:47 +0800 Subject: [PATCH 2/6] =?UTF-8?q?mp4=E5=BD=95=E5=88=B6=E6=94=AF=E6=8C=81H265?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bfe534f7..7622e9cc 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ | RTMP --> RTSP[S] | Y | N | Y | N | | RTSP[S] --> HLS | Y | Y | Y | N | | RTMP --> HLS | Y | N | Y | N | -| RTSP[S] --> MP4 | Y | N | Y | N | +| RTSP[S] --> MP4 | Y | Y | Y | N | | RTMP --> MP4 | Y | N | Y | N | | MP4 --> RTSP[S] | Y | N | Y | N | | MP4 --> RTMP | Y | N | Y | N | From 0980bde12d0e8813277d86c6f1c3a14b92df83fb Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Thu, 1 Aug 2019 22:32:04 +0800 Subject: [PATCH 3/6] =?UTF-8?q?mp4=E5=BD=95=E5=88=B6=E6=94=AF=E6=8C=81h265?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- README_CN.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7622e9cc..4e09398f 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,9 @@ | feature/codec | H264 | H265 | AAC | other | | :-----------: | :--: | :--: | :--: | :---: | | RTSP[S] push | Y | Y | Y | Y | -| RTSP proxy | Y | Y | Y | N | +| RTSP proxy | Y | Y | Y | Y | | RTMP push | Y | Y | Y | Y | -| RTMP proxy | Y | N | Y | N | +| RTMP proxy | Y | Y | Y | Y | - RTP transport: diff --git a/README_CN.md b/README_CN.md index bc277367..866c5b3f 100644 --- a/README_CN.md +++ b/README_CN.md @@ -78,7 +78,7 @@ | RTMP --> RTSP[S] | Y | N | Y | N | | RTSP[S] --> HLS | Y | Y | Y | N | | RTMP --> HLS | Y | N | Y | N | - | RTSP[S] --> MP4 | Y | N | Y | N | + | RTSP[S] --> MP4 | Y | Y | Y | N | | RTMP --> MP4 | Y | N | Y | N | | MP4 --> RTSP[S] | Y | N | Y | N | | MP4 --> RTMP | Y | N | Y | N | @@ -88,9 +88,9 @@ | 功能/编码格式 | H264 | H265 | AAC | other | | :------------------------------: | :--: | :--: | :--: | :---: | | RTSP[S]推流 | Y | Y | Y | Y | - | RTSP拉流代理 | Y | Y | Y | N | + | RTSP拉流代理 | Y | Y | Y | Y | | RTMP推流 | Y | Y | Y | Y | - | RTMP拉流代理 | Y | N | Y | N | + | RTMP拉流代理 | Y | Y | Y | Y | - RTP传输方式: From 35c324b6b4da464682992a4e59576f77d50b87ea Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 2 Aug 2019 10:53:00 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A6=96=E5=B8=A7?= =?UTF-8?q?=E4=B8=8D=E6=98=AFI=E5=B8=A7=20=E5=AF=BC=E8=87=B4=E8=8A=B1?= =?UTF-8?q?=E5=B1=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaFile/MP4Muxer.cpp | 8 ++++++++ src/MediaFile/MP4Muxer.h | 1 + src/MediaFile/Mp4Maker.cpp | 6 ++---- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/MediaFile/MP4Muxer.cpp b/src/MediaFile/MP4Muxer.cpp index afa78762..cedc7c4f 100644 --- a/src/MediaFile/MP4Muxer.cpp +++ b/src/MediaFile/MP4Muxer.cpp @@ -79,6 +79,14 @@ void MP4Muxer::onTrackFrame(const Frame::Ptr &frame) { return; } + if(frame->getTrackType() == TrackVideo){ + if(!_started && !frame->keyFrame()){ + //第一帧必须是I帧,防止花屏 + return; + } + _started = true; + } + int with_nalu_size ; switch (frame->getCodecId()){ case CodecH264: diff --git a/src/MediaFile/MP4Muxer.h b/src/MediaFile/MP4Muxer.h index a458b4ca..5b8d2f27 100644 --- a/src/MediaFile/MP4Muxer.h +++ b/src/MediaFile/MP4Muxer.h @@ -80,6 +80,7 @@ private: uint32_t start_pts = 0; }; map _codec_to_trackid; + bool _started = false; }; diff --git a/src/MediaFile/Mp4Maker.cpp b/src/MediaFile/Mp4Maker.cpp index a4ec0d89..3cf2a7ec 100644 --- a/src/MediaFile/Mp4Maker.cpp +++ b/src/MediaFile/Mp4Maker.cpp @@ -89,10 +89,8 @@ void Mp4Maker::createFile() { try { _muxer = std::make_shared(strFileTmp.data()); for(auto &track :_tracks){ - if(track){ - //添加track - _muxer->addTrack(track); - } + //添加track + _muxer->addTrack(track); } _strFileTmp = strFileTmp; _strFile = strFile; From a400b39fab17cf70b740c5dc1f857208d286e719 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 2 Aug 2019 11:09:17 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E4=B8=A2=E5=B8=A7=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/MediaSink.cpp | 5 +++-- src/Common/MediaSink.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index a83fc855..4d45f82e 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -41,7 +41,7 @@ void MediaSink::addTrack(const Track::Ptr &track_in) { if(!strongSelf){ return; } - if(strongSelf->_allTrackReady){ + if(!strongSelf->_anyTrackUnReady){ strongSelf->onTrackFrame(frame); } })); @@ -53,6 +53,7 @@ void MediaSink::addTrack(const Track::Ptr &track_in) { if(track->ready()){ lam(); }else{ + _anyTrackUnReady = true; _allTrackReady = false; _trackReadyCallback[codec_id] = lam; _ticker.resetTime(); @@ -79,7 +80,7 @@ void MediaSink::inputFrame(const Frame::Ptr &frame) { if(!_allTrackReady && (_trackReadyCallback.empty() || _ticker.elapsedTime() > MAX_WAIT_MS)){ _allTrackReady = true; - + _anyTrackUnReady = false; if(!_trackReadyCallback.empty()){ //这是超时强制忽略未准备好的Track _trackReadyCallback.clear(); diff --git a/src/Common/MediaSink.h b/src/Common/MediaSink.h index 7dc9fff0..a45b9638 100644 --- a/src/Common/MediaSink.h +++ b/src/Common/MediaSink.h @@ -99,6 +99,7 @@ private: map _track_map; map > _trackReadyCallback; bool _allTrackReady = false; + bool _anyTrackUnReady = false; Ticker _ticker; }; From 892734bfd83aaef726b6d772c9e97a217a87e698 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 2 Aug 2019 11:54:05 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MediaFile/MP4Muxer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/MediaFile/MP4Muxer.cpp b/src/MediaFile/MP4Muxer.cpp index cedc7c4f..076cc86c 100644 --- a/src/MediaFile/MP4Muxer.cpp +++ b/src/MediaFile/MP4Muxer.cpp @@ -79,11 +79,13 @@ void MP4Muxer::onTrackFrame(const Frame::Ptr &frame) { return; } - if(frame->getTrackType() == TrackVideo){ - if(!_started && !frame->keyFrame()){ - //第一帧必须是I帧,防止花屏 + if(!_started){ + //还没开始 + if(frame->getTrackType() != TrackVideo || !frame->keyFrame()){ + //如果首帧是音频或者是视频但是不是i帧,那么不能开始写文件 return; } + //开始写文件 _started = true; }