【发布时间】:2020-06-11 11:49:40
【问题描述】:
我需要在 Android 上播放 RTSP 流,该应用程序在计算机上运行良好,但在 Android 上,只要我按下 RTSP 流按钮,它就会崩溃。
我使用 buildozer 构建了应用程序,构建运行良好。
main.py
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.graphics.texture import Texture
from kivy.clock import Clock
import pygame
import threading
import udpclient
from udpclient import UDPClient
import ps4_joystick2
from ps4_joystick2 import Joystick
import time
import cv2
class GUI(App):
rtspCamera = 'rtsp://{ip}:5000/rtsp-restream'
usbCamera = 'rtsp://{ip}:5000/usb-stream'
def build(self):
self.stopped = True
self.capture = False
self.event = False
self.udp_client = False
print("ok")
self.camera = None
self.controls = False
self.joystick = False
self.img1 = Image()
layout_secondary = GridLayout(size_hint_y=0.5, cols=2)
btnExitStream = Button(text='Stop Camera')
btnExitStream.bind(on_press=self.exitCamera)
layout_secondary.add_widget(btnExitStream)
btnStartRTSPStream = Button(text='Start RTSP')
btnStartRTSPStream.bind(on_press=self.RTSPCameraBTN)
layout_secondary.add_widget(btnStartRTSPStream)
btnStartUDPStream = Button(text='Start USB')
btnStartUDPStream.bind(on_press=self.UDPCameraBTN)
layout_secondary.add_widget(btnStartUDPStream)
layout_primary = BoxLayout(orientation='vertical')
layout_primary.add_widget(self.img1)
layout_primary.add_widget(layout_secondary)
return layout_primary
def fetchIP(self, dt=None):
if not self.udp_client:
self.udp_client = UDPClient('Removed for stackoverflow', 5005, 1024, 0.3)
if self.udp_client:
self.udp_client.fetchIP()
if self.udp_client.saved_ip != None:
return self.udp_client.saved_ip
return False
def updateControls(self,):
if self.joystick ==None:
self.joystick = Joystick()
while True:
if self.joystick.my_joystick == None:
self.joystick.reconnectJoystick()
self.udp_client.transfer(self.joystick.control())
def updatePicture(self,dt):
if not self.capture.isOpened():
print("n")
else:
print("y")
if not self.stopped:
ret, frame = self.capture.read()
if ret:
print("upd4")
buf1 = cv2.flip(frame, 0)
buf = buf1.tostring()
texture1 = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
texture1.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
self.img1.texture = texture1
def exitCamera(self, dt):
self.stopped = True
if self.capture:
self.capture.release()
self.capture = False
if self.event:
self.event.cancel()
def startCamera(self,camera):
ip = self.fetchIP()
if ip:
formatted = camera.format(ip=ip)
if self.stopped:
if not self.capture:
try:
print(1)
print(cv2.getBuildInformation())
self.capture = cv2.VideoCapture(formatted)
self.capture.set(cv2.CAP_PROP_BUFFERSIZE, 3)
self.stopped = False
print(camera)
self.event = Clock.schedule_interval(self.updatePicture, 1.0/(25))
except Exception as e:
print(e)
self.network = Clock.schedule_interval(self.fetchIP, 5)
#else:
# self.exitCamera(None)
# self.startCamera(camera)
#if self.controls == None:
# self.controls = threading.Thread(target=self.updateControls)
# self.controls.setDaemon(True)
# self.controls.start()
def RTSPCameraBTN(self, dt):
self.camera = self.rtspCamera
self.startCamera(self.rtspCamera)
def UDPCameraBTN(self, dt):
self.camera = self.usbCamera
self.startCamera(self.usbCamera)
if __name__ == '__main__':
GUI().run()
pygame.quit()
日志猫
6-11 14:18:32.456 16092 16132 I python : [INFO ] [Window ] Provider: sdl2
06-11 14:18:32.474 16092 16132 E libEGL : validate_display:92 error 3008 (EGL_BAD_DISPLAY)
06-11 14:18:32.475 16092 16132 V SDL : setOrientation() orientation=-1 width=800 height=600 resizable=true hint=
06-11 14:18:32.481 16092 16132 I python : [INFO ] [GL ] Using the "OpenGL ES 2" graphics system
06-11 14:18:32.483 16092 16132 I python : [INFO ] [GL ] Backend used <sdl2>
06-11 14:18:32.484 16092 16132 I python : [INFO ] [GL ] OpenGL version <b'OpenGL ES 3.2 V@331.0 (GIT@365e321, I294de8bafa) (Date:01/08/19)'>
06-11 14:18:32.484 16092 16132 I python : [INFO ] [GL ] OpenGL vendor <b'Qualcomm'>
06-11 14:18:32.485 16092 16132 I python : [INFO ] [GL ] OpenGL renderer <b'Adreno (TM) 530'>
06-11 14:18:32.485 16092 16132 I python : [INFO ] [GL ] OpenGL parsed version: 3, 2
06-11 14:18:32.485 16092 16132 I python : [INFO ] [GL ] Texture max size <16384>
06-11 14:18:32.486 16092 16132 I python : [INFO ] [GL ] Texture max units <16>
06-11 14:18:32.520 16092 16132 I python : [INFO ] [Window ] auto add sdl2 input provider
06-11 14:18:32.521 16092 16132 I python : [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
06-11 14:18:32.660 16092 16132 I python : [WARNING] [Base ] Unknown <android> provider
06-11 14:18:32.660 16092 16132 I python : [INFO ] [Base ] Start application main loop
06-11 14:18:32.665 16092 16132 I python : [INFO ] [GL ] NPOT texture support is available
06-11 14:18:33.667 16092 16132 I python :
06-11 14:18:33.676 16092 16132 F libc : Fatal signal 7 (SIGBUS), code 0 (SI_USER) in tid 16132 (SDLThread), pid 16092 (org.test.myapp)
06-11 14:18:33.678 16092 16132 F libc : failed to write crash info: Bad address
06-11 14:18:33.717 15386 15882 I ActivityManager: Process org.test.myapp (pid 16092) has died: fore TOP
06-11 14:18:33.667 16092 16132 I python :
06-11 14:18:33.718 15386 15423 W libprocessgroup: kill(-16092, 9) failed: No such process
06-11 14:18:33.718 15386 15882 W ActivityManager: Force removing ActivityRecord{bb8a9cd u0 org.test.myapp/org.kivy.android.PythonActivity t5950}: app died, no saved state
OpenCV 构建信息 我怀疑这是问题所在,因为它不支持 Video I/O https://pastebin.com/DU80Br0B
buildozer.spec https://pastebin.com/pdbXh48t
【问题讨论】:
标签: android python-3.x opencv kivy buildozer