2013-01-21 19 views
7

Chcę android.media.MediaRecorder. aby nagrać dźwięk nie do pliku, ale do tej samej zmiennej, na przykład char [] lub byte [] lub jakiejś innej struktury bufora datta. Chcę wysłać go do zdalnego serwera przez Wi-Fi, czy Android.media.MediaRecorder może zapewnić tę funkcjonalność?Nagrywanie dźwięku nie do pliku na Androidzie

+0

To jest możliwe. MediaRecorder zapisuje do FileDescriptor niekoniecznie do pliku. Pamiętaj, że to nie jest "streaming"! Będziesz musiał ponownie napisać do pliku na serwerze. To może pomóc: http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system – Fildor

+0

faktycznie możesz stworzyć deskryptor pliku, który po prostu napisze do wewnętrznego bufora zamiast do pliku, nie zapominaj również, że gniazda mają także deskryptor pliku, do którego piszesz, aby pisać do gniazda. nie ma również potrzeby pisania strony serwera plików, o ile coś nasłuchuje na poprawnym adresie gniazda, aby odebrać te pakiety i przetworzyć je odpowiednio. –

Odpowiedz

14

Co można tutaj zrobić, to użyć klasy ParcelFileDescriptor.

//make a pipe containing a read and a write parcelfd 
ParcelFileDescriptor[] fdPair = ParcelFileDescriptor.createPipe(); 

//get a handle to your read and write fd objects. 
ParcelFileDescriptor readFD = fdPair[0]; 
ParcelFileDescriptor writeFD = fdPair[1]; 

//next set your mediaRecorder instance to output to the write side of this pipe. 
mediaRecorder.setOutputFile(writeFD.getFileDescriptor()); 

//next create an input stream to read from the read side of the pipe. 
FileInputStream reader = new FileInputStream(readFD.getFileDescriptor()); 

//now to fill up a buffer with data, we just do a simple read 
byte[] buffer = new byte[4096];//or w/e buffer size you want 

//fill up your buffer with data from the stream 
reader.read(buffer);// may want to do this in a separate thread 

a teraz masz bufor pełne dane audio

alternatywnie, może chcesz zapisywać dane bezpośrednio do gniazdka z nagrywarki. można to również osiągnąć za pomocą klasy ParcelFileDescriptor.

//create a socket connection to another device 
Socket socket = new Socket("123.123.123.123",65535);//or w/e socket address you are using 

//wrap the socket with a parcel so you can get at its underlying File descriptor 
ParcelFileDescriptor socketWrapper = ParcelFileDescriptor.fromSocket(socket); 

//set your mediaRecorder instance to write to this file descriptor 
mediaRecorder.setOutputFile(socketWrapper.getFileDescriptor()); 

teraz za każdym razem z urządzenia nagrywającego ma dane do zapisu zostanie ona automatycznie zapisać go nad gniazda

Powiązane problemy