Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
myc42351781
SimpleVideoServer
提交
201a3227
S
SimpleVideoServer
项目概览
myc42351781
/
SimpleVideoServer
与 Fork 源项目一致
Fork自
云逸之 / SimpleVideoServer
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SimpleVideoServer
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
201a3227
编写于
8月 06, 2022
作者:
云逸之
💬
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改udp发送帧大小,使用单帧ip报文发送单帧图片
上级
20265605
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
350 addition
and
39 deletion
+350
-39
simpleVideoRecorder/src/main.cpp
simpleVideoRecorder/src/main.cpp
+7
-22
src/org/btik/server/VideoServer.java
src/org/btik/server/VideoServer.java
+1
-1
src/org/btik/server/video/Main.java
src/org/btik/server/video/Main.java
+2
-0
src/org/btik/server/video/UDP2Main.java
src/org/btik/server/video/UDP2Main.java
+59
-0
src/org/btik/server/video/UDPMain.java
src/org/btik/server/video/UDPMain.java
+2
-0
src/org/btik/server/video/device/iface/DevChannel.java
src/org/btik/server/video/device/iface/DevChannel.java
+1
-1
src/org/btik/server/video/device/iface/HttpConstant.java
src/org/btik/server/video/device/iface/HttpConstant.java
+1
-1
src/org/btik/server/video/device/iface/VideoChannel.java
src/org/btik/server/video/device/iface/VideoChannel.java
+1
-1
src/org/btik/server/video/device/task/AsyncTaskExecutor.java
src/org/btik/server/video/device/task/AsyncTaskExecutor.java
+1
-1
src/org/btik/server/video/device/tcp/BioDeviceChannel.java
src/org/btik/server/video/device/tcp/BioDeviceChannel.java
+3
-3
src/org/btik/server/video/device/tcp/FrameBuffer.java
src/org/btik/server/video/device/tcp/FrameBuffer.java
+1
-1
src/org/btik/server/video/device/tcp/FrameReceiver.java
src/org/btik/server/video/device/tcp/FrameReceiver.java
+1
-2
src/org/btik/server/video/device/udp/UDPDeviceChannel.java
src/org/btik/server/video/device/udp/UDPDeviceChannel.java
+3
-3
src/org/btik/server/video/device/udp2/BufferPool.java
src/org/btik/server/video/device/udp2/BufferPool.java
+51
-0
src/org/btik/server/video/device/udp2/FrameBuffer.java
src/org/btik/server/video/device/udp2/FrameBuffer.java
+14
-0
src/org/btik/server/video/device/udp2/NewUDPDeviceChannel.java
...rg/btik/server/video/device/udp2/NewUDPDeviceChannel.java
+193
-0
src/org/btik/server/video/device/web/BioHttpVideoServer.java
src/org/btik/server/video/device/web/BioHttpVideoServer.java
+5
-2
src/org/btik/server/video/device/web/MJPEGVideoChannel.java
src/org/btik/server/video/device/web/MJPEGVideoChannel.java
+4
-1
未找到文件。
simpleVideoRecorder/src/main.cpp
浏览文件 @
201a3227
...
@@ -2,15 +2,16 @@
...
@@ -2,15 +2,16 @@
#include <WiFi.h>
#include <WiFi.h>
#include "esp_camera.h"
#include "esp_camera.h"
#define CAMERA_MODEL_AI_THINKER
#define CAMERA_MODEL_AI_THINKER
#include "UdpClient.hpp"
#include "ai_thinker_esp32_cam_meta.h"
#include "ai_thinker_esp32_cam_meta.h"
char
*
ssid
=
"test0"
;
c
onst
c
har
*
ssid
=
"test0"
;
const
char
*
passwd
=
"12345687"
;
const
char
*
passwd
=
"12345687"
;
const
char
*
host
=
"192.168.137.1"
;
const
char
*
host
=
"192.168.137.1"
;
const
uint16_t
serverUdpPort
=
8004
;
const
uint16_t
serverUdpPort
=
8004
;
const
uint16_t
localUdpPort
=
2333
;
const
uint16_t
localUdpPort
=
2333
;
WiFi
UDP
streamSender
;
Light
UDP
streamSender
;
void
connectWifi
(
const
char
*
ssid
,
const
char
*
passphrase
)
{
void
connectWifi
(
const
char
*
ssid
,
const
char
*
passphrase
)
{
WiFi
.
mode
(
WIFI_STA
);
WiFi
.
mode
(
WIFI_STA
);
...
@@ -75,28 +76,18 @@ void setup() {
...
@@ -75,28 +76,18 @@ void setup() {
Serial
.
println
(
"get sensor "
);
Serial
.
println
(
"get sensor "
);
sensor_t
*
s
=
esp_camera_sensor_get
();
sensor_t
*
s
=
esp_camera_sensor_get
();
// drop down frame size for higher initial frame rate
// drop down frame size for higher initial frame rate
s
->
set_framesize
(
s
,
FRAMESIZE_VGA
);
s
->
set_framesize
(
s
,
FRAMESIZE_
S
VGA
);
connectWifi
(
ssid
,
passwd
);
connectWifi
(
ssid
,
passwd
);
Serial
.
println
(
"connect stream channel"
);
streamSender
.
begin
(
WiFi
.
localIP
(),
localUdpPort
);
streamSender
.
begin
(
WiFi
.
localIP
(),
localUdpPort
);
streamSender
.
setServer
(
host
,
serverUdpPort
);
// 发送mac地址作为设备序列号,用于摄像头频道号
uint8_t
mac
[
6
];
WiFi
.
macAddress
(
mac
);
char
macStr
[
12
]
=
{
0
};
sprintf
(
macStr
,
"%02X%02X%02X%02X%02X%02X"
,
mac
[
0
],
mac
[
1
],
mac
[
2
],
mac
[
3
],
mac
[
4
],
mac
[
5
]);
Serial
.
println
(
"sprint mac "
);
streamSender
.
beginPacket
(
host
,
serverUdpPort
);
streamSender
.
print
(
String
(
macStr
));
streamSender
.
endPacket
();
}
}
void
loop
()
{
void
loop
()
{
camera_fb_t
*
fb
=
NULL
;
camera_fb_t
*
fb
=
NULL
;
size_t
len
=
0
;
size_t
len
=
0
;
Serial
.
println
(
"do loop"
);
Serial
.
println
(
"do loop"
);
while
(
true
)
{
while
(
true
)
{
fb
=
esp_camera_fb_get
();
fb
=
esp_camera_fb_get
();
if
(
!
fb
)
{
if
(
!
fb
)
{
...
@@ -104,13 +95,7 @@ void loop() {
...
@@ -104,13 +95,7 @@ void loop() {
return
;
return
;
}
}
len
=
fb
->
len
;
len
=
fb
->
len
;
streamSender
.
beginPacket
(
host
,
serverUdpPort
);
streamSender
.
send
(
fb
->
buf
,
len
);
streamSender
.
write
(
fb
->
buf
,
len
);
streamSender
.
endPacket
();
// 这个库会自动将大于MTU的帧拆成多帧,而不是利用自动ip分片,
// 导致服务器端需要合并帧,此处发送空包标识结束
streamSender
.
beginPacket
(
host
,
serverUdpPort
);
streamSender
.
endPacket
();
esp_camera_fb_return
(
fb
);
esp_camera_fb_return
(
fb
);
}
}
}
}
\ No newline at end of file
src/org/btik/server/VideoServer.java
浏览文件 @
201a3227
package
org.btik.server
;
package
org.btik.server
;
import
org.btik.server.video.VideoChannel
;
import
org.btik.server.video.
device.iface.
VideoChannel
;
/**
/**
* 视频服务
* 视频服务
...
...
src/org/btik/server/video/Main.java
浏览文件 @
201a3227
package
org.btik.server.video
;
package
org.btik.server.video
;
import
org.btik.server.video.device.task.AsyncTaskExecutor
;
import
org.btik.server.video.device.tcp.BioDeviceChannel
;
import
org.btik.server.video.device.tcp.BioDeviceChannel
;
import
org.btik.server.video.device.web.BioHttpVideoServer
;
import
java.io.FileInputStream
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.io.IOException
;
...
...
src/org/btik/server/video/UDP2Main.java
0 → 100644
浏览文件 @
201a3227
package
org.btik.server.video
;
import
org.btik.server.video.device.task.AsyncTaskExecutor
;
import
org.btik.server.video.device.udp2.BufferPool
;
import
org.btik.server.video.device.udp2.NewUDPDeviceChannel
;
import
org.btik.server.video.device.web.BioHttpVideoServer
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.util.Properties
;
public
class
UDP2Main
{
static
Properties
properties
;
static
{
properties
=
new
Properties
();
try
{
properties
.
load
(
new
FileInputStream
(
"light-video.properties"
));
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
e
);
}
}
/**
* 读取配置信息
*
* @param key 配置key
* @param def 获取为空时的默认值
*/
private
static
int
getIntProp
(
String
key
,
int
def
)
{
Object
o
=
properties
.
get
(
key
);
if
(
o
==
null
)
{
return
def
;
}
return
Integer
.
parseInt
(
o
.
toString
());
}
public
static
void
main
(
String
[]
args
)
{
AsyncTaskExecutor
asyncTaskExecutor
=
new
AsyncTaskExecutor
();
asyncTaskExecutor
.
start
();
BioHttpVideoServer
bioHttpVideoServer
=
new
BioHttpVideoServer
();
bioHttpVideoServer
.
setHttpPort
(
getIntProp
(
"http.port"
,
8003
));
bioHttpVideoServer
.
setAsyncTaskExecutor
(
asyncTaskExecutor
);
BufferPool
bufferPool
=
new
BufferPool
();
bufferPool
.
setBufferPoolSize
(
getIntProp
(
"udp.video.buffer.pool.size"
,
500
));
NewUDPDeviceChannel
deviceChannel
=
new
NewUDPDeviceChannel
();
deviceChannel
.
setVideoServer
(
bioHttpVideoServer
);
deviceChannel
.
setBufferPool
(
bufferPool
);
deviceChannel
.
setStreamPort
(
getIntProp
(
"stream.port"
,
8004
));
deviceChannel
.
setDispatcherPoolSize
(
getIntProp
(
"udp.video.dispatcher.thread.size"
,
8
));
deviceChannel
.
start
();
bioHttpVideoServer
.
setDevChannel
(
deviceChannel
);
bioHttpVideoServer
.
start
();
}
}
src/org/btik/server/video/UDPMain.java
浏览文件 @
201a3227
package
org.btik.server.video
;
package
org.btik.server.video
;
import
org.btik.server.video.device.task.AsyncTaskExecutor
;
import
org.btik.server.video.device.udp.BufferPool
;
import
org.btik.server.video.device.udp.BufferPool
;
import
org.btik.server.video.device.udp.UDPDeviceChannel
;
import
org.btik.server.video.device.udp.UDPDeviceChannel
;
import
org.btik.server.video.device.web.BioHttpVideoServer
;
import
java.io.FileInputStream
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.io.IOException
;
...
...
src/org/btik/server/DevChannel.java
→
src/org/btik/server/
video/device/iface/
DevChannel.java
浏览文件 @
201a3227
package
org.btik.server
;
package
org.btik.server
.video.device.iface
;
/**
/**
* 设备通道
* 设备通道
...
...
src/org/btik/server/video/HttpConstant.java
→
src/org/btik/server/video/
device/iface/
HttpConstant.java
浏览文件 @
201a3227
package
org.btik.server.video
;
package
org.btik.server.video
.device.iface
;
import
java.nio.charset.StandardCharsets
;
import
java.nio.charset.StandardCharsets
;
...
...
src/org/btik/server/video/VideoChannel.java
→
src/org/btik/server/video/
device/iface/
VideoChannel.java
浏览文件 @
201a3227
package
org.btik.server.video
;
package
org.btik.server.video
.device.iface
;
public
interface
VideoChannel
{
public
interface
VideoChannel
{
/**
/**
...
...
src/org/btik/server/video/AsyncTaskExecutor.java
→
src/org/btik/server/video/
device/task/
AsyncTaskExecutor.java
浏览文件 @
201a3227
package
org.btik.server.video
;
package
org.btik.server.video
.device.task
;
import
java.util.concurrent.LinkedBlockingQueue
;
import
java.util.concurrent.LinkedBlockingQueue
;
...
...
src/org/btik/server/video/device/tcp/BioDeviceChannel.java
浏览文件 @
201a3227
package
org.btik.server.video.device.tcp
;
package
org.btik.server.video.device.tcp
;
import
org.btik.server.DevChannel
;
import
org.btik.server.
video.device.iface.
DevChannel
;
import
org.btik.server.VideoServer
;
import
org.btik.server.VideoServer
;
import
org.btik.server.video.AsyncTaskExecutor
;
import
org.btik.server.video.
device.task.
AsyncTaskExecutor
;
import
org.btik.server.video.VideoChannel
;
import
org.btik.server.video.
device.iface.
VideoChannel
;
import
java.io.IOException
;
import
java.io.IOException
;
...
...
src/org/btik/server/video/device/tcp/FrameBuffer.java
浏览文件 @
201a3227
package
org.btik.server.video.device.tcp
;
package
org.btik.server.video.device.tcp
;
import
org.btik.server.video.VideoChannel
;
import
org.btik.server.video.
device.iface.
VideoChannel
;
import
java.io.ByteArrayOutputStream
;
import
java.io.ByteArrayOutputStream
;
...
...
src/org/btik/server/video/device/tcp/FrameReceiver.java
浏览文件 @
201a3227
package
org.btik.server.video.device.tcp
;
package
org.btik.server.video.device.tcp
;
import
org.btik.server.video.VideoChannel
;
import
org.btik.server.video.device.iface.VideoChannel
;
import
org.btik.server.video.device.tcp.FrameBuffer
;
import
java.io.IOException
;
import
java.io.IOException
;
...
...
src/org/btik/server/video/device/udp/UDPDeviceChannel.java
浏览文件 @
201a3227
package
org.btik.server.video.device.udp
;
package
org.btik.server.video.device.udp
;
import
org.btik.server.DevChannel
;
import
org.btik.server.
video.device.iface.
DevChannel
;
import
org.btik.server.VideoServer
;
import
org.btik.server.VideoServer
;
import
org.btik.server.util.ByteUtil
;
import
org.btik.server.util.ByteUtil
;
import
org.btik.server.util.NamePrefixThreadFactory
;
import
org.btik.server.util.NamePrefixThreadFactory
;
import
org.btik.server.video.AsyncTaskExecutor
;
import
org.btik.server.video.
device.task.
AsyncTaskExecutor
;
import
org.btik.server.video.VideoChannel
;
import
org.btik.server.video.
device.iface.
VideoChannel
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.net.DatagramPacket
;
import
java.net.DatagramPacket
;
...
...
src/org/btik/server/video/device/udp2/BufferPool.java
0 → 100644
浏览文件 @
201a3227
package
org.btik.server.video.device.udp2
;
import
java.util.concurrent.ConcurrentLinkedQueue
;
public
class
BufferPool
{
/**
* 接收图片缓冲区大小,<br>
* 与TCP不同的是,若图片大于当前帧大小,会截断则无法得到完整图片,默认40KB
*/
private
static
final
int
RECEIVE_BUFFER_SIZE
=
64512
;
/**
* 帧缓冲池,避免反复new帧缓冲区
*/
private
final
ConcurrentLinkedQueue
<
FrameBuffer
>
frameBufferPool
=
new
ConcurrentLinkedQueue
<>();
/**
* 初始缓存区池大小,本身会自动扩容,随着设备增多可以设置合理值
*/
private
int
bufferPoolSize
=
500
;
public
void
setBufferPoolSize
(
int
bufferPoolSize
)
{
this
.
bufferPoolSize
=
bufferPoolSize
;
}
private
void
init
()
{
for
(
int
i
=
0
;
i
<
bufferPoolSize
;
i
++)
{
frameBufferPool
.
add
(
new
FrameBuffer
(
new
byte
[
RECEIVE_BUFFER_SIZE
]));
}
}
public
FrameBuffer
getFrameBuffer
()
{
FrameBuffer
buffer
=
frameBufferPool
.
poll
();
if
(
buffer
==
null
)
{
System
.
out
.
println
(
"mem up"
);
// 自动扩容
buffer
=
new
FrameBuffer
(
new
byte
[
RECEIVE_BUFFER_SIZE
]);
}
return
buffer
;
}
public
void
returnBuffer
(
FrameBuffer
buffer
)
{
frameBufferPool
.
add
(
buffer
);
}
public
BufferPool
()
{
init
();
}
}
src/org/btik/server/video/device/udp2/FrameBuffer.java
0 → 100644
浏览文件 @
201a3227
package
org.btik.server.video.device.udp2
;
public
class
FrameBuffer
{
// 2 + 4 + 2字节 2 字节的0 4字节ip 2字节端口
long
address
;
byte
[]
data
;
int
size
;
public
FrameBuffer
(
byte
[]
data
)
{
this
.
data
=
data
;
}
}
src/org/btik/server/video/device/udp2/NewUDPDeviceChannel.java
0 → 100644
浏览文件 @
201a3227
package
org.btik.server.video.device.udp2
;
import
org.btik.server.VideoServer
;
import
org.btik.server.util.ByteUtil
;
import
org.btik.server.util.NamePrefixThreadFactory
;
import
org.btik.server.video.device.iface.DevChannel
;
import
org.btik.server.video.device.iface.VideoChannel
;
import
org.btik.server.video.device.task.AsyncTaskExecutor
;
import
java.io.IOException
;
import
java.net.DatagramPacket
;
import
java.net.DatagramSocket
;
import
java.net.InetAddress
;
import
java.util.HashMap
;
import
java.util.concurrent.*
;
public
class
NewUDPDeviceChannel
extends
Thread
implements
DevChannel
{
private
static
final
int
SN_LEN
=
16
;
private
volatile
boolean
runFlag
=
true
;
/**
* 帧通道端口号
*/
private
int
streamPort
;
private
VideoServer
videoServer
;
private
ExecutorService
executorService
;
private
BufferPool
bufferPool
;
private
FrameDispatcher
[]
frameDispatchers
;
/**
* 帧分发线程数量,随着设备增多可以适当增加
*/
private
int
dispatcherPoolSize
=
8
;
public
void
setStreamPort
(
int
streamPort
)
{
this
.
streamPort
=
streamPort
;
}
public
void
setVideoServer
(
VideoServer
videoServer
)
{
this
.
videoServer
=
videoServer
;
}
public
void
setBufferPool
(
BufferPool
bufferPool
)
{
this
.
bufferPool
=
bufferPool
;
}
/**
* 可选的输入值 1 2 4 8 16 32 64 128 256几个数字,根据cpu核数和设备的数量选择合适的值
* ,输入其它值也会被映射到以上值,如果只有一个摄像头设备那就一个足够,线程数太多而cpu核数过少,
* 反而因为线程不断切换使得效率更低
*/
public
void
setDispatcherPoolSize
(
int
dispatcherPoolSize
)
{
int
maximumCapacity
=
256
;
int
n
=
-
1
>>>
Integer
.
numberOfLeadingZeros
(
dispatcherPoolSize
-
1
);
this
.
dispatcherPoolSize
=
(
n
<
0
)
?
1
:
(
n
>=
maximumCapacity
)
?
maximumCapacity
:
n
+
1
;
}
private
final
HashMap
<
Long
,
VideoChannel
>
videoChannelMap
=
new
HashMap
<>();
@Override
public
synchronized
void
start
()
{
System
.
out
.
println
(
"init buffer pool"
);
System
.
out
.
println
(
"start dispatchers"
);
frameDispatchers
=
new
FrameDispatcher
[
dispatcherPoolSize
];
executorService
=
new
ThreadPoolExecutor
(
dispatcherPoolSize
,
dispatcherPoolSize
,
0
,
TimeUnit
.
SECONDS
,
new
LinkedBlockingQueue
<>(),
new
NamePrefixThreadFactory
(
"frameDispatcher"
));
for
(
int
i
=
0
;
i
<
dispatcherPoolSize
;
i
++)
{
FrameDispatcher
msgDispatcher
=
new
FrameDispatcher
();
frameDispatchers
[
i
]
=
msgDispatcher
;
executorService
.
submit
(
msgDispatcher
);
}
System
.
out
.
println
(
"udp channel loaded"
);
super
.
start
();
}
@Override
public
void
run
()
{
try
(
DatagramSocket
serverSocket
=
new
DatagramSocket
(
streamPort
))
{
FrameBuffer
frameBuffer
=
bufferPool
.
getFrameBuffer
();
DatagramPacket
datagramPacket
=
new
DatagramPacket
(
frameBuffer
.
data
,
0
,
frameBuffer
.
data
.
length
);
while
(
runFlag
)
{
serverSocket
.
receive
(
datagramPacket
);
InetAddress
address
=
datagramPacket
.
getAddress
();
frameBuffer
.
address
=
(
long
)
address
.
hashCode
()
<<
16
|
datagramPacket
.
getPort
();
frameBuffer
.
size
=
datagramPacket
.
getLength
();
frameDispatchers
[(
int
)
(
frameBuffer
.
address
&
dispatcherPoolSize
-
1
)].
messages
.
add
(
frameBuffer
);
// 切换缓冲区
frameBuffer
=
bufferPool
.
getFrameBuffer
();
datagramPacket
.
setData
(
frameBuffer
.
data
);
}
}
catch
(
IOException
e
)
{
System
.
out
.
println
(
" start server failed:"
+
e
.
getMessage
());
}
}
public
void
shutDown
()
{
runFlag
=
false
;
// 无消息导致阻塞时,没有读到flag,帮助退出阻塞
for
(
FrameDispatcher
frameDispatcher
:
frameDispatchers
)
{
frameDispatcher
.
messages
.
add
(
new
FrameBuffer
(
new
byte
[
0
]));
}
// 线程池核心线程也需要停止
executorService
.
shutdown
();
}
@Override
public
int
channelIdLen
()
{
return
SN_LEN
;
}
static
class
UDPDev
{
byte
[]
frame
;
int
[]
sizeTable
;
VideoChannel
videoChannel
;
BufferPool
bufferPool
;
long
address
;
int
segmentIndex
=
0
;
public
UDPDev
(
byte
[]
frame
,
VideoChannel
videoChannel
,
BufferPool
bufferPool
,
long
address
)
{
this
.
frame
=
frame
;
this
.
sizeTable
=
new
int
[
frame
.
length
];
this
.
videoChannel
=
videoChannel
;
this
.
address
=
address
;
this
.
bufferPool
=
bufferPool
;
}
}
class
FrameDispatcher
implements
Runnable
{
LinkedBlockingQueue
<
FrameBuffer
>
messages
=
new
LinkedBlockingQueue
<>();
@Override
public
void
run
()
{
try
{
while
(
runFlag
)
{
FrameBuffer
segment
=
messages
.
take
();
try
{
long
address
=
segment
.
address
;
VideoChannel
videoChannel
=
videoChannelMap
.
get
(
address
);
if
(
videoChannel
!=
null
)
{
videoChannel
.
sendFrame
(
segment
.
data
,
segment
.
size
);
}
else
{
onNewStreamOpen
(
segment
);
}
}
catch
(
Exception
e
)
{
if
(
runFlag
)
{
e
.
printStackTrace
();
}
else
{
break
;
}
}
finally
{
// 归还到池里
bufferPool
.
returnBuffer
(
segment
);
}
}
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
System
.
out
.
println
(
"exit by:"
+
e
);
}
System
.
out
.
println
(
"exit : "
+
getName
());
}
}
private
void
onNewStreamOpen
(
FrameBuffer
frame
)
{
byte
[]
sn
=
new
byte
[
SN_LEN
+
1
];
System
.
arraycopy
(
ByteUtil
.
toHexString
(
frame
.
address
),
0
,
sn
,
1
,
SN_LEN
);
VideoChannel
channel
=
videoServer
.
createChannel
(
sn
);
videoChannelMap
.
put
(
frame
.
address
,
channel
);
}
}
src/org/btik/server/video/BioHttpVideoServer.java
→
src/org/btik/server/video/
device/web/
BioHttpVideoServer.java
浏览文件 @
201a3227
package
org.btik.server.video
;
package
org.btik.server.video
.device.web
;
import
org.btik.server.DevChannel
;
import
org.btik.server.
video.device.iface.
DevChannel
;
import
org.btik.server.VideoServer
;
import
org.btik.server.VideoServer
;
import
org.btik.server.util.ByteUtil
;
import
org.btik.server.util.ByteUtil
;
import
org.btik.server.video.device.task.AsyncTaskExecutor
;
import
org.btik.server.video.device.iface.HttpConstant
;
import
org.btik.server.video.device.iface.VideoChannel
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStream
;
...
...
src/org/btik/server/video/MJPEGVideoChannel.java
→
src/org/btik/server/video/
device/web/
MJPEGVideoChannel.java
浏览文件 @
201a3227
package
org.btik.server.video
;
package
org.btik.server.video
.device.web
;
import
org.btik.server.util.ByteUtil
;
import
org.btik.server.util.ByteUtil
;
import
org.btik.server.video.device.task.AsyncTaskExecutor
;
import
org.btik.server.video.device.iface.HttpConstant
;
import
org.btik.server.video.device.iface.VideoChannel
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.io.OutputStream
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录