2012-04-09 36 views
6

bắt đầu từ điểm này: http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system Tôi đang cố gắng tạo một ứng dụng để lưu luồng video từ máy ảnh di động đến máy chủ từ xa. (Tôi tìm thấy một số ví dụ trong mã google cho phần android: ipcamera-for-android, spydroid-ipcamera, v.v.)Phát trực tuyến video từ thiết bị Android đến LAMP Server

Tôi đọc một số câu trả lời ở đây và trên mạng, nhưng không thể tìm thấy giải pháp về cách "đọc" và lưu luồng dữ liệu ở phía máy chủ.

Kiến thức về java của tôi kém, vì vậy tôi muốn có thể tạo tập lệnh phía máy chủ trong PHP (sử dụng ổ cắm máy chủ hoặc các nội dung khác). Ai đó có thể giúp về phần này?

CẬP NHẬT

sử dụng ít kiến ​​thức của tôi về các công cụ như mplayer/ffmpeg mencorer Tôi có thể lưu các dòng video ... ví dụ sử dụng ipcamera-cho-android và máy chủ nanohttp của nó sử dụng trên máy chủ bên:

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

Tuy nhiên, chỉ có thể được sử dụng trong LAN, Tôi cần máy chủ kết nối di động đó chứ không phải máy chủ.

CẬP NHẬT 2

Một số tiến bộ .. sử dụng script này trên phía máy chủ

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

Tuy nhiên, 3gp tập tin chưa chơi ..

CẬP NHẬT 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); 
?> 

sau khi một số thí nghiệm, thời gian này vlc/mplayer dường như có thể chơi nó .. vẫn còn một số vấn đề với âm thanh (nhưng tôi nghĩ rằng tôi đã có một cái gì đó sai trên bên android)

+1

Với thông tin được cập nhật đó, câu trả lời của tôi dưới đây không hữu ích lắm. Giải pháp ffmpeg/mplayer có vẻ tốt nhất. Tôi muốn giới thiệu, một giải pháp khả thi cho vấn đề mạng LAN là cài đặt VPN hoặc đường hầm SSH ... với sự hiểu biết đây là điều một lần/chỉ dành cho bạn. – TryTryAgain

+0

cảm ơn anyway, tôi hy vọng sẽ tìm thấy giải pháp bằng cách sử dụng kết nối gửi đi và stream_socket_server trên phía máy chủ –

Trả lời

0

Tùy thuộc vào dòng đến (giao thức, vv) bạn đã kết thúc hoặc muốn kết thúc bằng:

Tôi không chắc chắn những gì bạn sẵn sàng để sử dụng/cài đặt trên LAMP, hoặc những gì bạn muốn, nhưng tôi biết VLC có thể dễ dàng nắm bắt một dòng đến.

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

Tất nhiên, phiên bản dòng lệnh của VLC có lẽ là những gì bạn muốn. Tôi chưa bao giờ thực hiện nó, không chắc chắn cách thức hoạt động, tôi hy vọng nó sẽ không cài đặt một tấn các gói phụ. T his is something to look at liên quan đến các mối quan ngại có thể xảy ra.

Các vấn đề liên quan