
本文介绍如何将通过海康威视摄像头SDK获取的视频流,传输到Vue前端项目进行展示。 海康威视SDK的Demo通常基于Java Swing,不适用于直接集成到前端项目。我们将采用后端流媒体服务器作为桥梁,实现视频流的传输。
本方案基于Spring Boot后端框架,摄像头直接连接到本地电脑,无需云端视频服务。 我们使用ZLMediaKit作为流媒体服务器。
后端使用Java代码,通过海康威视SDK获取视频流,并将流数据推送到ZLMediaKit服务器。Vue前端项目则从ZLMediaKit拉取RTSP流进行播放。
核心代码片段展示了SDK初始化、设备连接、视频流获取及推流过程。
立即学习“前端免费学习笔记(深入)”;
@Service
public class HikvisionServiceImpl implements HikvisionService {
@PostConstruct
public void register() {
HikvisionClient client = new HikvisionClient();
client.initPipedStream();
client.clientInit();
client.action();
}
}HikvisionClient类包含初始化和连接设备的逻辑:
public class HikvisionClient {
ExecutorService executor = Executors.newFixedThreadPool(5);
FFmpegFrameGrabber grabber;
FFmpegFrameRecorder recorder;
PipedInputStream inputStream = new PipedInputStream();
PipedOutputStream outputStream = new PipedOutputStream();
String pushAddress = "rtsp://127.0.0.1:554/live/1";
public void initPipedStream() {
try {
outputStream.connect(inputStream);
System.out.println("Piped stream connected successfully.");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void clientInit() {
// SDK初始化代码
}
public void register() {
// 设备注册代码
}
public void action() {
// 获取视频流并预览
}
class RealDataCallBack implements HCNetSDK.FRealDataCallBack_V30 {
@Override
public void invoke(int lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser) {
if (dwDataType == HCNetSDK.NET_DVR_STREAMDATA) {
if (dwBufSize > 0) {
ByteBuffer buffer = pBuffer.getPointer().getByteBuffer(0, dwBufSize);
byte[] bytes = new byte[dwBufSize];
buffer.get(bytes);
executor.execute(() -> push(bytes, dwBufSize));
}
}
}
}
public void push(byte[] data, int size) {
try {
outputStream.write(data, 0, size);
handle();
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
public void handle() throws InterruptedException, IOException {
// 处理流数据并推送到ZLMediaKit
grabber = new FFmpegFrameGrabber(inputStream);
grabber.setOption("rtsp_transport", "tcp");
grabber.setOption("stimeout", "2000000");
grabber.setPixelFormat(AV_PIX_FMT_YUV420P);
grabber.setVideoCodec(AV_CODEC_ID_H264);
grabber.setAudioStream(Integer.MIN_VALUE);
grabber.setFormat("mpegts"); // or other suitable format
long startTime = System.currentTimeMillis();
do {
Thread.sleep(100);
if (System.currentTimeMillis() - startTime > 2000) {
System.out.println("No video stream from SDK callback.");
return;
}
} while (inputStream.available() == 0);
grabber.start();
recorder = new FFmpegFrameRecorder(pushAddress, grabber.getImageWidth(), grabber.getImageHeight());
recorder.setVideoCodec(AV_CODEC_ID_H264);
recorder.setFormat("flv"); // Output as FLV for easier frontend integration
recorder.setFrameRate(grabber.getFrameRate());
recorder.start();
Frame frame;
while ((frame = grabber.grab()) != null) {
recorder.record(frame);
}
grabber.stop();
recorder.stop();
recorder.release();
grabber.release();
}
}Vue前端通过调用后端接口获取流地址,并使用flv.js库播放视频流。后端接口处理需异步,避免阻塞请求。
flv.js播放接收到的FLV流。此方案中,后端代码需要引入必要的依赖,例如ffmpeg和海康威视SDK的Java库。 请根据实际情况调整代码和依赖。 前端也需要安装flv.js。 确保ZLMediaKit已正确配置和运行。
以上就是如何将海康威视摄像头SDK的视频流传输到前端Vue项目中?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号