2012-11-21 15 views
7

Przesyłam dane z kamery internetowej do mojego klienta.Android: Przesyłanie danych z kamery i zapisywanie jej na serwerze

Widzę, że dane przychodzą poprzez nasłuchiwanie ("dane"). Jednak kiedy go utworzę, nie jestem w stanie go wyświetlić i prawdopodobnie są to śmieci lub brakuje niektórych nagłówków. VLC nie może go odtworzyć.

Następnym krokiem jest uczynienie go w czasie rzeczywistym możliwym do przesłania do przeglądarki.

Co robię źle?

net = require('net'); 
fs = require('fs'); 

// Start a TCP Server 
net.createServer(function (socket) {  
    console.log("client connected"); 
    var file = fs.createWriteStream("temp.mp4"); 
    socket.pipe(file, {end: false}); 

    socket.on('end', function(){ 
     console.log("ended"); 
    }); 
}).listen(5000); 

testowałem, aby zobaczyć czy to się naprawdę uchwycić wyjście wideo:

$ mediainfo temp.mp4 

General 
Complete name       : temp.mp4 
Format         : H.263 
Format version       : H.263 
File size        : 126 KiB 

Video 
Format         : H.263 
Width         : pixel0 
Height         : pixel0 
Color space        : YUV 
Chroma subsampling      : 4:2:0 
Bit depth        : 8 bits 
Compression mode       : Lossy 

I to jest następujący kod Android ustawiania mediaRecorder (Załóżmy gniazdo jest połączone, nie ma problemu)

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
    mediaRecorder.setVideoSize(320, 240); 
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 

    ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);  
    mediaRecorder.setOutputFile(pfd.getFileDescriptor()); 

    mediaRecorder.setMaxDuration(5000); 
    mediaRecorder.setMaxFileSize(5000000); 

Odpowiedz

6

Istnieje kilka projektów open source, które rozwiązują ten problem, takich jak Spydroid (przeglądarka/streaming VLC) i Android IP Camera (strumieniowanie przeglądarki). Twoja implementacja wydaje się podobna do Spydroida, więc może możesz zaadaptować część swojego kodu.

Głównym problemem jest to, że MediaRecorder zapisuje nieprzetworzone ramki wideo do gniazda. Musi poczekać, aż film się zakończy, aby zapisać nagłówki, ale muszą one pojawić się na początku pliku. Ponieważ gniazdo nie jest widoczne, nagłówków nie można zapisać we właściwej lokalizacji. Projekty powiązane powyżej zajmują się tym problemem, spakowując strumień do RTSP (Spydroid) lub "przesyłając strumieniowo" serię nieruchomych obrazów do przeglądarki (Android IP Camera).

+0

Nie wiedziałem, że pisze surowy plik, dzięki! Teraz widzę główny problem – Mustafa

Powiązane problemy