package com.ycl.api.YS.liveview.live;
|
|
import com.sun.jna.Memory;
|
import com.sun.jna.Native;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
import com.ycl.api.YS.NetDemo;
|
import com.ycl.api.YS.util.Common;
|
import com.ycl.api.YS.lib.NetDEVSDKLib;
|
import com.ycl.api.YS.lib.NetDEVSDKLib.NETDEV_LIVE_STREAM_INDEX_E;
|
import com.ycl.api.YS.lib.NetDEVSDKLib.NETDEV_VIDEO_CODE_TYPE_E;
|
|
import javax.swing.*;
|
import java.math.BigDecimal;
|
import java.util.Timer;
|
import java.util.TimerTask;
|
|
/**
|
* @introduction Live video
|
* @description Support IPC/NVR/VMS
|
*/
|
public class BasicLive {
|
|
/**
|
*
|
* @introduction Start live preview
|
* @description Start live preview and get the video parameters,update them once in three seconds
|
*
|
*/
|
public static void startLive() {
|
NetDemo.jPanelShowLiveParam.add(NetDemo.jButtonMic);
|
NetDemo.jPanelShowLiveParam.add(NetDemo.jSliderLiveMicSound);
|
NetDemo.jPanelShowLiveParam.add(NetDemo.jLabelLiveSound2);
|
NetDemo.jPanelShowLiveParam.add(NetDemo.jLableLiveMicSound);
|
|
if(null != NetDemo.lpPlayHandle) {
|
JOptionPane.showMessageDialog(null, "Please stop playing first.");
|
return;
|
}
|
if(null == NetDemo.lpUserID)
|
{
|
JOptionPane.showMessageDialog(null, "Please Login device first. error code"+NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
if(NetDemo.ChannelID == 0) {
|
JOptionPane.showMessageDialog(null, "Please select an online channel.");
|
return;
|
}
|
int dwStreamType=0;
|
switch (NetDemo.comboBoxConfigVideoStreamIndex.getItemAt(NetDemo.comboBoxConfigVideoStreamIndex.getSelectedIndex())) {
|
case "MAIN":
|
dwStreamType = NETDEV_LIVE_STREAM_INDEX_E.NETDEV_LIVE_STREAM_INDEX_MAIN;
|
break;
|
case "AUX":
|
dwStreamType = NETDEV_LIVE_STREAM_INDEX_E.NETDEV_LIVE_STREAM_INDEX_AUX;
|
break;
|
case "THIRD":
|
dwStreamType = NETDEV_LIVE_STREAM_INDEX_E.NETDEV_LIVE_STREAM_INDEX_THIRD;
|
break;
|
}
|
|
/* 创建实况预览参数并赋值 */
|
NetDEVSDKLib.NETDEV_PREVIEWINFO_S stPreviewInfo = new NetDEVSDKLib.NETDEV_PREVIEWINFO_S();
|
stPreviewInfo.dwChannelID = NetDemo.ChannelID;
|
stPreviewInfo.dwStreamType = dwStreamType;
|
stPreviewInfo.dwLinkMode = 1;
|
stPreviewInfo.hPlayWnd = Native.getComponentPointer(NetDemo.panelPlayLabel);
|
stPreviewInfo.dwFluency = 0;
|
stPreviewInfo.dwStreamMode = 0;
|
stPreviewInfo.dwLiveMode = 0;
|
stPreviewInfo.dwDisTributeCloud = 0;
|
stPreviewInfo.dwallowDistribution = 0;
|
|
/* 启动实时预览 */
|
NetDemo.lpPlayHandle = NetDemo.netdevsdk.NETDEV_RealPlay(NetDemo.lpUserID, stPreviewInfo, null, null);
|
if(null == NetDemo.lpPlayHandle) {
|
JOptionPane.showMessageDialog(null, "RealPlay failed,error code"+NetDemo.netdevsdk.NETDEV_GetLastError());
|
NetDemo.lpPlayHandle = null;
|
NetDemo.panelPlayLabel.repaint();
|
}else {
|
NetDemo.isTimer=true;
|
NetDemo.jButtonStartLive.setEnabled(false);
|
NetDemo.jButtonStopLive.setEnabled(true);
|
NetDemo.netdevsdk.NETDEV_SetMuteStatus(NetDemo.lpPlayHandle,1);
|
|
if(NetDemo.lpID2==null) {
|
NetDemo.netdevsdk.NETDEV_OpenSound(NetDemo.lpPlayHandle);
|
}
|
NetDemo.jSliderLiveSound.setValue(120);
|
|
Timer MyTimer=new Timer();
|
MyTimer.schedule(new TimerTask() {
|
@Override
|
public void run() {
|
if(!NetDemo.isTimer) {
|
return;
|
}
|
try{
|
/* 获取窗口码率 */
|
IntByReference pdwBitRate = new IntByReference();
|
boolean bRet = NetDemo.netdevsdk.NETDEV_GetBitRate(NetDemo.lpPlayHandle,pdwBitRate);
|
if(!bRet) {
|
System.out.printf("NETDEV_GetBitRate failed:%d\n", NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
NetDemo.jLabelBitRateParam.setText(String.valueOf(pdwBitRate.getValue()));
|
|
/* 获取窗口帧率 */
|
IntByReference pdwFrameRate = new IntByReference();
|
boolean bRet2 = NetDemo.netdevsdk.NETDEV_GetFrameRate(NetDemo.lpPlayHandle,pdwFrameRate);
|
if(!bRet2) {
|
System.out.printf("NETDEV_GetFrameRate failed:%d\n", NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
NetDemo.jLabelFrameRate.setText(String.valueOf(pdwFrameRate.getValue()));
|
|
/* 获取窗口编码格式 */
|
IntByReference pdwVideoEncFmt = new IntByReference();
|
boolean bRet3 = NetDemo.netdevsdk.NETDEV_GetVideoEncodeFmt(NetDemo.lpPlayHandle,pdwVideoEncFmt);
|
if(!bRet3)
|
{
|
System.out.printf("NETDEV_GetVideoEncodeFmt failed:%d\n", NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
String showEncodeFmt=null;
|
if(pdwVideoEncFmt.getValue()==NETDEV_VIDEO_CODE_TYPE_E.NETDEV_VIDEO_CODE_MJPEG){
|
showEncodeFmt="MJPEG";
|
}else if(pdwVideoEncFmt.getValue()==NETDEV_VIDEO_CODE_TYPE_E.NETDEV_VIDEO_CODE_H264) {
|
showEncodeFmt="H.264";
|
}else if(pdwVideoEncFmt.getValue()==NETDEV_VIDEO_CODE_TYPE_E.NETDEV_VIDEO_CODE_H265) {
|
showEncodeFmt="H.265";
|
}
|
NetDemo.jLabelVideoEncodeFmt.setText(showEncodeFmt);
|
|
/* 获取实况业务流类型 */
|
int dwNewStreamType=0;
|
switch (NetDemo.comboBoxConfigVideoStreamIndex.getItemAt(NetDemo.comboBoxConfigVideoStreamIndex.getSelectedIndex())) {
|
case "MAIN":
|
dwNewStreamType = NETDEV_LIVE_STREAM_INDEX_E.NETDEV_LIVE_STREAM_INDEX_MAIN;
|
break;
|
case "AUX":
|
dwNewStreamType = NETDEV_LIVE_STREAM_INDEX_E.NETDEV_LIVE_STREAM_INDEX_AUX;
|
break;
|
case "THIRD":
|
dwNewStreamType = NETDEV_LIVE_STREAM_INDEX_E.NETDEV_LIVE_STREAM_INDEX_THIRD;
|
break;
|
}
|
|
/* 获取实况码流URL */
|
Pointer pszStreamUrl=new Memory(300);
|
boolean bRet4=NetDemo.netdevsdk.NETDEV_GetStreamUrl(NetDemo.lpUserID,NetDemo.ChannelID, dwNewStreamType,pszStreamUrl);
|
if(!bRet4)
|
{
|
System.out.printf("NETDEV_GetStreamUrl failed:%d\n", NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
byte[] getStreamUrl=pszStreamUrl.getByteArray(0, 300);
|
NetDemo.jLabelLiveViewStreamUrl.setText( Common.byteArrayToString(getStreamUrl));
|
|
/* 获取视频分辨率 */
|
IntByReference pdwWidth = new IntByReference();
|
IntByReference pdwHeight = new IntByReference();
|
boolean bRet5 = NetDemo.netdevsdk.NETDEV_GetResolution(NetDemo.lpPlayHandle,pdwWidth,pdwHeight);
|
if(!bRet5)
|
{
|
System.out.printf("NETDEV_GetResolution failed:%d\n", NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
NetDemo.jLabelGetpdwWidth.setText(pdwWidth.getValue() +"x");
|
NetDemo.jLabelGetpdwHeight.setText(String.valueOf(pdwHeight.getValue()));
|
|
/* 获取窗口丢包率 */
|
IntByReference pURLReceivePacketNum = new IntByReference();
|
IntByReference pURLLostPktNum = new IntByReference();
|
boolean bRet6 = NetDemo.netdevsdk.NETDEV_GetLostPacketRate(NetDemo.lpPlayHandle,pURLReceivePacketNum,pURLLostPktNum);
|
if(!bRet6)
|
{
|
System.out.printf("NETDEV_GetLostPacketRate failed:%d\n", NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
double lostPacketRate=0.0;
|
if(pURLLostPktNum.getValue()==0) {
|
lostPacketRate=0.00;
|
}else {
|
BigDecimal receive=new BigDecimal(pURLReceivePacketNum.getValue());
|
BigDecimal lost=new BigDecimal(pURLLostPktNum.getValue());
|
BigDecimal sum=receive.add(lost);
|
try {
|
BigDecimal result=receive.divide(sum,2,BigDecimal.ROUND_HALF_UP);
|
lostPacketRate=result.doubleValue();
|
} catch (Exception e) {
|
return;
|
}
|
}
|
NetDemo.jLabelGetpulRecvPktNum.setText(String.valueOf(lostPacketRate));
|
|
/* 获取静音状态 */
|
IntByReference pbMute=new IntByReference();
|
boolean bRet7= NetDemo.netdevsdk.NETDEV_GetMuteStatus(NetDemo.lpPlayHandle, pbMute);
|
if(!bRet7) {
|
System.out.printf("NETDEV_GetMuteStatus failed:%d\n", NetDemo.netdevsdk.NETDEV_GetLastError());
|
return;
|
}
|
NetDemo.getMute=pbMute.getValue();
|
}catch(Exception e){
|
e.printStackTrace();
|
}
|
|
}
|
|
}, 1000, 3000);
|
|
}
|
}
|
|
/**
|
*
|
* @introduction stop live
|
* @description Stop live and clear text data
|
*
|
*/
|
public static void stopLive() {
|
if(null != NetDemo.lpPlayHandle){
|
NetDemo.netdevsdk.NETDEV_StopRealPlay(NetDemo.lpPlayHandle);
|
setComponents();
|
}
|
NetDemo.jButtonStartLive.setEnabled(true);
|
NetDemo.jButtonStopLive.setEnabled(false);
|
}
|
|
/**
|
*
|
* @introduction Set the label of video parameter null
|
* @description
|
*/
|
public static void setComponents() {
|
NetDemo.isTimer=false;
|
NetDemo.jLabelFrameRate.setText(null);
|
NetDemo.jLabelBitRateParam.setText(null);
|
NetDemo.jLabelVideoEncodeFmt.setText(null);
|
NetDemo.jLabelGetpdwWidth.setText(null);
|
NetDemo.jLabelGetpdwHeight.setText(null);
|
NetDemo.jLabelGetpulRecvPktNum.setText(null);
|
NetDemo.jLabelLiveViewStreamUrl.setText(null);
|
NetDemo.lpPlayHandle = null;
|
NetDemo.panelPlayLabel.repaint();
|
}
|
}
|