這里寫自定義目錄標題
- 在兩臺設備上安裝必要軟件
- Wi-Fi Direct接收端IP(自動發現或靜態設置)
- 設置攝像頭參數
- 顯示初始化
- 網絡設置
系統架構概述
發送端樹莓派:捕獲視頻(攝像頭或視頻文件)→ 編碼 → 通過Wi-Fi Direct傳輸
接收端樹莓派:接收數據 → 解碼 → 在ST7789 LCD屏上顯示
準備工作
硬件需求
兩個樹莓派(建議3B+/4B)
攝像頭模塊(發送端)
ST7789 LCD屏(接收端)
電源供應
軟件需求
bash
復制
在兩臺設備上安裝必要軟件
sudo apt update
sudo apt install -y ffmpeg python3-pip git
pip3 install numpy gpiozero spidev st7789
第一部分:配置Wi-Fi Direct連接
- 在兩臺樹莓派上配置Wi-Fi Direct
編輯網絡配置文件:
bash
復制
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
添加以下內容(兩臺設備配置相同):
復制
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=USnetwork={ssid="DIRECT-RPi"mode=1frequency=2412key_mgmt=WPA-PSKpsk="raspberry"
}
重啟網絡服務:
bash
復制
sudo systemctl restart networking
或者
sudo systemctl restart NetworkManager
或者
sudo systemctl restart systemd-networkd
不同發行版使用的網絡服務不同,具體使用哪條指令,可以先通過以下指令確認當前使用的是哪個網絡管理工具:
sudo systemctl list-units --type=service | grep -E '(network|NetworkManager)'
- 驗證連接
在兩臺設備上執行:
bash
復制
sudo iw dev wlan0 scan | grep "DIRECT-RPi"
應該能看到彼此的設備。
第二部分:發送端設置(視頻采集和傳輸)
- 視頻采集腳本 sender.py
python
復制
import subprocess
import socket
import time
Wi-Fi Direct接收端IP(自動發現或靜態設置)
RECEIVER_IP = "192.168.4.2" # 典型Wi-Fi Direct IP
PORT = 5000
設置攝像頭參數
WIDTH, HEIGHT = 640, 480
FPS = 24
BITRATE = "500k"def start_stream():# 使用FFmpeg捕獲攝像頭并編碼為H.264ffmpeg_cmd = ['ffmpeg','-f', 'v4l2','-input_format', 'h264','-video_size', f'{WIDTH}x{HEIGHT}','-framerate', str(FPS),'-i', '/dev/video0','-c:v', 'copy', # 直接使用攝像頭硬件編碼'-f', 'h264','-']# 網絡傳輸設置soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 啟動FFmpeg進程process = subprocess.Popen(ffmpeg_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)try:while True:# 讀取FFmpeg輸出并發送data = process.stdout.read(1024)if not data:breaksoc.sendto(data, (RECEIVER_IP, PORT))except KeyboardInterrupt:process.terminate()soc.close()if __name__ == "__main__":start_stream()
第三部分:接收端設置(接收和顯示)
- 安裝顯示驅動庫
bash
復制
git clone https://github.com/pimoroni/st7789-python
cd st7789-python
sudo python3 setup.py install
- 接收和顯示腳本 receiver.py
python
復制
import socket
import subprocess
import threading
from PIL import Image
import st7789
import numpy as np
顯示初始化
disp = st7789.ST7789(height=240,width=240,rotation=90,port=0,cs=8,dc=24,rst=25,spi_speed_hz=80 * 1000 * 000
)
網絡設置
PORT = 5000
BUFFER_SIZE = 1024 * 8 # 8KB緩沖區def display_frame(frame_data):"""將接收到的幀數據顯示在LCD上"""try:# 轉換為PIL圖像(假設是RGB格式)img = Image.frombytes('RGB', (240, 240), frame_data)disp.display(img)except Exception as e:print(f"顯示錯誤: {e}")def receive_stream():sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)sock.bind(('0.0.0.0', PORT))# 使用FFmpeg解碼ffmpeg_cmd = ['ffmpeg','-i', '-', # 從stdin讀取'-f', 'rawvideo', # 輸出原始視頻幀'-pix_fmt', 'rgb24','-s', '240x240', # 調整為屏幕分辨率'-']process = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)while True:data, _ = sock.recvfrom(BUFFER_SIZE)if data:process.stdin.write(data)# 從FFmpeg讀取解碼后的幀frame = process.stdout.read(240*240*3) # RGB 240x240if frame:display_frame(frame)if __name__ == "__main__":receive_stream()
優化方案
- 降低延遲技巧
發送端:
python
復制
ffmpeg_cmd = ['ffmpeg','-fflags', 'nobuffer', # 減少輸入緩沖'-flags', 'low_delay', # 低延遲模式'-tune', 'zerolatency', # 零延遲調優# ...其他參數
]
接收端:python
復制
disp = st7789.ST7789(# ...其他參數spi_speed_hz=120 * 1000 * 1000 # 提高SPI速度
)
- 自動發現IP地址
在兩臺設備上添加:
python
復制
import netifacesdef get_wifi_direct_ip():try:return netifaces.ifaddresses('p2p-wlan0-0')[netifaces.AF_INET][0]['addr']except:return None
常見問題解決
連接不穩定:
縮短設備間距離
嘗試不同頻道:sudo iwconfig wlan0 channel 6
視頻卡頓:
降低分辨率:改為320x240
降低幀率:15FPS
減少比特率:“300k”
顯示異常:
檢查SPI連接
確認ST7789初始化參數正確
降低SPI速度測試
最終啟動流程
發送端:
bash
復制
python3 sender.py
接收端:
bash
復制
python3 receiver.py
這個方案實現了從攝像頭采集到無線傳輸再到屏幕顯示的全流程,你可以根據需要調整視頻參數和顯示設置。