Merge remote-tracking branch 'origin/master' into zqsong

This commit is contained in:
xiongziliang 2019-08-02 13:51:34 +08:00
commit 36803ccedc
8 changed files with 24 additions and 13 deletions

View File

@ -63,7 +63,7 @@
| RTMP --> RTSP[S] | Y | N | Y | N | | RTMP --> RTSP[S] | Y | N | Y | N |
| RTSP[S] --> HLS | Y | Y | Y | N | | RTSP[S] --> HLS | Y | Y | Y | N |
| RTMP --> HLS | Y | N | 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 | | RTMP --> MP4 | Y | N | Y | N |
| MP4 --> RTSP[S] | Y | N | Y | N | | MP4 --> RTSP[S] | Y | N | Y | N |
| MP4 --> RTMP | Y | N | Y | N | | MP4 --> RTMP | Y | N | Y | N |
@ -73,9 +73,9 @@
| feature/codec | H264 | H265 | AAC | other | | feature/codec | H264 | H265 | AAC | other |
| :-----------: | :--: | :--: | :--: | :---: | | :-----------: | :--: | :--: | :--: | :---: |
| RTSP[S] push | Y | Y | Y | Y | | 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 push | Y | Y | Y | Y |
| RTMP proxy | Y | N | Y | N | | RTMP proxy | Y | Y | Y | Y |
- RTP transport: - RTP transport:

View File

@ -78,7 +78,7 @@
| RTMP --> RTSP[S] | Y | N | Y | N | | RTMP --> RTSP[S] | Y | N | Y | N |
| RTSP[S] --> HLS | Y | Y | Y | N | | RTSP[S] --> HLS | Y | Y | Y | N |
| RTMP --> HLS | Y | N | 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 | | RTMP --> MP4 | Y | N | Y | N |
| MP4 --> RTSP[S] | Y | N | Y | N | | MP4 --> RTSP[S] | Y | N | Y | N |
| MP4 --> RTMP | Y | N | Y | N | | MP4 --> RTMP | Y | N | Y | N |
@ -88,9 +88,9 @@
| 功能/编码格式 | H264 | H265 | AAC | other | | 功能/编码格式 | H264 | H265 | AAC | other |
| :------------------------------: | :--: | :--: | :--: | :---: | | :------------------------------: | :--: | :--: | :--: | :---: |
| RTSP[S]推流 | Y | Y | Y | Y | | RTSP[S]推流 | Y | Y | Y | Y |
| RTSP拉流代理 | Y | Y | Y | N | | RTSP拉流代理 | Y | Y | Y | Y |
| RTMP推流 | Y | Y | Y | Y | | RTMP推流 | Y | Y | Y | Y |
| RTMP拉流代理 | Y | N | Y | N | | RTMP拉流代理 | Y | Y | Y | Y |
- RTP传输方式: - RTP传输方式:

View File

@ -41,7 +41,7 @@ void MediaSink::addTrack(const Track::Ptr &track_in) {
if(!strongSelf){ if(!strongSelf){
return; return;
} }
if(strongSelf->_allTrackReady){ if(!strongSelf->_anyTrackUnReady){
strongSelf->onTrackFrame(frame); strongSelf->onTrackFrame(frame);
} }
})); }));
@ -53,6 +53,7 @@ void MediaSink::addTrack(const Track::Ptr &track_in) {
if(track->ready()){ if(track->ready()){
lam(); lam();
}else{ }else{
_anyTrackUnReady = true;
_allTrackReady = false; _allTrackReady = false;
_trackReadyCallback[codec_id] = lam; _trackReadyCallback[codec_id] = lam;
_ticker.resetTime(); _ticker.resetTime();
@ -79,7 +80,7 @@ void MediaSink::inputFrame(const Frame::Ptr &frame) {
if(!_allTrackReady && (_trackReadyCallback.empty() || _ticker.elapsedTime() > MAX_WAIT_MS)){ if(!_allTrackReady && (_trackReadyCallback.empty() || _ticker.elapsedTime() > MAX_WAIT_MS)){
_allTrackReady = true; _allTrackReady = true;
_anyTrackUnReady = false;
if(!_trackReadyCallback.empty()){ if(!_trackReadyCallback.empty()){
//这是超时强制忽略未准备好的Track //这是超时强制忽略未准备好的Track
_trackReadyCallback.clear(); _trackReadyCallback.clear();

View File

@ -99,6 +99,7 @@ private:
map<int,Track::Ptr> _track_map; map<int,Track::Ptr> _track_map;
map<int,function<void()> > _trackReadyCallback; map<int,function<void()> > _trackReadyCallback;
bool _allTrackReady = false; bool _allTrackReady = false;
bool _anyTrackUnReady = false;
Ticker _ticker; Ticker _ticker;
}; };

View File

@ -79,6 +79,16 @@ void MP4Muxer::onTrackFrame(const Frame::Ptr &frame) {
return; return;
} }
if(!_started){
//还没开始
if(frame->getTrackType() != TrackVideo || !frame->keyFrame()){
//如果首帧是音频或者是视频但是不是i帧那么不能开始写文件
return;
}
//开始写文件
_started = true;
}
int with_nalu_size ; int with_nalu_size ;
switch (frame->getCodecId()){ switch (frame->getCodecId()){
case CodecH264: case CodecH264:

View File

@ -80,6 +80,7 @@ private:
uint32_t start_pts = 0; uint32_t start_pts = 0;
}; };
map<CodecId,track_info> _codec_to_trackid; map<CodecId,track_info> _codec_to_trackid;
bool _started = false;
}; };

View File

@ -89,11 +89,9 @@ void Mp4Maker::createFile() {
try { try {
_muxer = std::make_shared<MP4MuxerFile>(strFileTmp.data()); _muxer = std::make_shared<MP4MuxerFile>(strFileTmp.data());
for(auto &track :_tracks){ for(auto &track :_tracks){
if(track){
//添加track //添加track
_muxer->addTrack(track); _muxer->addTrack(track);
} }
}
_strFileTmp = strFileTmp; _strFileTmp = strFileTmp;
_strFile = strFile; _strFile = strFile;
_createFileTicker.resetTime(); _createFileTicker.resetTime();

View File

@ -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 //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 //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时有效) //指定RTP over TCP(播放rtsp时有效)
(*player)[kRtpType] = Rtsp::RTP_TCP; (*player)[kRtpType] = Rtsp::RTP_TCP;
//开始播放,如果播放失败或者播放中止,将会自动重试若干次,重试次数在配置文件中配置,默认一直重试 //开始播放,如果播放失败或者播放中止,将会自动重试若干次,重试次数在配置文件中配置,默认一直重试