Former-commit-id: b002e6295855f0b8b0ce11bbf3bb84f7d86f48ee
TangShanKaiPing
wanggang 6 years ago
parent a8d40bbf7c
commit 623f3babaa

@ -177,20 +177,34 @@ namespace IoTNode.DeviceServices.Onvif
{
if (ipCamera.Profiles.Count > 0)
{
var tokens = ipCamera.Profiles.Select(o => $"{o.Token}:{o.Width}x{o.Height}").ToList();
this.UpdateData(deviceRepo, device, device.CreateData("Profiles", string.Join(',', tokens), DeviceDataType.String, "Profiles"));
var token = device.Data.FirstOrDefault(o => o.Key == "ProfileToken")?.Value;
if (string.IsNullOrEmpty(token))
{
token = ipCamera.Profiles.Last().Token;
}
else
{
if (!ipCamera.Profiles.Any(o => o.Token == token))
{
token = ipCamera.Profiles.Last().Token;
}
}
if (needAuth)
{
ipCamera.StreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
ipCamera.SnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
ipCamera.StreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, token);
ipCamera.SnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, token);
}
else
{
ipCamera.StreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.First().Token);
ipCamera.SnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.First().Token);
ipCamera.StreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, token);
ipCamera.SnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, token);
}
ipCamera.ParseStreamUri();
ipCamera.ParseSnapshotUri();
this.UpdateData(deviceRepo, device, device.CreateData("Token", ipCamera.Profiles.First().Token, DeviceDataType.String, "Token"));
this.UpdateData(deviceRepo, device, device.CreateData("ProfileToken", token, DeviceDataType.String, "ProfileToken"));
this.UpdateData(deviceRepo, device, device.CreateData("StreamUri", ipCamera.StreamUri, DeviceDataType.String, "流地址"));
this.UpdateData(deviceRepo, device, device.CreateData("SnapshotUri", ipCamera.SnapshotUri, DeviceDataType.String, "截图地址"));
}

@ -37,10 +37,10 @@ namespace IoTNode
services.AddHostedService(o => o.GetService<IoTNodeClient>());
services.AddSingleton<OnvifService>();
services.AddHostedService(o => o.GetService<OnvifService>());
services.AddSingleton<FBeeService>();
services.AddHostedService(o => o.GetService<FBeeService>());
services.AddSingleton<SerialPortService>();
services.AddHostedService(o => o.GetService<SerialPortService>());
//services.AddSingleton<FBeeService>();
//services.AddHostedService(o => o.GetService<FBeeService>());
//services.AddSingleton<SerialPortService>();
//services.AddHostedService(o => o.GetService<SerialPortService>());
base.ConfigureServices(services);
}

