2012-04-09 20 views
6

इस बिंदु से शुरू होने वाली वीडियो स्ट्रीमिंग: http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system मैं मोबाइल कैमरा से रिमोट सर्वर पर वीडियो स्ट्रीम सहेजने के लिए एक एप्लिकेशन बनाने की कोशिश कर रहा हूं। (मुझे एंड्रॉइड भाग के लिए Google कोड में कई उदाहरण मिले: ipcamera-for-android, spydroid-ipcamera, आदि ..)एंड्रॉइड डिवाइस से लैंप सर्वर

मैंने नेटवर्क के आसपास और आसपास कुछ जवाब पढ़े, लेकिन इस बारे में समाधान नहीं मिला "पढ़ें" और सर्वर की तरफ डेटा की धारा को सहेजें।

जावा का मेरा ज्ञान खराब है, इसलिए मैं PHP में सर्वर-साइड स्क्रिप्ट (सर्वर सॉकेट या अन्य सामानों का उपयोग करके) बनाने में सक्षम हूं। कोई इस भाग में मदद कर सकता है?

अद्यतन

ऐसे MPlayer/ffmpeg mencorer मैं वीडियो स्ट्रीम को बचाने में सफल रहा हूँ के रूप में उपकरणों की मेरी छोटी ज्ञान का उपयोग कर ... उदाहरण के लिए सर्वर पर का उपयोग कर ipcamera के लिए एंड्रॉयड और उसके nanohttp सर्वर का उपयोग पक्ष:

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

हालांकि, केवल लैन, में इस्तेमाल किया जा सकता है कि मैं मोबाइल कनेक्ट सर्वर और नहीं viceversa की जरूरत है।

अद्यतन 2

कुछ प्रगति .. सर्वर साइड पर इस स्क्रिप्ट

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

हालांकि, 3gp फ़ाइल को अभी तक चलाया जा सकता है का उपयोग करते हुए ..

अद्यतन 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); 
?> 

कुछ प्रयोगों के बाद, इस बार वीएलसी/एम प्लेयर .. कि यह खेल सकते हैं लगता है अभी भी ऑडियो के साथ कुछ समस्या है (लेकिन मुझे लगता है कि मैं कुछ एंड्रॉयड पक्ष पर गलत है)

+1

उस अद्यतन जानकारी के साथ, नीचे मेरा उत्तर बहुत उपयोगी नहीं है। Ffmpeg/mplayer समाधान सबसे अच्छा लगता है। मैं अनुशंसा करता हूं कि लैन मुद्दे का एक संभावित समाधान वीपीएन या एसएसएच सुरंग स्थापित करना है ... समझने के साथ यह केवल एक बार चीज है/केवल आपके लिए। – TryTryAgain

+0

वैसे भी धन्यवाद, मुझे सर्वर की तरफ आउटबाउंड कनेक्शन और stream_socket_server का उपयोग करके समाधान ढूंढने की उम्मीद है –

उत्तर

3

आप शायद PHP के server socket functionality का उपयोग करना चाहते करने जा रहे हैं ।

Here's a handy tutorial जो डेटा स्ट्रीमिंग को लागू करने के लिए आपको क्या करना है, उसके माध्यम से जाता है।

0

भेजे धारा (प्रोटोकॉल, आदि) के आधार पर आप समाप्त हो गया या का उपयोग करते हुए अंत करना चाहते हैं:

मुझे यकीन है कि तुम क्या उपयोग करने के लिए तैयार हैं नहीं कर रहा हूँ/दीप, या क्या पर स्थापित आप पसंद करेंगे, लेकिन मुझे पता है कि वीएलसी आसानी से आने वाली धारा को पकड़ सकता है।

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

बेशक

, कमांड लाइन केवल वीएलसी के संस्करण शायद तुम क्या चाहते है। मैंने कभी यह नहीं किया है, यह सुनिश्चित नहीं है कि यह कैसे काम करता है, मुझे उम्मीद है कि यह अतिरिक्त पैकेजों का मीट्रिक टन इंस्टॉल नहीं करेगा। संभावित चिंताओं से संबंधित टी his is something to look at

संबंधित मुद्दे