我有一个应用程序,可将视频/音频从Android设备流式传输到服务器 流媒体很好,但是当我从MediaRecoreder保存流数据时,我无法播放文件
Android代码:
String hostname = "000.000.000.000";
int port = 0000;
Socket socket = null;
try {
socket = new Socket(InetAddress.getByName(hostname), port);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(pfd.getFileDescriptor());
recorder.start();
服务器端:
Socket userSocket = socket.accept();
//DataInputStream dis;
dis = new DataInputStream(userSocket.getInputStream());
while(true){
dis.read(buf , 0 , buf.length);
saveBufferToFile(buf);
}
现在我使用FileOutStream .write()保存缓冲区;方法但输出文件根本无法播放。
经过研究我明白我需要在写入数据之前将mp4标题添加到文件中但我不知道该怎么做!
问候,
答案 0 :(得分:0)
首先,MPEG4容器不仅仅是视频数据的“标题”。
其次,服务器端代码看起来不正确。我认为它是Java。具体做法是:
dis = new DataInputStream(userSocket.getInputStream());
while(true){
dis.read(buf , 0 , buf.length);
saveBufferToFile(buf);
}
具体而言,DataInputStream.read()
不一定读取缓冲区的整个长度。 JavaDocs说:
尝试读取len个字节,但数字较小 可能会被读取,可能为零。
我怀疑您写入磁盘的文件已损坏。您可以通过比较客户端发送的字节数和文件大小来确认。我的直觉说文件会大得多。
要修复它,您需要不要使用read()
读入的字节,而只将字节写入磁盘。缓冲区的其余部分实际上是垃圾,忽略它。