亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Python實(shí)現(xiàn)一個(gè)本地視頻流媒體服務(wù)器

 更新時(shí)間:2025年04月09日 09:02:42   作者:winfredzhang  
你是否曾經(jīng)想過(guò)在本地網(wǎng)絡(luò)上輕松地將電腦上的視頻分享給手機(jī)或平板電腦觀看?也許你下載了一部電影,想在客廳的智能電視上播放,卻不想費(fèi)力地拷貝文件,今天,小編將給大家介紹如何使用Python構(gòu)建一個(gè)簡(jiǎn)單的本地視頻流媒體服務(wù)器,需要的朋友可以參考下

引言

你是否曾經(jīng)想過(guò)在本地網(wǎng)絡(luò)上輕松地將電腦上的視頻分享給手機(jī)或平板電腦觀看?也許你下載了一部電影,想在客廳的智能電視上播放,卻不想費(fèi)力地拷貝文件。今天,我們將深入分析一個(gè) Python 腳本,它使用 wxPython 創(chuàng)建圖形用戶界面 (GUI),并結(jié)合 Python 內(nèi)建的 http.server 和 socketserver 模塊,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的視頻流媒體服務(wù)器。
C:\pythoncode\new\output\VideoStreamServer.py
這個(gè)腳本讓你能夠:

  1. 通過(guò) GUI 選擇一個(gè)本地視頻文件。
  2. 在本地網(wǎng)絡(luò)上啟動(dòng)一個(gè) HTTP 服務(wù)器。
  3. 通過(guò)瀏覽器訪問(wèn)服務(wù)器地址,直接觀看所選視頻。

讓我們一步步解析這個(gè)代碼的核心功能和實(shí)現(xiàn)細(xì)節(jié)。

代碼概覽

# 必要的庫(kù)導(dǎo)入
import wx # GUI 庫(kù)
import os # 操作系統(tǒng)功能,如路徑處理
import http.server # 基礎(chǔ) HTTP 服務(wù)器
import socketserver # 服務(wù)器框架
import threading # 支持服務(wù)器后臺(tái)運(yùn)行
import urllib.parse # URL 編碼/解碼
import socket # 網(wǎng)絡(luò)功能,獲取 IP
import webbrowser # 打開瀏覽器
from pathlib import Path # (在此代碼中未深度使用,但通常用于路徑操作)
import sys # 用于標(biāo)準(zhǔn)輸出重定向和異常信息

核心組件分析

  • CustomTCPServer 類:增強(qiáng)型服務(wù)器基礎(chǔ)
class CustomTCPServer(socketserver.TCPServer):
    allow_reuse_address = True # 關(guān)鍵!允許快速重啟服務(wù)器

    def server_bind(self):
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 再次確保地址重用
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 啟用 TCP Keep-Alive
        super().server_bind()

    def handle_error(self, request, client_address):
        # ... (優(yōu)雅地處理非連接中斷的錯(cuò)誤) ...
        if not isinstance(error_value, (ConnectionResetError, ConnectionAbortedError, BrokenPipeError)):
            print(f"Error processing request from {client_address}:")
            traceback.print_exc()

