@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus ;
import org.springframework.http.ResponseEntity ;
import org.springframework.web.bind.annotation.* ;
import org.springframework.web.context.request.async.DeferredResult ;
/**
* 兼容LiveGBS的API: 实时直播
@@ -40,6 +41,10 @@ public class ApiStreamController {
@Autowired
private ZLMRESTfulUtils zlmresTfulUtils ;
@Autowired
private PlayController playController ;
/**
* 实时直播 - 开始直播
* @param serial 设备编号
@@ -54,124 +59,50 @@ public class ApiStreamController {
* @return
*/
@RequestMapping ( value = " /start " )
private JSONObject start ( String serial ,
@RequestParam ( required = false ) Integer channel ,
@RequestParam ( required = false ) String code ,
@RequestParam ( required = false ) String cdn ,
@RequestParam ( required = false ) String audio ,
@RequestParam ( required = false ) String transport ,
@RequestParam ( required = false ) String checkchannelstatus ,
@RequestParam ( required = false ) String transportmode ,
@RequestParam ( required = false ) String timeout
private DeferredResult < JSONObject> start ( String serial ,
@RequestParam ( required = false ) Integer channel ,
@RequestParam ( required = false ) String code ,
@RequestParam ( required = false ) String cdn ,
@RequestParam ( required = false ) String audio ,
@RequestParam ( required = false ) String transport ,
@RequestParam ( required = false ) String checkchannelstatus ,
@RequestParam ( required = false ) String transportmode ,
@RequestParam ( required = false ) String timeout
) {
int getEncoding = closeWaitRTPInfo ? 1 : 0 ;
DeferredResult < JSONObject > resultDeferredResult = new DeferredResult < JSONObject > ( ) ;
Device device = storager . queryVideoDevice ( serial ) ;
if ( device = = null ) {
JSONObject result = new JSONObject ( ) ;
result . put ( " error " , " device[ " + serial + " ]未找到 " ) ;
return result ;
resultDeferredResult . setResult ( result ) ;
} else if ( device . getOnline ( ) = = 0 ) {
JSONObject result = new JSONObject ( ) ;
result . put ( " error " , " device[ " + code + " ]offline " ) ;
return result ;
resultDeferredResult . setResult ( result ) ;
}
resultDeferredResult . onTimeout ( ( ) - > {
logger . info ( " 播放等待超时 " ) ;
JSONObject result = new JSONObject ( ) ;
result . put ( " error " , " timeout " ) ;
resultDeferredResult . setResult ( result ) ;
} ) ;
DeviceChannel deviceChannel = storager . queryChannel ( serial , code ) ;
if ( deviceChannel = = null ) {
JSONObject result = new JSONObject ( ) ;
result . put ( " error " , " channel[ " + code + " ]未找到 " ) ;
return result ;
resultDeferredResult . setResult ( result ) ;
} else if ( deviceChannel . getStatus ( ) = = 0 ) {
JSONObject result = new JSONObject ( ) ;
result . put ( " error " , " channel[ " + code + " ]offline " ) ;
return result ;
resultDeferredResult . setResult ( result ) ;
}
DeferredResult < ResponseEntity < String > > play = playController . play ( serial , code ) ;
// 查询是否已经在播放
StreamInfo streamInfo = storager . queryPlayByDevice ( device . getDeviceId ( ) , code ) ;
if ( streamInfo = = null ) {
logger . debug ( " streamInfo 等于null, 重新点播 " ) ;
// streamInfo = cmder.playStreamCmd(device, code);
} else {
logger . debug ( " streamInfo 不等于null, 向流媒体查询是否正在推流 " ) ;
String streamId = streamInfo . getStreamId ( ) ;
JSONObject rtpInfo = zlmresTfulUtils . getRtpInfo ( streamId ) ;
if ( rtpInfo . getBoolean ( " exist " ) ) {
logger . debug ( " 向流媒体查询正在推流, 直接返回: " + streamInfo . getRtsp ( ) ) ;
JSONObject result = new JSONObject ( ) ;
result . put ( " StreamID " , streamInfo . getStreamId ( ) ) ;
result . put ( " DeviceID " , device . getDeviceId ( ) ) ;
result . put ( " ChannelID " , code ) ;
result . put ( " ChannelName " , deviceChannel . getName ( ) ) ;
result . put ( " ChannelCustomName " , " " ) ;
result . put ( " FLV " , streamInfo . getFlv ( ) ) ;
result . put ( " WS_FLV " , streamInfo . getWs_flv ( ) ) ;
result . put ( " RTMP " , streamInfo . getRtmp ( ) ) ;
result . put ( " HLS " , streamInfo . getHls ( ) ) ;
result . put ( " RTSP " , streamInfo . getRtsp ( ) ) ;
result . put ( " CDN " , " " ) ;
result . put ( " SnapURL " , " " ) ;
result . put ( " Transport " , device . getTransport ( ) ) ;
result . put ( " StartAt " , " " ) ;
result . put ( " Duration " , " " ) ;
result . put ( " SourceVideoCodecName " , " " ) ;
result . put ( " SourceVideoWidth " , " " ) ;
result . put ( " SourceVideoHeight " , " " ) ;
result . put ( " SourceVideoFrameRate " , " " ) ;
result . put ( " SourceAudioCodecName " , " " ) ;
result . put ( " SourceAudioSampleRate " , " " ) ;
result . put ( " AudioEnable " , " " ) ;
result . put ( " Ondemand " , " " ) ;
result . put ( " InBytes " , " " ) ;
result . put ( " InBitRate " , " " ) ;
result . put ( " OutBytes " , " " ) ;
result . put ( " NumOutputs " , " " ) ;
result . put ( " CascadeSize " , " " ) ;
result . put ( " RelaySize " , " " ) ;
result . put ( " ChannelPTZType " , 0 ) ;
return result ;
} else {
logger . debug ( " 向流媒体查询没有推流, 重新点播 " ) ;
storager . stopPlay ( streamInfo ) ;
// streamInfo = cmder.playStreamCmd(device, code);
}
}
if ( logger . isDebugEnabled ( ) ) {
logger . debug ( String . format ( " 设备预览 API调用, deviceId: %s , channelId: %s " , serial , code ) ) ;
logger . debug ( " 设备预览 API调用, streamId: " + streamInfo . getStreamId ( ) ) ;
}
boolean lockFlag = true ;
long startTime = System . currentTimeMillis ( ) ;
while ( lockFlag ) {
try {
if ( System . currentTimeMillis ( ) - startTime > 10 * 1000 ) {
storager . stopPlay ( streamInfo ) ;
logger . info ( " 播放等待超时 " ) ;
JSONObject result = new JSONObject ( ) ;
result . put ( " error " , " timeout " ) ;
return result ;
} else {
StreamInfo streamInfoNow = storager . queryPlayByDevice ( serial , code ) ;
logger . debug ( " 正在向流媒体查询 " ) ;
if ( streamInfoNow ! = null & & streamInfoNow . getFlv ( ) ! = null ) {
streamInfo = streamInfoNow ;
logger . debug ( " 向流媒体查询到: " + streamInfoNow . getRtsp ( ) ) ;
lockFlag = false ;
continue ;
} else {
Thread . sleep ( 2000 ) ;
continue ;
}
}
} catch ( InterruptedException e ) {
e . printStackTrace ( ) ;
}
}
if ( streamInfo ! = null ) {
play . setResultHandler ( ( Object o ) - > {
ResponseEntity < String > responseEntity = ( ResponseEntity ) o ;
StreamInfo streamInfo = JSON . parseObject ( responseEntity . getBody ( ) , StreamInfo . class ) ;
JSONObject result = new JSONObject ( ) ;
result . put ( " StreamID " , streamInfo . getStreamId ( ) ) ;
result . put ( " DeviceID " , device . getDeviceId ( ) ) ;
@@ -203,13 +134,9 @@ public class ApiStreamController {
result . put ( " CascadeSize " , " " ) ;
result . put ( " RelaySize " , " " ) ;
result . put ( " ChannelPTZType " , 0 ) ;
return result ;
} else {
logger . warn ( " 设备预览API调用失败! " ) ;
JSONObject result = new JSONObject ( ) ;
result . put ( " error " , " 调用失败 " ) ;
return result ;
}
resultDeferredResult . setResult ( result ) ;
} ) ;
return resultDeferredResult ;
}
/**
@@ -228,6 +155,7 @@ public class ApiStreamController {
@RequestParam ( required = false ) String check_outputs
) {
StreamInfo streamInfo = storager . queryPlayByDevice ( serial , code ) ;
if ( streamInfo = = null ) {
JSONObject result = new JSONObject ( ) ;