【问题标题】:How do I view RTSP stream using OpenCV and Kivy on android如何在 Android 上使用 OpenCV 和 Kivy 查看 RTSP 流
【发布时间】: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


    【解决方案1】:

    根据this,目前还没有计划在Android中支持ffmpeg

    没有计划使用 FFmpeg(它是 LGPL)构建 Android 包。

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      相关资源
      最近更新 更多