1. 程式人生 > >vlc實現PC與樹莓派的視訊流傳輸

vlc實現PC與樹莓派的視訊流傳輸

目錄

一、使用vlc實現PC與樹莓派之間的視訊流傳輸

(一)Windows

  1. 安裝下載vlc
    裝的32位 本人用64位不ok

  2. 使用vlc
    開啟VLC
    媒體--> 流--> 捕獲裝置-->
    捕獲模式:DirectShow
    適配裝置名稱:
    音訊裝置名稱:
    點選 串流 -->下一步
    捕獲裝置
    進入流輸出設定介面
    新增UDP 輸入樹莓派ip
    流輸出設定介面


    在這裡插入圖片描述

(二)樹莓派

使用team viewer 在樹莓派上安裝vlc:
sudo apt-get update
sudo apt-get install vlc
在這裡插入圖片描述
開啟vlc
在這裡插入圖片描述
接收推流程式碼:
udp://@(樹莓派地址):(埠號)
eg: udp://@192.168.43.247:1234
在這裡插入圖片描述
在這裡插入圖片描述
選擇電腦中的視訊檔案
在這裡插入圖片描述
在這裡插入圖片描述

二、樹莓派與Windows系統之間的聊天

  1. 檢視ip地址
    開啟命令提示符cmd 用ipconfig檢視ip

  2. 編寫程式碼
    (1)windows上開啟

在這裡插入圖片描述
伺服器端:

import socket
host = '192.168.43.66'
port = 8090 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((host,port)) s.listen(5) sock,addr = s.accept() print('Connection built...') info = sock.recv(1024).decode() while info != 'exit': print('raspberry:'+info) send_mes = input() sock.send(send_mes.encode()) if send_mes =='exit'
: break info = sock.recv(1024).decode() sock.close() s.close()

在這裡插入圖片描述
(2)樹莓派上

在這裡插入圖片描述

  1. 開始聊天

在這裡插入圖片描述
在這裡插入圖片描述

三、非堵塞方式傳輸影象/視訊檔案

  1. 伺服器端:
    準備要傳輸的檔案

在這裡插入圖片描述

import socket
import os
import hashlib

server = socket.socket()
server.bind(("192.168.43.66",6969)) # 繫結監聽埠
server.listen(5)  # 監聽
print("監聽開始..")

while True:
    conn, addr = server.accept()  # 等待連線
    print("conn:", conn, "\naddr:", addr)  # conn連線例項
    while True:
        data = conn.recv(1024)  # 接收
        if not data:  # 客戶端已斷開
            print("客戶端斷開連線")
            break
        print("收到的命令:", data.decode("utf-8"))
        cmd, filename = data.decode("utf-8").split(" ")
        if cmd =="get":
            if os.path.isfile(filename):  # 判斷檔案存在

                # 1.先發送檔案大小,讓客戶端準備接收
                size = os.stat(filename).st_size  #獲取檔案大小
                conn.send(str(size).encode("utf-8"))  # 傳送資料長度
                print("傳送的大小:", size)

                # 2.傳送檔案內容
                conn.recv(1024)  # 接收確認
                m = hashlib.md5()
                f = open(filename, "rb")
                for line in f:
                    conn.send(line)  # 傳送資料
                    m.update(line)
                f.close()
                # 3.傳送md5值進行校驗
                md5 = m.hexdigest()
                conn.send(md5.encode("utf-8"))  # 傳送md5值
                print("md5:", md5)
server.close()

在這裡插入圖片描述

  1. 客戶端:
    新建 Client2.py
# 客戶端
import socket
import os
import hashlib

client = socket.socket()  # 生成socket連線物件

ip_port =("192.168.43.241", 6969)  # 地址和埠號

client.connect(ip_port)  # 連線

print("伺服器已連線")

while True:
    content = input(">>")
    if len(content)==0: continue  # 如果傳入空字元會阻塞
    if content.startswith("get"):
        client.send(content.encode("utf-8"))  # 傳送和接收都是bytes型別

        # 1.先接收長度,建議8192
        server_response = client.recv(1024)
        file_size = int(server_response.decode("utf-8"))
        print("接收到的大小:", file_size)

        # 2.接收檔案內容
        client.send("準備好接收".encode("utf-8"))  # 接收確認
        filename = "new" + content.split(" ")[1]

        f = open(filename, "wb")
        received_size = 0
        m = hashlib.md5()

        while received_size < file_size:
            size = 0  # 準確接收資料大小,解決粘包
            if file_size - received_size > 1024: # 多次接收
                size = 1024
            else:  # 最後一次接收完畢
                size = file_size - received_size
            data = client.recv(size)  # 多次接收內容,接收大資料
            data_len = len(data)
            received_size += data_len
            print("已接收:", int(received_size/file_size*100), "%")

            m.update(data)
            f.write(data)

        f.close()

        print("實際接收的大小:", received_size)  # 解碼

        # 3.md5值校驗
        md5_sever = client.recv(1024).decode("utf-8")
        md5_client = m.hexdigest()
        print("伺服器發來的md5:", md5_sever)
        print("接收檔案的md5:", md5_client)
        if md5_sever == md5_client:
            print("MD5值校驗成功")
        else:
            print("MD5值校驗失敗")
client.close()

執行 連線成功 輸入get p11.png
在這裡插入圖片描述
在這裡插入圖片描述
檢視接收的檔案
在這裡插入圖片描述
在這裡插入圖片描述