我有一个应用程序可以将视频/音频从 Android 设备流式传输到服务器 流媒体很好,但是当我从 MediaRecoreder 保存流媒体数据时,我无法播放文件
安卓代码:
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 header 添加到文件中,但我不知道该怎么做!?
问候,
最佳答案
首先,MPEG4 容器不仅仅是视频数据的“ header ”。
其次,服务器端代码在我看来不正确。我假设它是Java。具体来说:
dis = new DataInputStream(userSocket.getInputStream());
while(true){
dis.read(buf , 0 , buf.length);
saveBufferToFile(buf);
}
具体来说,DataInputStream.read()
不一定读取缓冲区的整个长度。 JavaDocs 说:
An attempt is made to read as many as len bytes, but a smaller number may be read, possibly zero.
我怀疑您正在写入磁盘的文件已损坏。您可以通过比较客户端发送的字节数和文件大小来确认这一点。我的直觉告诉我文件会大得多。
要修复它,您不需要取出 read()
读取的字节,而只需将这些字节写入磁盘。缓冲区的其余部分实际上是垃圾,忽略它。
关于android - 如何播放从 Android 设备流式传输到服务器的视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7677014/