script_mjpeg_server.cpp
Go to the documentation of this file.
1 #include <chrono>
2 #include <iostream>
3 #include <thread>
4 
5 // Includes common necessary includes for development using depthai library
6 #include "depthai/depthai.hpp"
7 
8 int main() {
9  using namespace std;
10 
11  // Start defining a pipeline
12  dai::Pipeline pipeline;
13 
14  auto cam = pipeline.create<dai::node::ColorCamera>();
15 
16  auto jpeg = pipeline.create<dai::node::VideoEncoder>();
17  jpeg->setDefaultProfilePreset(cam->getFps(), dai::VideoEncoderProperties::Profile::MJPEG);
18  cam->video.link(jpeg->input);
19 
20  // Script node
21  auto script = pipeline.create<dai::node::Script>();
23  jpeg->bitstream.link(script->inputs["jpeg"]);
24  script->setScript(R"(
25  import time
26  import socket
27  import fcntl
28  import struct
29  from socketserver import ThreadingMixIn
30  from http.server import BaseHTTPRequestHandler, HTTPServer
31 
32  PORT = 8080
33 
34  def get_ip_address(ifname):
35  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
36  return socket.inet_ntoa(fcntl.ioctl(
37  s.fileno(),
38  -1071617759, # SIOCGIFADDR
39  struct.pack('256s', ifname[:15].encode())
40  )[20:24])
41 
42  class ThreadingSimpleServer(ThreadingMixIn, HTTPServer):
43  pass
44 
45  class HTTPHandler(BaseHTTPRequestHandler):
46  def do_GET(self):
47  if self.path == '/':
48  self.send_response(200)
49  self.end_headers()
50  self.wfile.write(b'<h1>[DepthAI] Hello, world!</h1><p>Click <a href="img">here</a> for an image</p>')
51  elif self.path == '/img':
52  try:
53  self.send_response(200)
54  self.send_header('Content-type', 'multipart/x-mixed-replace; boundary=--jpgboundary')
55  self.end_headers()
56  fpsCounter = 0
57  timeCounter = time.time()
58  while True:
59  jpegImage = node.io['jpeg'].get()
60  self.wfile.write("--jpgboundary".encode())
61  self.wfile.write(bytes([13, 10]))
62  self.send_header('Content-type', 'image/jpeg')
63  self.send_header('Content-length', str(len(jpegImage.getData())))
64  self.end_headers()
65  self.wfile.write(jpegImage.getData())
66  self.end_headers()
67 
68  fpsCounter = fpsCounter + 1
69  if time.time() - timeCounter > 1:
70  node.warn(f'FPS: {fpsCounter}')
71  fpsCounter = 0
72  timeCounter = time.time()
73  except Exception as ex:
74  node.warn(str(ex))
75 
76  with ThreadingSimpleServer(("", PORT), HTTPHandler) as httpd:
77  node.warn(f"Serving at {get_ip_address('re0')}:{PORT}")
78  httpd.serve_forever()
79  )");
80 
81  // Connect to device with pipeline
82  dai::Device device(pipeline);
83  while(!device.isClosed()) {
84  this_thread::sleep_for(chrono::milliseconds(1000));
85  }
86  return 0;
87 }
dai::DeviceBase::isClosed
bool isClosed() const
Definition: DeviceBase.cpp:627
dai::Pipeline
Represents the pipeline, set of nodes and connections between them.
Definition: Pipeline.hpp:100
dai::node::ColorCamera
ColorCamera node. For use with color sensors.
Definition: ColorCamera.hpp:16
dai::VideoEncoderProperties::Profile::MJPEG
@ MJPEG
main
int main()
Definition: script_mjpeg_server.cpp:8
depthai.hpp
dai::Pipeline::create
std::shared_ptr< N > create()
Definition: Pipeline.hpp:145
dai::ProcessorType::LEON_CSS
@ LEON_CSS
dai::node::Script
Definition: Script.hpp:15
dai::node::Script::setProcessor
void setProcessor(ProcessorType type)
Definition: Script.cpp:53
dai::node::ColorCamera::video
Output video
Definition: ColorCamera.hpp:62
dai::Device
Definition: Device.hpp:21
std
Definition: Node.hpp:366
dai::node::VideoEncoder
VideoEncoder node. Encodes frames into MJPEG, H264 or H265.
Definition: VideoEncoder.hpp:14
dai::Node::Output::link
void link(const Input &in)
Definition: Node.cpp:84


depthai
Author(s): Martin Peterlin
autogenerated on Sat Mar 22 2025 02:58:19