這個(gè)類繼承自 socketserver.TCPServer,但做了一些重要的改進(jìn):

  • allow_reuse_address = True 和 setsockopt(socket.SO_REUSEADDR, 1):這是非常實(shí)用的設(shè)置。它允許服務(wù)器在關(guān)閉后立即重新啟動(dòng)并綁定到同一個(gè)端口,即使之前的連接還處于 TIME_WAIT 狀態(tài)。這在開發(fā)和調(diào)試時(shí)尤其有用。
  • setsockopt(socket.SO_KEEPALIVE, 1):?jiǎn)⒂?TCP Keep-Alive 機(jī)制,有助于檢測(cè)和清理半開連接,增強(qiáng)服務(wù)器的健壯性。
  • handle_error 方法:覆蓋了基類的方法,用于更精細(xì)地處理錯(cuò)誤。它特別忽略了常見的客戶端連接中斷錯(cuò)誤(如 ConnectionResetError, BrokenPipeError),這些錯(cuò)誤在流媒體場(chǎng)景下很常見(例如用戶關(guān)閉瀏覽器或網(wǎng)絡(luò)不穩(wěn)定),通常不需要作為嚴(yán)重錯(cuò)誤記錄。對(duì)于其他類型的錯(cuò)誤,它會(huì)打印詳細(xì)的追溯信息。
  1. VideoStreamerApp 和 VideoStreamerFrame 類:GUI 實(shí)現(xiàn) (wxPython)
  • VideoStreamerApp: 這是標(biāo)準(zhǔn)的 wxPython 應(yīng)用程序入口點(diǎn),負(fù)責(zé)初始化和顯示主窗口 (VideoStreamerFrame)。
  • VideoStreamerFrame: 這是應(yīng)用程序的主窗口,包含了所有的用戶界面元素和交互邏輯。
    • __init__: 初始化窗口,設(shè)置標(biāo)題、大小,并調(diào)用 InitUI 來(lái)構(gòu)建界面。它還存儲(chǔ)了應(yīng)用程序的狀態(tài),如選定的視頻文件路徑 (selected_video)、服務(wù)器實(shí)例 (server)、端口 (server_port) 和運(yùn)行狀態(tài) (server_running)。
    • InitUI:
  • 使用 wx.Panel 作為容器,wx.BoxSizer (垂直 vbox 和水平 hbox) 來(lái)管理布局,確??丶茏赃m應(yīng)窗口大小。
  • 創(chuàng)建了核心控件:
    • “選擇視頻文件” 按鈕 (btn_select):觸發(fā) OnSelectVideo。
    • 靜態(tài)文本 (st_path):顯示選中的文件路徑。
    • “啟動(dòng)服務(wù)器” / “停止服務(wù)器” 按鈕 (btn_startbtn_stop):觸發(fā) OnStartServer / OnStopServer,并根據(jù)服務(wù)器狀態(tài)啟用/禁用。
    • 靜態(tài)文本 (st_statusst_url):顯示服務(wù)器狀態(tài)和訪問(wèn) URL。
    • “在瀏覽器中打開” 按鈕 (btn_open_browser):觸發(fā) OnOpenBrowser。
    • 多行只讀文本框 (log_area):用于顯示服務(wù)器日志。
    • 幫助文本 (st_help):提供基本使用說(shuō)明。
  • 日志重定向:通過(guò) sys.stdout = self.LogRedirector(self.log_area) 將所有 print 輸出重定向到 GUI 的日志區(qū)域。
  • LogRedirector (嵌套類): 一個(gè)簡(jiǎn)單的類,實(shí)現(xiàn)了 write 方法。關(guān)鍵在于它使用 wx.CallAfter(self.text_ctrl.AppendText, string),確保即使日志信息來(lái)自其他線程(如服務(wù)器線程),也能安全地更新 GUI 控件(wxPython 的 GUI 更新必須在主線程進(jìn)行)。
  • OnSelectVideo: 使用 wx.FileDialog 彈出文件選擇對(duì)話框,讓用戶選擇視頻文件。支持常見的視頻格式 (.mp4.avi.mkv.mov)。
  • get_local_ip: 一個(gè)實(shí)用函數(shù),嘗試通過(guò)連接到一個(gè)公共 IP (如 Google DNS) 來(lái)獲取本機(jī)的局域網(wǎng) IP 地址。這是為了方便其他設(shè)備訪問(wèn)。如果失敗,則回退到 127.0.0.1。
  • OnStartServer:
  • 檢查是否已選擇視頻。
  • VideoHandler (嵌套類):這是處理 HTTP 請(qǐng)求的核心。它繼承自 http.server.SimpleHTTPRequestHandler。
    • log_message: 覆蓋此方法,將 HTTP 服務(wù)器的日志(如 GET 請(qǐng)求)也打印到 GUI 日志區(qū)域。
    • handle_one_request: 添加了額外的異常捕獲,專門處理請(qǐng)求處理過(guò)程中的連接錯(cuò)誤。
    • do_GET: 這是最重要的部分,處理客戶端的 GET 請(qǐng)求:
      • 根路徑 (/): 當(dāng)用戶訪問(wèn)服務(wù)器根目錄時(shí),生成并發(fā)送一個(gè)簡(jiǎn)單的 HTML 頁(yè)面。這個(gè)頁(yè)面包含一個(gè) HTML5 <video> 標(biāo)簽,其 src 指向 /video/<視頻文件名>。文件名通過(guò) urllib.parse.quote 進(jìn)行 URL 編碼,以處理空格或特殊字符。頁(yè)面還包含一些基本的 CSS 樣式。
      • 視頻路徑 (/video/...): 當(dāng)瀏覽器請(qǐng)求視頻數(shù)據(jù)時(shí):
  • 內(nèi)容類型 (Content-Type): 根據(jù)視頻文件的擴(kuò)展名(.mp4.avi.mkv.mov)設(shè)置正確的 MIME 類型。這對(duì)瀏覽器正確解析視頻至關(guān)重要。
  • 文件大小 (Content-Length): 獲取視頻文件的總大小。
  • 范圍請(qǐng)求 (Range Header / HTTP 206): 這是實(shí)現(xiàn)視頻**拖動(dòng)(seeking)**的關(guān)鍵?,F(xiàn)代瀏覽器播放視頻時(shí)會(huì)發(fā)送帶有 Range 頭部的請(qǐng)求,表示只需要文件的一部分。代碼檢查 Range 頭部,如果存在:
    • 解析請(qǐng)求的字節(jié)范圍 (start_rangeend_range)。
    • 發(fā)送 206 Partial Content 狀態(tài)碼。
    • 設(shè)置 Content-Range 頭部,告訴瀏覽器發(fā)送的是哪部分?jǐn)?shù)據(jù)以及文件總大小 (e.g., bytes 1000-1999/50000)。
    • 設(shè)置 Content-Length 為本次發(fā)送的數(shù)據(jù)塊大小。
    • 打開視頻文件,使用 f.seek(start_range) 定位到請(qǐng)求的起始位置。
    • 分塊讀取和發(fā)送: 使用 while 循環(huán)和 f.read(chunk_size) (例如 64KB) 讀取文件塊,并通過(guò) self.wfile.write(data) 發(fā)送給客戶端,直到發(fā)送完請(qǐng)求的范圍。這樣做可以避免一次性將大文件讀入內(nèi)存,并且能逐步將數(shù)據(jù)流式傳輸給客戶端。同時(shí),在發(fā)送過(guò)程中捕獲 BrokenPipeError 等連接錯(cuò)誤,優(yōu)雅地停止發(fā)送。
    • 包含了一個(gè) max_chunk (10MB) 限制,避免一次性響應(yīng)過(guò)大的范圍請(qǐng)求,進(jìn)一步優(yōu)化流式傳輸。
  • 完整文件請(qǐng)求 (HTTP 200): 如果沒有 Range 頭部,則發(fā)送 200 OK 狀態(tài)碼,并設(shè)置 Content-Length 為整個(gè)文件大小。同樣使用分塊讀取和發(fā)送的方式傳輸整個(gè)文件。
  • 錯(cuò)誤處理: 在文件讀取、發(fā)送過(guò)程中都添加了異常處理,特別是針對(duì)客戶端斷開連接的情況。
    • 服務(wù)器啟動(dòng)邏輯:
      • 嘗試在 self.server_port (默認(rèn)為 8000) 啟動(dòng) CustomTCPServer。
      • 端口查找: 如果默認(rèn)端口被占用 (OSError),會(huì)自動(dòng)嘗試下一個(gè)端口,最多嘗試 10 次。
      • 后臺(tái)線程: 使用 threading.Thread 在后臺(tái)啟動(dòng)服務(wù)器的 serve_forever() 方法,這樣服務(wù)器運(yùn)行就不會(huì)阻塞 GUI 主線程。daemon=True 確保主程序退出時(shí)服務(wù)器線程也會(huì)隨之結(jié)束。
      • 更新 GUI 狀態(tài)(按鈕、狀態(tài)文本、URL)。
  • OnStopServer:
  • 同樣使用 threading.Thread 來(lái)調(diào)用 self.shutdown_server()。這是因?yàn)?nbsp;server.shutdown() 必須從不同于 serve_forever() 運(yùn)行的線程中調(diào)用。
  • 立即更新 GUI 狀態(tài)。
    • shutdown_server: 在單獨(dú)的線程中安全地調(diào)用 self.server.shutdown() 和 self.server.server_close() 來(lái)停止服務(wù)器并釋放端口。
    • OnOpenBrowser: 使用 webbrowser.open 在系統(tǒng)默認(rèn)瀏覽器中打開服務(wù)器的本地地址。
    • OnClose: 當(dāng)用戶關(guān)閉窗口時(shí)觸發(fā)。如果服務(wù)器正在運(yùn)行,會(huì)先調(diào)用 OnStopServer 停止服務(wù)器。重要:在退出前,通過(guò) sys.stdout = sys.__stdout__ 恢復(fù)標(biāo)準(zhǔn)輸出,否則程序關(guān)閉后可能出現(xiàn)問(wèn)題。event.Skip() 允許關(guān)閉事件繼續(xù)傳遞,正常關(guān)閉窗口。
  1. 主程序入口 (if __name__ == "__main__":)
  • 標(biāo)準(zhǔn)的 Python 腳本入口。創(chuàng)建 VideoStreamerApp 的實(shí)例并調(diào)用 app.MainLoop() 來(lái)啟動(dòng) wxPython 事件循環(huán),顯示 GUI 并等待用戶交互。

