2013-01-21 39 views
7

Tôi muốn android.media.MediaRecorder. để ghi lại âm thanh không thành tập tin, nhưng vào cùng một biến, ví dụ char [] hoặc byte [] hoặc một số cấu trúc bộ đệm khác. Tôi muốn gửi nó đến máy chủ từ xa qua Wi-Fi, android.media.MediaRecorder có thể cung cấp chức năng này không?Ghi âm thanh không để tập tin trên Android

+0

Có thể. MediaRecorder ghi vào một FileDescriptor không nhất thiết phải là một tệp. Lưu ý rằng đây không phải là "streaming"! Bạn sẽ phải ghi vào một tập tin ở phía máy chủ một lần nữa. Điều này có thể giúp: http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system – Fildor

+0

thực sự bạn có thể tạo một bộ mô tả tập tin mà chỉ cần viết vào một bộ đệm bên trong thay vì một tập tin, cũng đừng quên rằng các ổ cắm có một bộ mô tả tập tin là tốt, mà bạn ghi vào để ghi vào socket. cũng không cần phải viết một máy chủ tập tin bên miễn là một cái gì đó đang lắng nghe trên địa chỉ ổ cắm chính xác để nhận các gói tin và xử lý chúng cho phù hợp. –

Trả lời

14

Những gì bạn có thể làm ở đây là sử dụng lớp 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 

và bây giờ bạn có một bộ đệm đầy đủ các dữ liệu âm thanh

cách khác, bạn có thể muốn ghi dữ liệu trực tiếp vào một ổ cắm từ máy ghi âm. điều này cũng có thể đạt được với lớp 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()); 

tại bất kỳ thời gian ghi âm phương tiện truyền thông của bạn có dữ liệu để viết nó sẽ tự động ghi lại nó qua socket

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