2012-04-09 29 views
6

bu noktadan başlayarak: http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system Bir video akışını mobil kameradan uzak bir sunucuya kaydetmek için bir uygulama oluşturmaya çalışıyorum. (Ben android bölümü için google kodunda çeşitli örnekler bulundu: ipcamera-için-android, SpyDroid-ipcamera vb ..)Android cihazından LAMP Sunucusu'na akan video LAMP Sunucusu

Burada ve ağ etrafında bazı cevaplar okudum ama hakkında çözüm bulamıyor "Oku" ve sunucu tarafındaki veri akışını kaydedin.

Java hakkındaki bilgim zayıftır, bu yüzden PHP'de sunucu tarafı komut dosyası oluşturabilirim (sunucu soketleri veya başka şeyler kullanarak). Birisi bu kısımda yardımcı olabilir mi? sunucuda kullanmak için-android ipcamera-ve nanohttp sunucusunu kullanarak örneğin ... böyle ben video akışı tasarruf edebildi kulüpler mencorer mplayer/ffmpeg gibi araçlarla benim küçük bilgileri kullanarak

GÜNCELLEME

yan:

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

, sadece LAN, kullanılabilir o mobil bağlantı sunucu değil viceversa gerekir.

GÜNCELLEME

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

Ancak 3gp dosyası henüz oynanabilir değil sunucu tarafında bu komut dosyası kullanılarak 2

bazı ilerlemeler .. ..

GÜNCELLEME 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); 
?> 
Bazı deneylerden sonra, bu sefer vlc/mplayer oynayabilir gibi görünüyor .. hala ses ile bazı problemler (ama ben android tarafında yanlış bir şey var düşünüyorum)

+1

Bu güncellenmiş bilgilerle, aşağıdaki cevabım çok yardımcı olmuyor. Ffmpeg/mplayer çözümü en iyi şekilde görünüyor. Tavsiye ederim, LAN sorununa olası bir çözüm VPN'yi veya bir SSH tünelini kurmaktır ... bu, sizin için tek bir şeydir. – TryTryAgain

+0

Yine de teşekkürler, sunucu tarafında giden bağlantı ve stream_socket_server kullanarak çözüm bulmayı umuyorum –

cevap

0

gelen akımın (protokol, vb) bağlı olarak sona erdi kullanarak veya bitirmek istiyorum ettik:

Ben kullanmak isteyen emin değilim/LAMP, ya da ne yüklemek Tercih edersiniz, ama VLC'nin gelen akışı kolayca yakalayabileceğini biliyorum. Tabii

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

, VLC Komut Satırı sadece versiyon istediğini olasılıkla gerçek değildir. Bunu hiç yapmadım, bunun nasıl çalıştığından emin değilim, umarım bir paket daha fazla paket yüklemez. Olası endişeler ile ilgili olarak T his is something to look at.

İlgili konular