Video-Streaming

如何從 linux 伺服器流式傳輸實時影片?

  • September 13, 2020

這就是我想要做的。環顧四周,但沒有找到任何直接的答案。我有一個使用 Ubuntu/MySQL/Apache 執行網站的 Linux 機器。我也有自己的靜態 IP,即不使用虛擬主機。我希望能夠將來自筆記型電腦(可能執行 Windows)上的網路攝像頭的影片流傳輸到我的 Linux 伺服器,並讓我的一個網站的使用者能夠在流式傳輸時實時看到該影片。顯然,筆記型電腦需要以某種方式通過伺服器進行身份驗證,但是對於誰可以查看網站上的實時影片應該沒有限制。謝謝。

我目前正在開發通過 FireWire 連接的 3 台 miniDV 攝影機的線上流媒體,這與您的需求非常相似。

快速提示:vlc + flowplayer/jw player

首先,您可以在線上流媒體中使用兩種影片格式:FLV 和 h264。FLV 更容易轉碼,h264 具有更好的大小/質量比,但轉碼更消耗 CPU。兩者都可以通過網頁中的 Flash 播放器顯示。

其次,流媒體基礎設施。由於筆記型電腦的頻寬有限(幾 Mbps 最高),您需要將流傳輸到您的伺服器,然後再將其重新傳輸到客戶端。因此,流將流向伺服器 1 次,然後從那裡流向客戶端 N 次。您尚未描述筆記型電腦的網際網路連接,因此該方案分為兩部分:

  1. 筆記型電腦與公共 IP 地址連接,或者您可以通過 NAT 埠連接到筆記型電腦。這種情況要容易得多,因為您可以輕鬆輕鬆地從伺服器連接到筆記型電腦。最大的缺點是,您被綁定到一個位置(一個 IP 地址)。
  2. 筆記型電腦未連接到公共 I 地址。這有點棘手,但可以在任何允許您通過 SSH 連接到您的伺服器並進行足夠的上傳(1 Mbps 應該可以)的網路上工作。

無論在使用的場景中,基礎設施都將如下所示

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

從筆記型電腦流式傳輸

  1. 從網路攝像頭擷取影片。我從來沒有從本地連接的網路攝像頭擷取流,但是有很多範例如何通過 V4L 來實現,例如: Webcam Setup。您應該感興趣的唯一部分是:

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

這是連接網路攝像頭的 VLC 命令的第一部分。有關更多詳細資訊,請遵循上述 HOWTO。尤其是查看“影片組”部分並更正設備路徑到 /dev/video 和 /dev/audio。這些在您的筆記型電腦上可能會有所不同。 2. 將影片轉碼為 FLV。我個人使用 FLV,因為它對 CPU 的要求較低。我使用的轉碼字元串是這樣的:

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

它將影片流轉碼為帶有 MPGA 音頻的 FLV 格式(MP3 在我的 Ubuntu 中不可用)。採樣率在某種程度上是強制性的,沒有它就無法工作。但是您可以選擇更小的,例如 22050。這將“按原樣”對影片流進行轉碼,因此比例為 1:1。您可以附加寬度和高度參數,甚至是縮放參數。查看 VLC 文件。 3. 從筆記型電腦流式傳輸。現在您必須製作本地流,伺服器將在該流上連接:

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

這會將 VLC 流綁定到 0.0.0.0:8081/stream.flv。整個命令將如下所示:

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}'

在伺服器上重新流式傳輸

  1. 在伺服器上擷取流並重新流式傳輸。同樣,我們使用 VLC 來擷取和流式傳輸。使用基於本文開頭的基礎設施場景。正如我所展示的,筆記型電腦上的 VLC 在某些埠上流式傳輸影片。該埠必須可以從伺服器訪問。如果您有筆記型電腦的公共 IP 地址或 NAT 埠,您可以使用 telnet 進行測試:

server$ telnet public_ip_address 8081

除了“連接超時”之外的任何內容都會顯示您可以連接到筆記型電腦的流。如果你沒有公共 IP 地址,或者你不能 NAT 埠,你必須反過來做。您可以從筆記型電腦通過 SSH 連接到伺服器,並將筆記型電腦埠遠端轉發到伺服器。正確的 SSH 命令是:

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

這個神奇的命令會將您的筆記型電腦埠 8081 綁定到伺服器埠 8081。這意味著當您在伺服器上連接到 8081 時,您將通過 SSH 隧道靜默連接到您的筆記型電腦埠 8081。很酷,是吧?:) 所以我們所要做的就是簡單的 VLC 連接和流式傳輸:

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}'

或者如果使用公共 IP 地址或 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}'

與筆記型電腦部分一樣,伺服器上的 VLC 綁定到埠 8082。為什麼是 8082 而不是 8081?8081 已被 SSH 遠端轉發佔用。為什麼我們不像第一個例子那樣使用轉碼部分?影片已經是正確的格式,所以我們要做的就是按原樣流式傳輸。 2. 測試。在這兩個範例中,您都可以通過 VLC 查看流來測試功能。您可以測試本地流:

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

您可以測試伺服器的流:

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

在這兩種情況下,您都應該看到您的網路攝像頭輸入。

在網路上顯示流

在大多數情況下都可以通過 Flash 播放器在 Web 上顯示流。我嘗試了兩種免費用於非商業用途的產品:JW PlayerFlowplayer。我留在 Flowplayer,但我不記得原因,可能是因為外掛(我不使用它:))或因為更好的文件。

此處介紹瞭如何在網頁中顯示來自 VLC 的 FLV 流:使用 asf 和 Flash 將 VLC 流式傳輸到網站

故障排除

請注意將出現的許多問題。首先,就像所有事情一樣,閱讀. VLC 是一個非常健談的程序,所以它會告訴你問題出在哪裡。可能是訪問影片/音頻設備的權限、缺少編解碼器、拼寫錯誤的 –sout 參數等問題…學習使用iftop以查看數據是否真的通過網路傳輸等。

引用自:https://serverfault.com/questions/288137