@ -30,6 +30,15 @@
var number = values[1];
<a class="api ajax" href="@Url.Action("X95","Gateway",new { gateway = gateway,number=number})" data-number="@item.Number">从网关移除</a>
}
else if (item.Product.Name == "摄像头")
{
<a class="api ajax" href="@Url.Action("StartPush","Onvif",new {number=item.Number})" data-number="@item.Number">开始推流</a>
<a class="api ajax" href="@Url.Action("StopPush","Onvif",new {number=item.Number})" data-number="@item.Number">停止推流</a>
}
else if (item.Product.Number.Contains("gateway"))
{
<a class="api ajax" href="@Url.Action("X95","Gateway",new { number=item.Number})" data-number="@item.Number">查询网关设备</a>
}
</td>
</tr>
}
@ -38,7 +47,7 @@
@section scripts{
<script>
$('a.ajax.api').click(function () {
if (confirm('确认从网关移除编号为:' + $(this).attr('data-number') + '的设备吗?')) {
if (confirm('确认操作编号为:' + $(this).attr('data-number') + '的设备吗?')) {
$.get($(this).attr('href'), function () {
window.location.href = window.location.href;
});

@ -0,0 +1,221 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=0.5" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
html,
body {
width: 100%;
height: 100%;
font-size: 14px;
}
#wrapper {
width: 1024px;
height: 500px;
position: absolute;
top: 50px;
left: 50%;
margin-left: -400px;
}
</style>
</head>
<body>
<div id="wrapper">
<div style="margin-bottom: 10px">
<input type="text"
id="iUrl"
value="http://localhost/live/b57e867ae29d11b483864cbd8fd0f747.flv"
style="width:786px;height:10px;margin:0;padding:5px;margin-bottom:5px;display:block" />
<input type="number" id="iChunkSize" value="128" />
chunkSize&nbsp;&nbsp;&nbsp;
<input type="number" id="iBuffer" value="500" />
bufferingTime&nbsp;&nbsp;&nbsp;
<input type="number" id="iPreload" value="500" />
preloadTime&nbsp;&nbsp;&nbsp;
<div style="margin-right:1000px;margin-bottom:5px;"></div>
<input type="checkbox" id="iH265" /> isH265
<input type="checkbox" id="iIsLive" checked /> isLive
<input type="checkbox" id="iHasAudio" checked /> hasAudio
<input type="checkbox" id="iHasVideo" checked /> hasVideo
<input type="checkbox" id="iLoop" checked /> loop
<input type="checkbox" id="iAutoPlay" checked /> autoplay
</div>
<canvas id="canvas"
width="1080"
height="720"
style="background: black;"></canvas>
<div style="margin-bottom: 10px">
<span id="status">状态:等待播放</span>
<span id="duration" style="display: inline-block;margin-left:40px;">
可播放时长: 0s
</span>
<span id="time" style="display:inline-block;margin-left:40px;">
进度0s
</span>
<span id="performance" style="display:inline-block;margin-left:40px;">
解码平均0ms, 单元平均0ms 
</span>
</div>
<button id="playBtn">播放</button>
<button id="stopBtn">停止</button>
<button id="pauseBtn">暂停</button>
<button id="resumeBtn">恢复</button>
<button id="muteBtn">静音切换</button>
<input type="number"
name="volume"
step="0.1"
max="1.0"
min="0.0"
value="1.0"
style="width: 100px;" />
<span>音量设置</span>
</div>
<script src="./index.js"></script>
<script>
const $status = document.getElementById('status');
const $time = document.getElementById('time');
const $duration = document.getElementById('duration');
const $performance = document.getElementById('performance');
document.getElementById('iH265').addEventListener('change', (ev) => {
const checked = ev.target.checked;
if (checked) {
document.getElementById('iUrl').value = 'https://static.petera.cn/h265.flv';
} else {
document.getElementById('iUrl').value = 'https://static.petera.cn/music.flv';
}
});
if (WXInlinePlayer.isSupport()) {
const $canvas = document.getElementById('canvas');
let player = null;
document.getElementById('playBtn').addEventListener('click', () => {
var isH265 = document.getElementById('iH265').checked;
WXInlinePlayer.init({
asmUrl: './prod.' + (isH265 ? 'h265' : 'all') + '.asm.combine.js',
wasmUrl: './prod.' + (isH265 ? 'h265' : 'all') + '.wasm.combine.js'
});
WXInlinePlayer.ready().then(() => {
if (!player) {
player = new WXInlinePlayer({
url: document.getElementById('iUrl').value,
$container: $canvas,
hasVideo: document.getElementById('iHasVideo').checked,
hasAudio: document.getElementById('iHasAudio').checked,
volume: 1.0,
muted: false,
autoplay: document.getElementById('iAutoPlay').checked,
loop: document.getElementById('iLoop').checked,
isLive: document.getElementById('iIsLive').checked,
chunkSize:
parseInt(document.getElementById('iChunkSize').value) * 1024,
preloadTime: parseInt(
document.getElementById('iPreload').value
),
bufferingTime: parseInt(
document.getElementById('iBuffer').value
),
cacheSegmentCount: 64,
customLoader: null
});
player.on('loadError', e => {
console.log('>>>>> load error happend: ', e);
});
player.on('loadSuccess', () => {
console.log('>>>>> load success');
});
player.on('mediaInfo', mediaInfo => {
const { onMetaData } = mediaInfo;
$canvas.height = onMetaData.height || 720;
$canvas.width = onMetaData.width || 1080;
for (let i = 0; i < onMetaData.length; i++) {
if ('height' in onMetaData[i]) {
$canvas.height = onMetaData[i].height;
} else if ('width' in onMetaData[i]) {
$canvas.width = onMetaData[i].width;
}
}
$canvas.style.marginLeft = (800 - $canvas.width) / 2 + 'px';
});
player.on('buffering', () => {
$status.innerHTML = '状态: 等待加载';
});
player.on('playing', () => {
$status.innerHTML = '状态: 正在播放';
});
player.on('stopped', () => {
$status.innerHTML = '状态:已停止';
});
player.on('end', () => {
$status.innerHTML = '状态:播放结束';
});
player.on('timeUpdate', timestamp => {
$time.innerHTML = '进度:' + Math.floor(timestamp / 1000) + 's';
$duration.innerHTML =
'可播放时长: ' +
Math.ceil(player.getAvaiableDuration() / 1000) +
's';
});
player.on(
'performance',
({ averageDecodeCost, averageUnitDuration }) => {
$performance.innerHTML =
'解码平均:' +
Math.floor(averageDecodeCost) +
'ms, 单元平均:' +
Math.floor(averageUnitDuration) +
'ms';
}
);
}
player.play();
});
$canvas.onclick = () => {
$canvas.requestFullscreen();
};
document.getElementById('stopBtn').addEventListener('click', () => {
player.stop();
player = null;
});
document.getElementById('pauseBtn').addEventListener('click', () => {
player.pause();
});
document.getElementById('resumeBtn').addEventListener('click', () => {
player.resume();
});
document.getElementById('muteBtn').addEventListener('click', () => {
player.mute(!player.mute());
});
document
.querySelector('input[name=volume]')
.addEventListener('change', ev => {
player.volume(ev.target.value);
});
});
}
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save