Python Flask 螢幕分享

本篇 ShengYu 要介紹使用 Python Flask 螢幕分享的作法,完成後就可以將你的桌面螢幕利用網頁的方式串流影像出去,其它使用者只需要一個瀏覽器就可以看你的螢幕分享(電腦或手機或平板)。

在之前的文章中曾經介紹過 Python Flask 的網頁開發攝影機串流以及螢幕截圖,今天來點不一樣的,來作個螢幕分享的功能吧!

本篇所使用到的 Python 模組有

  • Flask
  • pyscreenshot (Linux)
  • PIL ImageGrab (Windows and macOS)

顯示圖片的 Flask 網頁

基於之前的 Flask 系列文章介紹,可以透過下列的程式碼簡單的建立一個網頁並顯示一張圖片,

index.html
1
2
3
4
5
6
7
<html>
<head>
</head>
<body>
<img src="{{ url_for('video_feed') }}" alt="" style="width: 100%">
</body>
</html>

之前介紹過 Flask 使用 template 的方式了,這邊就直接使用吧!

main.py
1
2
3
4
5
6
7
8
9
10
import flask

app = flask.Flask(__name__)

@app.route('/')
def index():
return flask.render_template('index.html')

if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True)

但是這次我不只單純顯示一張圖片就好,我要顯示一連串圖片,

Flask 顯示串流影像

攝影機串流這篇介紹到可以將一張張影像串流出去,

boundary=--jpgboundary
指出後續的連續資料塊以 --jpgboundary 作為各單位資料區塊邊界
你也可以改用
boundary=frame
之後連續資料塊以 --frame 作為各單位資料區塊邊界

這邊我在 Ubuntu 系統下使用 pyscreenshot 來擷取螢幕的畫面,Windows 與 macOS 系統直接使用 PIL ImageGrab 即可

轉 bytes 方式有兩種,一種是先 seek(0) 再 read() 可以讀取 bytes 資料

1
2
3
4
img_buffer = BytesIO()
ImageGrab.grab().save(img_buffer, 'JPEG')
img_buffer.seek(0)
img_buffer.read() # bytes

另一種是直接 getvalue(),就不用 seek

1
2
3
img_buffer = BytesIO()
ImageGrab.grab().save(img_buffer, 'JPEG')
img_buffer.getvalue() # bytes

Ubuntu 遇到 IMageGrab 錯誤訊息的解決方法

在 Ubuntu 下執行時如果遇到 ImageGrab is macOS and Windows only 的錯誤訊息時,代表 ImageGrab 這個模組只支援 OS X 跟 Windows,

在 Linux 平台下可以用 pyscreenshot 模組來取代 ImageGrab,
把原本的

1
from PIL  import ImageGrab

替換成

1
import pyscreenshot as ImageGrab

這樣就可以了。

以上的完整原始碼放在我的 github 上。

其它參考
https://stackoverflow.com/questions/43520757/imagegrab-alternative-in-linux

其它相關文章推薦
Python Flask & OpenCV 即時串流 webcam 攝影機影像