2012-12-26 87 views
5

Sử dụng Chuyển động trên Linux, mỗi webcam được phân phối dưới dạng luồng trên cổng của riêng nó. Bây giờ tôi muốn phân phát các luồng đó, tất cả trên cùng một cổng, bằng cách sử dụng Node.js.Đóng luồng luồng MJPEG qua proxy Node.js

  • Chỉnh sửa: Giải pháp này hiện hoạt động. Tôi cần để có được những chuỗi ranh giới từ dòng mjpeg gốc (đó là "BoundaryString" in Motion cấu hình của tôi)
 

app.get('/motion', function(req, res) { 

    var boundary = "BoundaryString"; 

    var options = { 
    // host to forward to 
    host: '192.168.1.2', 
    // port to forward to 
    port: 8302, 
    // path to forward to 
    path: '/', 
    // request method 
    method: 'GET', 
    // headers to send 
    headers: req.headers 
    }; 

    var creq = http.request(options, function(cres) { 

     res.setHeader('Content-Type', 'multipart/x-mixed-replace;boundary="' + boundary + '"'); 
     res.setHeader('Connection', 'close'); 
     res.setHeader('Pragma', 'no-cache'); 
     res.setHeader('Cache-Control', 'no-cache, private'); 
     res.setHeader('Expires', 0); 
     res.setHeader('Max-Age', 0); 

    // wait for data 
    cres.on('data', function(chunk){ 
     res.write(chunk); 
    }); 

    cres.on('close', function(){ 
     // closed, let's end client request as well 
     res.writeHead(cres.statusCode); 
     res.end(); 
    }); 

    }).on('error', function(e) { 
    // we got an error, return 500 error to client and log error 
    console.log(e.message); 
    res.writeHead(500); 
    res.end(); 
    }); 

    creq.end(); 

}); 
 

tôi sẽ nghĩ rằng đây phục vụ lên dòng mjpeg tại 192.168.1.2:8302 như/chuyển động , Nhưng nó không. Có thể vì nó không bao giờ kết thúc và ví dụ proxy này không thực sự là một ví dụ truyền trực tuyến?

+0

Bạn có thể xem bằng cách sử dụng nginx thay thế. – david

+2

Nó cần phải là một giải pháp nút – skerit

Trả lời

1

Phát trực tuyến qua HTTP không phải là vấn đề. Tôi làm điều đó với Node thường xuyên. Tôi nghĩ rằng vấn đề bạn đang gặp phải là bạn không gửi tiêu đề kiểu nội dung cho khách hàng. Bạn thực hiện quyền ghi dữ liệu mà không gửi bất kỳ tiêu đề phản hồi nào.

Đảm bảo gửi tiêu đề loại nội dung phù hợp cho khách hàng đưa ra yêu cầu trước khi gửi bất kỳ dữ liệu nội dung thực tế nào.

Bạn có thể cần handle multipart responses, nếu ứng dụng HTTP của Node chưa thực hiện điều đó cho bạn.

Ngoài ra, tôi khuyên bạn nên gỡ lỗi này bằng Wireshark để bạn có thể xem chính xác những gì đang được gửi và nhận. Điều đó sẽ giúp bạn thu hẹp các vấn đề như thế này một cách nhanh chóng. Tôi cũng nên lưu ý rằng một số khách hàng có vấn đề với mã hóa chunked, đó là những gì Node sẽ gửi nếu bạn không chỉ định một chiều dài nội dung (mà bạn không thể vì nó không xác định thời gian). Nếu bạn cần vô hiệu hóa mã hóa chunked, xem câu trả lời của tôi ở đây: https://stackoverflow.com/a/11589937/362536 Về cơ bản, bạn chỉ cần vô hiệu hóa nó: response.useChunkedEncodingByDefault = false;. Đừng làm điều này trừ khi bạn cần phải mặc dù! Và đảm bảo gửi Connection: close trong tiêu đề của bạn với nó!

+0

Vấn đề là một vấn đề đối với luồng mjpeg. Tôi thấy một dòng jpeg bình thường luôn được phục vụ như một phần toàn bộ. Vì vậy, tôi nên chờ đợi cho toàn bộ một khung và chỉ sau đó gửi nó cho khách hàng. – skerit

+1

Ah, đã tìm thấy nó! Trong tiêu đề phản hồi của tôi, tôi cần thiết đặt ranh giới nhiều phần được sử dụng trong luồng mjpeg ban đầu (trong đó, chuyển động, luôn là cùng một "BoundaryString") Bằng cách đó tôi có thể chuyển tiếp các đoạn mà không cần thêm bất kỳ dữ liệu nào vào chính nó. – skerit

0

Những gì bạn cần làm là yêu cầu luồng mjpeg khi cần thiết chỉ trong một chuỗi và trả lời từng khách hàng bằng mjpeg hoặc jpeg (nếu bạn cần hỗ trợ IE).

Các vấn đề liên quan