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)
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
grazie comunque, spero di trovare una soluzione usando la connessione in uscita e stream_socket_server sul lato server –