如何播放从Android设备流向服务器的视频?

时间:2011-10-06 15:54:02

标签: android video header streaming mp4

我有一个应用程序,可将视频/音频从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标题添加到文件中但我不知道该怎么做!

问候,

1 个答案:

答案 0 :(得分:0)

首先,MPEG4容器不仅仅是视频数据的“标题”。

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

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

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

  

尝试读取len个字节,但数字较小   可能会被读取,可能为零。

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

要修复它,您需要不要使用read()读入的字节,而只将字节写入磁盘。缓冲区的其余部分实际上是垃圾,忽略它。