android - 如何播放从 Android 设备流式传输到服务器的视频?

标签 android video header streaming mp4

我有一个应用程序可以将视频/音频从 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/

相关文章:

c++ - 如何提取音频/视频文件的持续时间?

javascript - 使用 jquery 检查是否正在播放 HTML5 视频

android - 播放视频后如何返回

c++ - C++头文件中的对象初始化问题

c++ - 这将打印出什么,为什么?你会怎么修? [C++]

android - 如何在Android中的TextView右侧设计小圆点

Android Edit Text错误重叠其他组件

java - Facebook sdk 图响应为空

android - 没有得到反向列表

编译错误 "name in formal parameter list illegal"