兩個樹莓派如何通過wifi direct傳輸視頻并顯示

這里寫自定義目錄標題

  • 在兩臺設備上安裝必要軟件
  • 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連接

  1. 在兩臺樹莓派上配置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)'
  1. 驗證連接
    在兩臺設備上執行:

bash
復制

sudo iw dev wlan0 scan | grep "DIRECT-RPi"

應該能看到彼此的設備。

第二部分:發送端設置(視頻采集和傳輸)

  1. 視頻采集腳本 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()

第三部分:接收端設置(接收和顯示)

  1. 安裝顯示驅動庫
    bash
    復制
git clone https://github.com/pimoroni/st7789-python
cd st7789-python
sudo python3 setup.py install
  1. 接收和顯示腳本 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()

優化方案

  1. 降低延遲技巧
    發送端:

python
復制

ffmpeg_cmd = ['ffmpeg','-fflags', 'nobuffer',  # 減少輸入緩沖'-flags', 'low_delay',  # 低延遲模式'-tune', 'zerolatency', # 零延遲調優# ...其他參數
]
接收端:python
復制
disp = st7789.ST7789(# ...其他參數spi_speed_hz=120 * 1000 * 1000  # 提高SPI速度
)
  1. 自動發現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
這個方案實現了從攝像頭采集到無線傳輸再到屏幕顯示的全流程,你可以根據需要調整視頻參數和顯示設置。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77548.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu22.04安裝ROS2 humble

參考: https://zhuanlan.zhihu.com/p/702727186 前言: 筆記本安裝了ubuntu20.04安裝ros一直失敗,于是將系統升級為ununut22.04,然后安裝ros,根據上面的教程,目前看來是有可能成功的。 系統升級為ununut…

Python 類型轉換詳解

文章目錄 Python 類型轉換詳解基本類型轉換函數1. 轉換為整數 (int())2. 轉換為浮點數 (float())3. 轉換為字符串 (str())4. 轉換為布爾值 (bool()) 容器類型轉換1. 轉換為列表 (list())2. 轉換為元組 (tuple())3. 轉換為集合 (set())4. 轉換為字典 (dict()) 特殊類型轉換1. AS…

【Python Requests 庫詳解】

目錄 簡介一、安裝與導入安裝導入 二、發送 HTTP 請求1. GET 請求基本請求URL 參數 2. POST 請求表單數據提交JSON 數據提交文件上傳 3. 其他方法PUT 請求示例DELETE 請求示例 三、處理響應1. 響應內容解析文本內容處理二進制內容處理JSON 數據處理 2. 響應狀態與頭信息狀態碼檢…

【Python 開源】你的 Windows 關機助手——PyQt5 版定時關機工具

🖥? 你的 Windows 關機助手——PyQt5 版定時關機工具 相關資源文件已經打包成EXE文件,可雙擊直接運行程序,且文章末尾已附上相關源碼,以供大家學習交流,博主主頁還有更多Python相關程序案例,秉著開源精神的…

【MySQL】002.MySQL數據庫基礎

文章目錄 數據庫基礎1.1 什么是數據庫1.2 基本使用創建數據庫創建數據表表中插入數據查詢表中的數據 1.3 主流數據庫1.4 服務器,數據庫,表關系1.5 MySQL架構1.6 SQL分類1.7 存儲引擎1.7.1 存儲引擎1.7.2 查看存儲引擎1.7.3 存儲引擎對比 前言&#xff1a…

滑動窗口(3)—無重復字符的最長子串

文章目錄 題目解析方法一:滑動窗口解法二(暴?求解)(不會超時,可以通過):附Java代碼 力扣題目:無重復字符的最長子串 題目解析 方法一:滑動窗口 思路和算法 我們先用一…

C++字符串操作詳解

引言 字符串處理是編程中最常見的任務之一,而在C中,我們有多種處理字符串的方式。本文將詳細介紹C中的字符串操作,包括C風格字符串和C的string類。無論你是C新手還是想鞏固基礎的老手,這篇文章都能幫你梳理字符串處理的關鍵知識點…

Vulhub-DC-4靶場通關攻略

下載地址:https://www.vulnhub.com/entry/dc-4,313/ 掃描IP地址 arp-sacn -l掃描端口,開啟了80和22端口 nmap -p- 192.168.112.140訪問80端口 掃描目錄,并沒有發現敏感目錄 嘗試爆破 爆破成功,用戶名admin 密碼happy 登錄成功 …

OfficePlus去掉PDF文件右鍵菜單里的PDF轉換

今天在吾愛破解論壇看到一個求助帖,說是OfficePlus,安裝后,PDF文件的右鍵菜單里多了PDF轉換,想去掉,不知道怎么弄。底下的回復基本都是百度復制或者AI搜索出的答案,大致就是找注冊表里CLASSID下的菜單欄相關…

大模型本地部署系列(3) Ollama部署QwQ[阿里云通義千問]

大家好,我是AI研究者, 今天教大家部署 一個阿里云通義千問大模型。 QwQ大模型簡介 QwQ是由阿里云通義千問(Qwen)團隊推出的開源推理大模型,專注于提升AI在數學、編程和復雜邏輯推理方面的能力。其核心特點包括&#x…

微信小程序學習實錄12:掌握大數據量軌跡展示的MySQL結構設計

獲取經緯度信息后,mysql建立數據表po_trajectory,字段包含tra_id、longitude、latitude、tra_time和openid。 為微信小程序創建的 po_trajectory 數據表,字段包含 tra_id、longitude、latitude、tra_time 和 openid,從結構設計上…

計算機系統---性能指標(3)續航與散熱

計算機電池續航的性能指標 一、電池基礎物理指標 電池容量(核心指標) 單位: 毫安時(mAh):常見于手機/平板,反映電池存儲電荷量,需結合電壓計算實際能量(如3.7V電池&…

貪心算法之最小生成樹問題

1. 貪心算法的基本思想 貪心算法在每一步都選擇局部最優的邊,希望最終得到整體最優的生成樹。常見的兩種 MST 算法為 Kruskal 算法 和 Prim 算法。這兩者均滿足貪心選擇性質和最優子結構性質,即: 貪心選擇性質:局部最優選擇&…

LeetCode hot 100—編輯距離

題目 給你兩個單詞 word1 和 word2, 請返回將 word1 轉換成 word2 所使用的最少操作數 。 你可以對一個單詞進行如下三種操作: 插入一個字符刪除一個字符替換一個字符 示例 示例 1: 輸入:word1 "horse", word2 &q…

2.3 Spark運行架構與流程

Spark運行架構與流程包括幾個核心概念:Driver負責提交應用并初始化作業,Executor在工作節點上執行任務,作業是一系列計算任務,任務是作業的基本執行單元,階段是一組并行任務。Spark支持多種運行模式,包括單…

NO.82十六屆藍橋杯備戰|動態規劃-從記憶化搜索到動態規劃|下樓梯|數字三角形(C++)

記憶化搜索 在搜索的過程中,如果搜索樹中有很多重復的結點,此時可以通過?個"備忘錄",記錄第?次搜索到的結果。當下?次搜索到這個結點時,直接在"備忘錄"??找結果。其中,搜索樹中的?個?個結點…

使用 VBA 宏創建一個選擇全部word圖片快捷指令,進行圖片格式編輯

使用 VBA 宏批量選擇圖片 ? 第一步:創建 .dotm 加載項文件 1、使用環境 office word 365,文件格式為.docx 圖片格式為.PNG 2、創建 .dotm 加載項文件 打開 Word,新建一個空白文檔。 按下 Alt F11 打開 VBA 編輯器。 點擊菜單欄&#xff…

深度學習的下一個突破:從圖像識別到情境理解

引言 過去十年,深度學習在圖像識別領域取得了驚人的突破。從2012年ImageNet大賽上的AlexNet,到后來的ResNet、EfficientNet,再到近年來Transformer架構的崛起,AI已經能在許多任務上超越人類,比如人臉識別、目標檢測、醫…

使用dyn4j做碰撞檢測

文章目錄 前言一、環境準備添加依賴基本概念 二、實現步驟1.創建世界2.添加物體3.設置碰撞監聽器4.更新世界 三、完整代碼示例四、優化補充總結 前言 dyn4j 提供了高效的碰撞檢測和物理模擬功能,適用于游戲開發、動畫制作以及其他需要物理交互的場景。通過簡單的 A…

VS Code settings.json 文件中常用的預定義變量?及其用途說明

VS Code settings.json 常用預定義變量 以下是 Visual Studio Code 配置文件中常用的預定義變量列表: 1. 工作區相關變量 變量描述示例值${workspaceFolder}當前工作區根目錄的絕對路徑C:/projects/my-project${workspaceFolderBasename}工作區文件夾名稱&#x…