2025年9月24日 星期三

使用 Python Flask 建立 USB 網路攝影機串流視訊

 

使用 Python Flask 建立 USB 網路攝影機串流視訊

身為一個 AIOT 專家,我將為您提供一個完整的規劃,教您如何使用 Python Flask 框架建立一個網頁應用程式,以實現從 USB 網路攝影機取得視訊,並透過網頁瀏覽器進行串流分享。這個方案不僅能讓您快速搭建服務,也具備良好的擴展性,能輕鬆整合進您的 AIOT 雲端平台。


1. 核心技術與軟體架構

我們將使用以下技術來實現這個功能:

  • Python Flask: 作為輕量級的後端網頁伺服器,負責處理 HTTP 請求並串流視訊。

  • OpenCV (cv2): 用於讀取 USB 網路攝影機的影像資料。OpenCV 是一個功能強大的電腦視覺函式庫,能輕鬆處理影像和視訊流。

  • Generator (生成器): Python 的生成器是實現即時視訊串流的關鍵。它能持續產生影像幀(frame),並將其推送給網頁瀏覽器,而不會一次性載入所有資料,這對記憶體和效能非常有幫助。

  • HTML & JavaScript: 用於建立網頁前端,透過 <img> 標籤來接收和顯示串流影像。

2. 程式碼實作步驟

以下是一個簡潔且完整的程式碼範例,您可以直接複製並執行。

步驟一:安裝必要的函式庫

請先在您的 Python 環境中安裝 Flask 和 OpenCV:

Bash
pip install Flask opencv-python

步驟二:撰寫 Flask 後端程式碼

建立一個名為 app.py 的檔案,並貼上以下程式碼。這段程式碼包含了兩個主要部分:一個是網頁前端(index.html),另一個是視訊串流後端。

Python
from flask import Flask, render_template, Response
import cv2

app = Flask(__name__)

# 開啟 USB 網路攝影機
# 參數 0 通常代表第一個 USB 攝影機。如果有多個,可以嘗試 1, 2, ...
camera = cv2.VideoCapture(0)

def generate_frames():
    """
    這是一個生成器函數,它會持續從攝影機讀取影像幀,
    並將每一幀轉換成 JPEG 格式。
    """
    while True:
        # 從攝影機讀取一幀影像
        success, frame = camera.read()
        if not success:
            break
        else:
            # 將影像幀轉換為 JPEG 格式,這對於網頁顯示非常高效
            ret, buffer = cv2.imencode('.jpg', frame)
            frame_bytes = buffer.tobytes()

            # 使用 `yield` 將影像幀打包成串流數據
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n')

@app.route('/')
def index():
    """
    主頁面路由,用於顯示視訊串流
    """
    # 這裡可以直接返回 HTML 內容,或者使用 render_template
    # 為了方便,我們直接在函數中寫 HTML
    html_content = """
    <!DOCTYPE html>
    <html>
    <head>
        <title>USB 攝影機串流</title>
    </head>
    <body>
        <h1>即時視訊串流</h1>
        <img src="/video_feed" width="640" height="480">
    </body>
    </html>
    """
    return html_content

@app.route('/video_feed')
def video_feed():
    """
    這個路由用於將影像串流發送給網頁,
    使用 Multipart/x-mixed-replace 協議實現即時更新。
    """
    return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    # 啟動 Flask 應用程式
    # host='0.0.0.0' 允許從外部網路訪問
    app.run(host='0.0.0.0', debug=True)

步驟三:執行程式

在命令提示字元或終端機中,執行您的 Python 腳本:

Bash
python app.py

如果一切順利,您會看到類似以下的輸出,表示伺服器已經啟動:

 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!

步驟四:在瀏覽器中查看視訊

開啟您的網頁瀏覽器,並輸入以下網址:

http://localhost:5000/

如果您是從其他電腦訪問,請將 localhost 替換為執行伺服器電腦的 IP 地址。您將會看到即時的 USB 攝影機畫面。

3. 應用場景與擴展性

這個基本的視訊串流架構是您未來開發更複雜 AIOT 專案的基石。您可以輕鬆地進行以下擴展:

  • 整合到您的 AIOT 平台: 在您的會員管理系統中,為每個 IOT_dev(設備)設定一個專屬的視訊串流網址。當使用者擁有特定設備的 Lev3(監看權) 時,就可以在網頁上觀看該設備的即時視訊。

  • 遠端監控: 您的使用者可以隨時隨地透過網頁或手機應用程式,查看家裡或辦公室的即時畫面。

  • AI 影像分析: 您可以在 generate_frames() 函數中加入更多的電腦視覺程式碼,例如人臉辨識、物體偵測等,將分析結果疊加到影像上,再傳輸給網頁。

這個方案讓您可以快速建立一個功能強大的視訊監控服務,並將其無縫整合到您既有的 AIOT 雲端平台中。

沒有留言:

張貼留言