流媒体实时音频
问题描述:
我想要在Android设备上实现实时音频流功能,该设备通过设备的MIC捕获音频并将其发送到服务器。我知道录音后发送一个音频文件,但在实时情况下,我需要帮助。可以通过将字节数组连续发送到服务器来完成。如果是这样,或者如果有其他方式,请分享您的想法。谢谢。流媒体实时音频
编辑 -
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 [email protected]@@@@@@@@@@@@@@@@@@@@@");
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
显然,你这时就需要有一个服务器上运行的应用收到您的字节,并把它转换成音频数据。
嗨米奇...非常感谢您的关注。但我得到另一个异常(java.io.StreamCorruptedException:无效的流头:00000018)。如果可以,请在这方面提供帮助。参考编辑的问题。 – Nitin4Android 2012-03-21 11:25:12
+1给你...... – Nitin4Android 2012-03-21 11:36:05