Video-Streaming vom Android-Gerät zum LAMP Server

ab diesem Punkt:http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-with-writing-to-the-file-system Ich versuche, eine Anwendung zum Speichern eines Videostreams von einer mobilen Kamera auf einem Remote-Server zu erstellen. (Ich habe einige Beispiele in Google Code für Android gefunden: ipcamera-for-android, spydroid-ipcamera, etc ..)

Ich habe hier und im Netzwerk einige Antworten gelesen, kann aber keine Lösung zum "Lesen" und Speichern des Datenstroms auf der Serverseite finden.

Meine Java-Kenntnisse sind mangelhaft, daher wäre es mir lieber, serverseitige Skripte in PHP zu erstellen (unter Verwendung von Server-Sockets oder anderem Material). Kann da jemand weiterhelfen?

AKTUALISIEREN

Mit meinen geringen Kenntnissen von Tools wie mplayer / ffmpeg mencorer kann ich den Videostream speichern ... zum Beispiel mit ipcamera-for-android und seinem Nanohttp-Server, der auf der Serverseite verwendet wird:

<code>ffmpeg-i "http://{ip of android phone}:8080/live.flv" /my/server/path/stream.flv
</code>

Kann jedoch nur im LAN verwendet werden, ich brauche diesen mobilen Verbindungsserver und nicht umgekehrt.

UPDATE 2

Einige Fortschritte bei der Verwendung dieses Skripts auf der Serverseite

<code>#!/usr/bin/php5
<?php
$handle = fopen("stream.3gp","w");
$socket = stream_socket_server("tcp://192.168.0.102:9000", $errno, $errstr);
if ($socket)
{
 echo "start listening\n";
 while ( $conn = stream_socket_accept($socket, 180))
  {
    echo "phone connected\n";
    while ($chunk = stream_socket_recvfrom($conn, 1500))
    {
        fwrite($handle,$chunk);
    }
  }
}

  fclose($handle);
  fclose($socket);
?>
</code>

Die 3GP-Datei ist jedoch noch nicht abspielbar.

UPDATE 3

<code>#!/usr/bin/php5
<?php


$socket = stream_socket_server("tcp://192.168.0.102:9000", $errno, $errstr);
$file = "saved.3gp";
$threegp_header = "\x00\x00\x00\x18\x66\x74\x79\x70\x33\x67\x70\x34\x00\x00\x03\x00\x33\x67\x70\x34\x33\x67\x70\x36";
$four_bytes = "\x00\x00\x00\x00";

if (!$socket) {

  echo "$errstr ($errno)\n";

} else {

  echo "server start listening\n";

  while ( $conn = @stream_socket_accept($socket, 180))
  {
        echo "phone connected\n";

    $handle = fopen($file,"w");

    //mediaRecorder gives invalid stream header, so I replace it discarding first 32 byte, replacing with 28 good byte (standard 3gp header plus 4 empty bytes)
    $discard = stream_get_contents($conn, 32);
    fwrite($handle, $threegp_header);
    fwrite($handle, $four_bytes);

    //then confinue to write stream on file until phone stop streaming
        while(!feof($conn))
        {
        fwrite($handle, stream_get_contents($conn, 1500));
        }
    echo "phone disconnected\n";
    fclose($handle);

    //then i had to update 3gp header (bytes 25 to 28) with the offset where moov atom starts
    $handle = fopen($file,"c"); 
    $output = shell_exec('grep -aobE "moov" '.$file);
    $moov_pos = preg_replace('/moov:(\d+)/i', '\\1', $output);
    $moov_pos_ex = strtoupper(str_pad(dechex($moov_pos - 24), 8, "0", STR_PAD_LEFT));
    fwrite($handle, $threegp_header);
    $tmp = '';
        foreach(str_split($moov_pos_ex,2) as $hex)
        {
                 $tmp .= pack('C*', hexdec($hex));
        }
    fwrite($handle, $tmp);
    fclose($handle);


  }
  echo "phone disconnected\n";


}
  @fclose($handle);
  fclose($socket);
?>
</code>

nach ein paar experimenten scheint diesmal vlc / mplayer das es abspielen kann .. noch einige probleme mit audio (aber ich denke ich habe etwas falsches auf der android seite)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage