2012-04-09 17 views
6

a partire da questo punto: http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system Sto provando a creare un'applicazione per salvare un flusso video da una videocamera mobile a un server remoto. (Ho trovato diversi esempi nel codice google per Android: ipcamera-per-android, spydroid-ipcamera, ecc.)Streaming video da dispositivo Android a LAMP Server

Ho letto alcune risposte qui e in giro per la rete, ma non riesco a trovare la soluzione su come "leggi" e salva il flusso di dati sul lato server.

La mia conoscenza di java è scadente, quindi preferirei creare script sul lato server in PHP (utilizzando socket del server o altro). Qualcuno può aiutare su questa parte?

UPDATE

usando la mia poca conoscenza di strumenti come mplayer/ffmpeg mencorer sono in grado di salvare il flusso video ... per esempio usando ipcamera-per-Android e il relativo server nanohttp utilizzando il server di lato:

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

Tuttavia, può essere utilizzato solo in LAN, ho bisogno che mobili server Connect e non viceversa.

UPDATE 2

alcuni progressi .. utilizzando questo script sul lato server

#!/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); 
?> 

tuttavia, il file 3gp non è ancora giocabile ..

UPDATE 3

#!/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); 
?> 

dopo alcuni esperimenti, questa volta vlc/mplayer sembra in grado di riprodurlo .. ancora qualche problema con l'audio (ma penso di avere qualcosa di sbagliato su Android)

+1

Con le informazioni aggiornate, la mia risposta di seguito non è molto utile. La soluzione ffmpeg/mplayer sembra la migliore. Vorrei raccomandare, una possibile soluzione al problema della LAN è di configurare VPN o un tunnel SSH ... con la consapevolezza che questa è una cosa una tantum/solo per te. – TryTryAgain

+0

grazie comunque, spero di trovare una soluzione usando la connessione in uscita e stream_socket_server sul lato server –

risposta

0

A seconda del flusso in entrata (protocollo, ecc) si sono finito o vuoi finire con:

io non sono sicuro di quello che si è disposti a utilizzare/installare sulla lampada, o cosa preferiresti, ma so che VLC può facilmente catturare un flusso in entrata.

http://wiki.videolan.org/Documentation:Streaming_HowTo/Receive_and_Save_a_Stream

Naturalmente, la riga di comando unica versione di VLC è probabilmente quello che si vuole. Non l'ho mai fatto, non sono sicuro di come funzioni, spero che non installi una tonnellata di pacchetti extra. T his is something to look at su possibili problemi.