我想在 Android 设备上具有实时音频流的功能,它通过设备的 MIC 捕获音频并将其发送到服务器。我知道在录制后发送音频文件,但如果是实时的,我需要帮助。也许可以通过不断向服务器发送字节数组来完成。如果是的话,如何或是否有其他方式,请分享您的想法。谢谢。
EDIT-
Android 客户端代码:-
public class Main extends Activity {
private MediaRecorder recorder;
private final String TAG = "AudioTest";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String hostname = "192.168.50.25";
int port = 2004;
Socket socket = null;
try {
socket = new Socket(InetAddress.getByName(hostname), port);
} catch (UnknownHostException e) {
Log.d(TAG, "Inside UnknownHostException@@@@@@@@@@@@@@@@@@@@@@");
e.printStackTrace();
} catch (IOException e) {
Log.d(TAG, "Inside IOException%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
e.printStackTrace();
}
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(pfd.getFileDescriptor());
try {
Log.i(TAG, pfd.getFileDescriptor().toString());
} catch (Exception e) {
Log.d(TAG, "Inside MyException################################");
}
try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
}
JAVA服务器代码-
public class Provider {
ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Provider() {
}
void run() {
try {
// 1. creating a server socket
providerSocket = new ServerSocket(2004, 10);
// 2. Wait for connection
System.out.println("Waiting for connection");
connection = providerSocket.accept();
System.out.println("Connection received from "
+ connection.getInetAddress().getHostName());
// 3. get Input and Output streams
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connection.getInputStream());
sendMessage("Connection successful");
// 4. The two parts communicate via the input and output streams
do {
try {
message = (String) in.readObject();
System.out.println("client>" + message);
if (message.equals("bye"))
sendMessage("bye");
} catch (ClassNotFoundException classnot) {
System.err.println("Data received in unknown format");
}
} while (!message.equals("bye"));
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
// 4: Closing connection
try {
in.close();
out.close();
providerSocket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
void sendMessage(String msg) {
try {
out.writeObject(msg);
out.flush();
System.out.println("server>" + msg);
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
public static void main(String args[]) {
Provider server = new Provider();
while (true) {
server.run();
}
}
}
您可以像这样使用套接字:
String hostname = "1.2.3.4";
int port = 865;
Socket socket = null;
try {
socket = new Socket(InetAddress.getByName(hostname), port);
} catch (Exception e) {
e.printStackTrace();
}
ParcelFileDescriptor socketedFile = ParcelFileDescriptor.fromSocket(socket);
然后将socketedFile设置为录音机的输出文件(socketedFile.getFileDescriptor())。这会将其作为字节发送。
或者,为了使其更加稳定,可以将数据从 MediaRecorder 写入本地缓冲区,然后让一个单独的线程检查该缓冲区并将其写入套接字,以允许套接字连接中出现小规模的断开连接。
请参阅此问题以获取更多信息:android 将音频流传输到服务器
显然,您需要在服务器上运行一个应用程序来接收字节并将其转换为音频数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)