Home >Web Front-end >JS Tutorial >Turn Static Images into Seamless MJPEG Sequences

Turn Static Images into Seamless MJPEG Sequences

Linda Hamilton
Linda HamiltonOriginal
2025-01-28 16:31:11282browse

I recently embarked on a project to stream live DSLR footage to a website or app. My goal was simple: real-time image streaming from my DSLR. However, achieving seamless streaming proved more challenging than anticipated.

This is how I solved it, leveraging DigiCamControl and Express.js.

The Challenge

DigiCamControl is a fantastic tool for DSLR control and LiveView. The caveat? LiveView provides a static image, updating approximately 20 times per second upon reload. While functional, it's not a true real-time feed.

My objective was to transform this image stream into a standard MJPEG feed, compatible with web and desktop applications.

The Solution

Through experimentation, I discovered a method to convert these static images into a smooth MJPEG stream using Express.js. The process is surprisingly straightforward.

Here's the backend code:

<code class="language-javascript">const express = require('express');
const axios = require('axios');

const app = express();
const PORT = 3000; // MJPEG proxy port
const DIGICAM_URL = 'http://127.0.0.1:5513/liveview.jpg';
const FPS = 20; // Frames per second

app.get('/liveview.mjpeg', (req, res) => {
  res.writeHead(200, {
    'Content-Type': 'multipart/x-mixed-replace; boundary=frame',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
  });

  const interval = setInterval(async () => {
    try {
      const response = await axios.get(DIGICAM_URL, { responseType: 'arraybuffer' });
      const imageData = response.data;

      res.write(`--frame\r\n`);
      res.write(`Content-Type: image/jpeg\r\n\r\n`);
      res.write(imageData);
      res.write(`\r\n`);
    } catch (error) {
      console.error('Error fetching image:', error.message);
      clearInterval(interval);
      res.end();
    }
  }, 1000 / FPS);

  req.on('close', () => {
    clearInterval(interval);
  });
});

app.listen(PORT, () => {
  console.log(`MJPEG server running on http://localhost:${PORT}/liveview.mjpeg`);
});</code>

Addressing a Common Error

Initially, I encountered this error: Error fetching liveview image: connect ECONNREFUSED ::1:5513. This stemmed from how localhost resolves on certain systems. The solution was simple: replacing http://localhost:5513/liveview.jpg with http://127.0.0.1:5513/liveview.jpg.

The Result

With the server running, I successfully streamed the DSLR's LiveView feed to my web app at a smooth 20 FPS. While not as sophisticated as RTSP, this MJPEG approach is efficient for most applications.

If you're aiming to integrate a live DSLR feed into your project, this method offers a straightforward and effective solution. DigiCamControl handles the camera-side processing, and Express.js simplifies the image streaming. The results are satisfying!

Turn Static Images into Seamless MJPEG Sequences

The above is the detailed content of Turn Static Images into Seamless MJPEG Sequences. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn