Làm cách nào để truyền phát video trực tiếp từ máy chủ linux?


30

Đây là những gì tôi muốn làm. Nhìn xung quanh nhưng không tìm thấy câu trả lời thẳng thắn nào. Tôi có một hộp Linux chạy các trang web bằng Ubuntu / MySQL / Apache. Tôi có IP tĩnh của riêng mình, tức là không sử dụng lưu trữ web. Tôi muốn có thể truyền phát nguồn cấp dữ liệu video từ webcam trên máy tính xách tay (có lẽ đang chạy Windows) đến máy chủ Linux của tôi và để người dùng một trong các trang web của tôi có thể xem video đó trực tiếp khi được phát trực tuyến. Rõ ràng là máy tính xách tay sẽ cần phải xác thực với máy chủ bằng cách nào đó, nhưng không nên hạn chế ai có thể xem video trực tiếp trên trang web. Cảm ơn.


Bạn có hỏi làm thế nào để thực hiện giải pháp đó hoặc bạn tìm kiếm giải pháp bên thứ 3 sẵn sàng sử dụng? trong trường hợp trước đây SO không đúng chỗ cho câu hỏi này, tôi tin rằng đó là lý do hạ cấp

Câu trả lời:


46

Tôi hiện đang phát triển phát trực tuyến từ 3 camera miniDV được kết nối qua FireWire, khá giống với nhu cầu của bạn.

Gợi ý nhanh: vlc + Flowplayer / jw player

Trước hết, có hai định dạng video mà bạn có thể sử dụng trong phát trực tuyến: FLV và h264. FLV dễ dàng hơn để chuyển mã, h264 có tỷ lệ kích thước / chất lượng tốt hơn nhưng việc chuyển mã lại tốn nhiều cpu hơn. Cả hai có thể được hiển thị bởi các trình phát flash trong trang web.

Thứ hai, cơ sở hạ tầng phát trực tuyến. Vì băng thông của bạn từ máy tính xách tay bị hạn chế (vài Mbps đứng đầu), bạn cần truyền phát đến máy chủ của mình và gửi lại cho khách hàng. Vì vậy, luồng sẽ chảy 1 lần đến máy chủ và sau đó N lần đến máy khách từ đó. Bạn chưa mô tả kết nối internet cho máy tính xách tay của mình, vì vậy kịch bản được chia thành hai phần:

  1. Máy tính xách tay được kết nối với địa chỉ IP công cộng HOẶC bạn có thể chuyển NAT sang máy tính xách tay . Kịch bản này dễ dàng hơn nhiều, vì bạn có thể kết nối từ máy chủ đến máy tính xách tay đẹp và dễ dàng. Bất lợi lớn là, bạn bị ràng buộc vào một địa điểm (một địa chỉ IP).

  2. Máy tính xách tay không được kết nối với địa chỉ công cộng . Điều này hơi khó một chút, nhưng sẽ hoạt động từ bất kỳ mạng nào cho phép bạn SSH đến máy chủ của mình và tải lên hiệu quả (1 Mbps nên làm điều đó).

Bất kể kịch bản được sử dụng, cơ sở hạ tầng sẽ trông như thế này

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

Truyền phát từ máy tính xách tay

  1. Quay video từ webcam . Tôi chưa bao giờ bắt được luồng từ webcam đính kèm cục bộ, nhưng có nhiều ví dụ về cách thực hiện thông qua V4L, ví dụ: Cài đặt webcam . Phần duy nhất mà bạn nên quan tâm là:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    Đó là phần đầu tiên của lệnh VLC để kết nối với webcam. Để biết thêm chi tiết, hãy làm theo hướng dẫn đã đề cập. Đặc biệt nhìn vào phần "nhóm video" và đường dẫn thiết bị chính xác đến / dev / video và / dev / audio. Những người có thể khác nhau trên máy tính xách tay của bạn.

  2. Chuyển mã video sang FLV . Cá nhân tôi sử dụng FLV, vì nó ít đòi hỏi CPU hơn. Chuỗi chuyển mã tôi sử dụng là thế này:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    Điều này sẽ chuyển mã luồng video sang định dạng FLV với âm thanh MPGA (MP3 không có sẵn trong Ubuntu của tôi). Sampl Cả bằng cách nào đó là bắt buộc, nó sẽ không hoạt động mà không có nó. Nhưng bạn có thể chọn nhỏ hơn, như 22050. Điều này sẽ chuyển mã luồng video 'như hiện tại', vì vậy tỷ lệ là 1: 1. Bạn có thể nối các tham số chiều rộng và chiều cao, hoặc thậm chí tham số tỷ lệ. Nhìn vào tài liệu VLC.

  3. Truyền phát nó từ máy tính xách tay . Bây giờ bạn phải tạo luồng cục bộ, trên đó máy chủ sẽ kết nối:

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    Điều này sẽ liên kết luồng VLC với 0.0.0.0:8081/stream.flv. Toàn bộ lệnh sẽ trông như thế này:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

