如何播放从Android设备流式传输到服务器的视频?
问题描述:
我有一个从Android设备流媒体视频/音频服务器 流都很好,但是当我保存流数据来回MediaRecoreder我无法播放该文件的应用程序如何播放从Android设备流式传输到服务器的视频?
的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头文件添加到文件中,然后再将数据写入文件中,但我不知道如何执行此操作!
问候,
答
首先,MPEG4容器不仅仅是“报头”,以视频数据更多。
其次,服务器端代码看起来不正确。我认为它是Java。具体来说:
dis = new DataInputStream(userSocket.getInputStream());
while(true){
dis.read(buf , 0 , buf.length);
saveBufferToFile(buf);
}
具体而言,DataInputStream.read()
不一定读取缓冲区的整个长度。 JavaDocs说:
尝试读取多达len字节,但可能会读取较小的数字 ,可能为零。
我怀疑你正在写入磁盘的文件已损坏。您可以通过比较客户端发送的字节数和文件大小来确认这一点。我的直觉说文件会大得多。
要解决它,你将需要采取不通过read()
读取的字节数,并且只写那些字节的磁盘。缓冲区的其余部分实际上是垃圾,忽略它。
好的,我确定我读取了所有的字节,并将该文件保存在设备和服务器上!这不会解决问题!而我正在寻找这个问题!我发现我需要添加文件头和页脚,这些文件包含文件的内容长度,我不知道我保存了多少!所以我认为这是联合国可解决的问题,我应该找到另一种方式将数据从Android设备传输到服务器。 – daigoor
@daigoor:问题不在于读取所有字节。它写入的字节太多。在每个循环中,您正在写入整个缓冲区,无论天气与否,它都会被读取。从网络读取并在文件的持续时间内填充缓冲区的可能性几乎没有。直到你解决这个问题,你永远不会让它走得更远。 –
我知道..但我现在远离这个错误,现在我开始做其他事情,我停止了这个项目的工作,直到我完成了我的任务。 – daigoor