我该如何从手机向远程服务器发送实时视频流?

3
我有一个问题,需要将我的实时视频从手机流式传输到服务器上。 也就是说,让我的手机成为IP摄像头,服务器可以从我的手机上观看实时视频。
我已经搜索了很多解决方案, 但没有一个能够解决我的问题。 我使用MediaRecorder进行录制。 它可以正确地保存视频文件到SD卡中。 然后,我参考了这个页面并使用了以下方法。
 skt = new Socket(InetAddress.getByName(hostname),port);
 pfd =ParcelFileDescriptor.fromSocket(skt);
 mediaRecorder.setOutputFile(pfd.getFileDescriptor());

现在似乎我可以在录制时发送视频流了。

然而,我编写了一个接收端程序来从Android接收视频流,但它无法正常工作。是否有任何错误?我可以接收文件,但无法打开视频文件。我猜问题可能是由于文件格式引起的?

以下是我的代码概述。

在Android端:

    Socket skt = new Socket(hostIP,port);
ParcelFileDescriptor pfd =ParcelFileDescriptor.fromSocket(skt);
....
....
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
.....
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
.....
mediaRecorder.start();

在接收端(我的ACER笔记本电脑)

// anyway , I don't think the file extentions will do any effect                
File video = new File (strDate+".3gpp");
FileOutputStream fos;
try {
fos = new FileOutputStream(video);

byte[] data = new byte[1024];

int count =-1;

while( (count = fin.read(data,0,1024) ) !=-1)
{
    fos.write(data,0,count);                                
    fos.flush();    
}                                       
fos.close();
fin.close();

我困惑了很长时间....

提前感谢。

你写了那个吗?http://www.codingfriends.com/index.php/2010/03/31/udp-server/ 它有什么问题?编译或运行时,有任何错误信息吗? - Ishtar
1个回答

4

Poc,

MediaRecorder在写文件时的流程如下: 留出空头 录制过程中写入文件内容 录制完成后,将指针移动到文件开头 在文件开头写入头部信息 接着(我相信)还有另一次将指针移动到文件结尾,并将元数据写入。

因为套接字上没有“寻址”的概念,所以您需要找出头部何时到来,将指针移动到文件的开头,然后将头部写入适当的位置。

在这里开始的最好方法是使用十六进制编辑器确定有效的3gpp文件格式,然后将此十六进制与接收程序的十六进制输出进行分析。此外,您还需要了解3gpp文件格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接