在Python中使用pygame通过套接字串流出错

2 投票
1 回答
1669 浏览
提问于 2025-04-18 01:46

我正在用Python编写一个网络摄像头的脚本,这个脚本是我从网上找到的。我使用了pygame这个模块,代码如下:

import socket

import pygame

import sys


port=5014


#create pygame screen

screen = pygame.display.set_mode((800,600),0)


while True:

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(("",port)) # server is available on the whole network by setting host to ""

s.listen(1)

connection, addr = s.accept()

received = []


# loop .recv, it returns empty string when done, then transmitted data is completely received

while True:

    recvd_data = connection.recv(1440021)

    if not recvd_data:

        break

    else:

        received.append(recvd_data)



dataset = ''.join(received)

image = pygame.image.fromstring(dataset,(800,600),"RGB") # convert received image from string

#image = pygame.transform.scale(image,(800,600)) # scale image to 800*600

screen.blit(image,(0,0)) # "show image" on the screen

pygame.display.update()


# check for quit events

for event in pygame.event.get():

    if event.type == pygame.QUIT:

        pygame.quit()

        sys.exit()

客户端的代码是:

    import socket

    import pygame

    import pygame.camera

    import sys

    import time




   host = "localhost"

   port = 5014



   pygame.init()

   pygame.camera.init()


    cam_list = pygame.camera.list_cameras() # list available cameras

    webcam = pygame.camera.Camera(cam_list[0],(800,600)) # use first camera in list and set resolution

    webcam.start() # start camera


    while True:

    image = webcam.get_image() # capture image

    data = pygame.image.tostring(image,"RGB") # convert captured image to string, use RGB color scheme

    #print sys.getsizeof(data) # in case somebody wants to know the size of the captured   image


    # prepare for connection to server

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP is used

    s.connect((host, port))

    s.sendall(data)

    s.close()

    time.sleep(0.1)

在服务器上我遇到的错误是:

    Traceback (most recent call last):
  File "/root/Desktop/serv.py", line 29, in <module>
    image = pygame.image.fromstring(dataset,(800,600),"RGB") # convert received image from string
ValueError: String length does not equal format and resolution size

而在客户端我遇到的错误是:

Traceback (most recent call last):
  File "/root/Desktop/cli.py", line 28, in <module>
    s.sendall(data)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 104] Connection reset by peer

有没有人知道可能出了什么问题?

1 个回答

0

我之前用的是一样的代码,也遇到了类似的错误,解决办法是把摄像头的分辨率调低,因为我的摄像头无法处理800x600的分辨率。

我还把“服务器”和“客户端”进行了调整,让摄像头服务器像“套接字服务器”那样工作。

试试下面的代码,确保你的视频设置正确。在我的例子中是“/dev/video0”,你可能需要用不同的路径。先启动摄像头服务器。

摄像头服务器:

import socket
import pygame
import pygame.camera
import sys
import time

port = 5000
pygame.init()

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(("",port))
serversocket.listen(1)

pygame.camera.init()
webcam = pygame.camera.Camera("/dev/video0",(320,240))
webcam.start()

while True:
        connection, address = serversocket.accept()
        image = webcam.get_image() # capture image
        data = pygame.image.tostring(image,"RGB") # convert captured image to string, use RGB color scheme
        connection.sendall(data)
        time.sleep(0.1)
        connection.close()

客户端服务器:

import socket
import pygame
import sys

host = "10.0.0.13"
port=5000
screen = pygame.display.set_mode((320,240),0)


while True:
    clientsocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientsocket.connect((host, port))
    received = []
    # loop .recv, it returns empty string when done, then transmitted data is completely received
    while True:
        #print("esperando receber dado")
        recvd_data = clientsocket.recv(230400)
        if not recvd_data:
            break
        else:
            received.append(recvd_data)

    dataset = ''.join(received)
    image = pygame.image.fromstring(dataset,(320,240),"RGB") # convert received image from string
    screen.blit(image,(0,0)) # "show image" on the screen
    pygame.display.update()

    # check for quit events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

撰写回答