運(yùn)行結(jié)果

以上就是使用Python實(shí)現(xiàn)一個(gè)本地視頻流媒體服務(wù)器的詳細(xì)內(nèi)容,更多關(guān)于Python本地視頻流媒體服務(wù)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python極值整數(shù)的邊界探討分析

    Python極值整數(shù)的邊界探討分析

    這篇文章主要介紹了Python極值整數(shù)的邊界探討分析,閱讀本文來(lái)一起領(lǐng)略Python中的極值,看一下Python整數(shù)是否有邊界,有需要的朋友可以借鑒參考下
    2021-09-09
  • Python OpenCV讀取顯示視頻的方法示例

    Python OpenCV讀取顯示視頻的方法示例

    這篇文章主要介紹了 Python OpenCV讀取顯示視頻的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置

    Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置

    這篇文章主要介紹了Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python接口自動(dòng)化測(cè)試框架運(yùn)行原理及流程

    Python接口自動(dòng)化測(cè)試框架運(yùn)行原理及流程

    這篇文章主要介紹了Python接口自動(dòng)化測(cè)試框架運(yùn)行原理及流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python重寫方法和重寫特殊構(gòu)造方法

    python重寫方法和重寫特殊構(gòu)造方法

    這篇文章主要介紹了python重寫方法和重寫特殊構(gòu)造方法,對(duì)于父類的方法,只要他不符合子類模擬的實(shí)物的行為,都可以進(jìn)行重寫,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Django實(shí)現(xiàn)簡(jiǎn)單的分頁(yè)功能

    Django實(shí)現(xiàn)簡(jiǎn)單的分頁(yè)功能

    這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)分頁(yè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 利用Python來(lái)實(shí)現(xiàn)阿姆斯特朗數(shù)的檢查實(shí)例

    利用Python來(lái)實(shí)現(xiàn)阿姆斯特朗數(shù)的檢查實(shí)例

    這篇文章主要給大家介紹了關(guān)于利用Python來(lái)實(shí)現(xiàn)阿姆斯特朗數(shù)的檢查的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • pymilvus?offset參數(shù)不生效解決示例

    pymilvus?offset參數(shù)不生效解決示例

    這篇文章主要為大家介紹了pymilvus?offset參數(shù)不生效解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • python如何解決指定代碼段超時(shí)程序卡死

    python如何解決指定代碼段超時(shí)程序卡死

    這篇文章主要介紹了python如何解決指定代碼段超時(shí)程序卡死,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 利用Python的Django框架中的ORM建立查詢API

    利用Python的Django框架中的ORM建立查詢API

    這篇文章主要介紹了利用Python的Django框架中的ORM建立查詢API,對(duì)Managers和QuerySets進(jìn)行了著重介紹,需要的朋友可以參考下
    2015-04-04

最新評(píng)論