本篇 ShengYu 要介紹使用 Python Flask 螢幕分享的作法,完成後就可以將你的桌面螢幕利用網頁的方式串流影像出去,其它使用者只需要一個瀏覽器就可以看你的螢幕分享(電腦或手機或平板)。
在之前的文章中曾經介紹過 Python Flask 的網頁開發、攝影機串流以及螢幕截圖,今天來點不一樣的,來作個螢幕分享的功能吧!
本篇所使用到的 Python 模組有
- Flask
- pyscreenshot (Linux)
- PIL ImageGrab (Windows and macOS)
顯示圖片的 Flask 網頁
基於之前的 Flask 系列文章介紹,可以透過下列的程式碼簡單的建立一個網頁並顯示一張圖片,
1 | <html> |
之前介紹過 Flask 使用 template 的方式了,這邊就直接使用吧!1
2
3
4
5
6
7
8
9
10import flask
app = flask.Flask(__name__)
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
4img_buffer = BytesIO()
ImageGrab.grab().save(img_buffer, 'JPEG')
img_buffer.seek(0)
img_buffer.read() # bytes
另一種是直接 getvalue(),就不用 seek1
2
3img_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