1
votes

I'm currently writing a project using Raspberry pi and mobile (Android). I have problem to send data from Camera Rpi to Android App.

I'm using library Picamera on python: https://picamera.readthedocs.io/en/release-1.13/recipes1.html#recording-to-a-network-stream .

My actual code on Rpi looks something like this:

import socket
import time
import picamera

camera = picamera.PiCamera()
camera.resolution = (640, 480)
camera.framerate = 24

server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 8000))
server_socket.listen(0)

# Accept a single connection and make a file-like object out of it
connection = server_socket.accept()[0].makefile('wb')
try:
    camera.start_recording(connection, format='h264')
    camera.wait_recording(60)
    camera.stop_recording()
finally:
    connection.close()
    server_socket.close()

To receive stream we can use: tcp/h264://x.x.x.x:8000 . It works on PC when I used vlc.

On Android I try use VideoView or ExoPlayer, but problem is with URI because, android can't parse tcp/h264 protocol.

When I try stream using vlc:

raspivid -o - -t 99999 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8000}' :demux=h264

It works on Android if I pass url with prefix http:// but is not from my program on python.

It seems to me that I have 2 ways.

  1. On python use different way to stream video output.
  2. Somehow handle protocol tcp/h264 (probably used socket and independently parse stream bytes to video). It is possible: https://github.com/ShawnBaker/RPiCameraViewer but i am looking for better (not low level) solution.
1

1 Answers

0
votes

You can stream it from python easily, just use

import subprocess
subprocess.Popen("raspivid -o - -t 99999 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8000}' :demux=h264", shell=True)

This will launch it in a different thread, so it won't be blocking your program/