Đang phát lại trên máy chủ

  1. Bắt luồng trên máy chủ và phát lại nó . Một lần nữa, chúng tôi sử dụng VLC để chụp và truyền phát. Việc sử dụng dựa trên kịch bản cơ sở hạ tầng từ đầu bài này. Như tôi đã trình bày, VLC trên máy tính xách tay truyền phát video trên một số cổng. Cổng này phải được tích lũy từ máy chủ. Nếu bạn có địa chỉ IP công cộng của máy tính xách tay hoặc cổng NATed, bạn có thể kiểm tra nó bằng telnet:

    server$ telnet public_ip_address 8081

    Bất cứ điều gì ngoại trừ "hết thời gian kết nối" sẽ tiết lộ rằng bạn có thể kết nối với luồng máy tính xách tay của mình. Nếu bạn không có địa chỉ IP công cộng hoặc bạn không thể chuyển sang cổng NAT, bạn phải thực hiện theo cách khác. Bạn có thể SSH từ máy tính xách tay đến máy chủ và từ xa chuyển tiếp cổng máy tính xách tay của bạn đến máy chủ. Lệnh SSH chính xác sẽ là:

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    Lệnh ma thuật này sẽ 'liên kết' cổng máy tính xách tay 8081 của bạn, với cổng máy chủ 8081. Điều đó có nghĩa là khi bạn kết nối trên máy chủ với 8081, bạn sẽ âm thầm kết nối với cổng máy tính xách tay 8081 qua đường hầm SSH. Thật tuyệt phải không? :) Vì vậy, tất cả những gì chúng ta phải làm là kết nối và truyền phát VLC đơn giản:

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Hoặc trong trường hợp với địa chỉ IP công cộng hoặc cổng NATed:

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Như trong phần máy tính xách tay, VLC trên máy chủ của bạn được liên kết với cổng 8082. Tại sao 8082 mà không phải 8081? 8081 đã được thực hiện bởi SSH từ xa chuyển tiếp. Tại sao chúng ta không sử dụng phần chuyển mã như trong ví dụ đầu tiên? Video đã có định dạng đúng, vì vậy tất cả những gì chúng ta phải làm chỉ là phát trực tiếp.

  2. Kiểm tra . Trong cả hai ví dụ, bạn có thể kiểm tra chức năng bằng cách xem luồng qua VLC. Bạn có thể kiểm tra luồng cục bộ của mình:

    laptop$ vlc http://localhost:8081/stream.flv

    Và bạn có thể kiểm tra luồng máy chủ của mình:

    laptop$ vlc http://server_ip_address:8082/stream.flv

    Trong cả hai trường hợp, bạn sẽ thấy đầu vào webcam của bạn.

Hiển thị luồng trên web

Hiển thị luồng trên web, sẽ hoạt động trong hầu hết các trường hợp, là thông qua trình phát flash. Tôi đã thử hai sản phẩm miễn phí cho mục đích phi thương mại: JW PlayerFlowplayer . Tôi đã ở lại với Flowplayer, nhưng tôi không nhớ lý do, có thể là do các plugin (mà tôi không sử dụng :)) hoặc vì tài liệu tốt hơn.

Cách hiển thị luồng FLV từ VLC trong trang web được trình bày ở đây: Truyền phát VLC sang trang web với asf và Flash

Xử lý sự cố

Hãy nhận biết nhiều vấn đề mà SILL phát sinh. Điều đầu tiên, như trong tất cả mọi thứ, đọc . VLC là chương trình rất trò chuyện, vì vậy nó sẽ cho bạn biết vấn đề ở đâu. Có thể có vấn đề với quyền truy cập vào thiết bị video / âm thanh, thiếu codec, sai chính tả - thông số xuất hiện, ... Tìm hiểu cách sử dụng iftopđể xem liệu dữ liệu có thực sự chảy qua mạng, v.v.


1
Cảm ơn rất nhiều! Đây là nhiều thông tin hơn tôi mong đợi. Sẽ kiểm tra VLC và sử dụng thông tin của bạn làm hướng dẫn.

3

Công cụ lựa chọn của tôi ở đây sẽ là vlc . Nó không chỉ là một trình phát video đa định dạng đa mục đích, nó còn có khả năng phát trực tuyến ở một mức độ lớn các định dạng tệp và giao thức truyền phát. Như một phần thưởng, nó hoạt động đa nền tảng giữa các máy chủ Windows và Linux.

Chúng tôi đã thiết lập một cái gì đó tương tự một vài năm trước đây, nơi một khách hàng sử dụng đường DSL băng thông hẹp (ngược dòng 128 K) cần thiết để webcam kết nối mạng của anh ấy được truyền tới nhiều đối tượng. Một bản cài đặt VLC như một máy chủ "phản xạ" đã thực hiện xoay tín hiệu cam, lấy tải băng thông chính từ các máy khách truyền phát và trình bày luồng trong các giao thức và định dạng truyền phát khác nhau.


1

Không thực sự là lĩnh vực chuyên môn của tôi, nhưng có lẽ tôi có thể chỉ cho bạn một hướng đi tiềm năng.

Việc triển khai thương mại là sử dụng Flash Media Server của Adobe. Tất nhiên, đó có thể là một cách tiếp cận khá tốn kém. Tuy nhiên, có các lựa chọn thay thế nguồn mở - chẳng hạn như Red5 . Bạn sẽ cần cài đặt máy chủ (nó có phụ thuộc Java).

Khi bạn có máy chủ đang chạy, bạn có thể chọn giao diện người dùng của mình (tôi tin Red5 đi kèm với một số mẫu, nhưng bạn cũng có thể sử dụng JW Player với type=camera).

Giao diện người dùng sẽ nhận được video phát trực tiếp từ máy chủ phương tiện và bạn sẽ tải luồng của mình lên máy chủ phương tiện.

Thông tin khác: Red5 Trợ giúp & Thông tinRed5 Tham khảo


jwplayer là một điều tuyệt vời cho sử dụng cá nhân
Kendrick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.