我想在 android 设备上实现实时音频流功能,它通过设备的 MIC 捕获音频并将其发送到服务器。我知道在录制后发送一个音频文件,但如果是实时的,我需要帮助。可能可以通过不断向服务器发送字节数组来完成。如果是这样,如何或是否有其他方式,请分享您的想法。谢谢。
编辑-
安卓客户端代码:-
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 stream audio to server
显然,您随后需要在服务器上运行一个应用程序来接收您的字节并将其转换为音频数据。
关于android - 流式实时音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9770565/