2011-10-06 110 views
2

我有一个从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头文件添加到文件中,然后再将数据写入文件中,但我不知道如何执行此操作!

问候,

回答

0

首先,MPEG4容器不仅仅是“报头”,以视频数据更多。

其次,服务器端代码看起来不正确。我认为它是Java。具体来说:

dis = new DataInputStream(userSocket.getInputStream()); 
while(true){ 
    dis.read(buf , 0 , buf.length); 
    saveBufferToFile(buf); 
} 

具体而言,DataInputStream.read()不一定读取缓冲区的整个长度。 JavaDocs说:

尝试读取多达len字节,但可能会读取较小的数字 ,可能为零。

我怀疑你正在写入磁盘的文件已损坏。您可以通过比较客户端发送的字节数和文件大小来确认这一点。我的直觉说文件会大得多。

要解决它,你将需要采取不通过read()读取的字节数,并且只写那些字节的磁盘。缓冲区的其余部分实际上是垃圾,忽略它。

+0

好的,我确定我读取了所有的字节,并将该文件保存在设备和服务器上!这不会解决问题!而我正在寻找这个问题!我发现我需要添加文件头和页脚,这些文件包含文件的内容长度,我不知道我保存了多少!所以我认为这是联合国可解决的问题,我应该找到另一种方式将数据从Android设备传输到服务器。 – daigoor

+1

@daigoor:问题不在于读取所有字节。它写入的字节太多。在每个循环中,您正在写入整个缓冲区,无论天气与否,它都会被读取。从网络读取并在文件的持续时间内填充缓冲区的可能性几乎没有。直到你解决这个问题,你永远不会让它走得更远。 –

+0

我知道..但我现在远离这个错误,现在我开始做其他事情,我停止了这个项目的工作,直到我完成了我的任务。 – daigoor

相关问题