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

时间:2010-12-26 14:18:35

标签: java android media

我的问题是通过手机实时将视频流式传输到服务器。 也就是说,让我的手机成为IP摄像头,服务器可以通过手机观看实时视频

我搜索了许多解决方案, 但没有人可以解决我的问题。 我使用MediaRecorder进行录制。 它可以正确保存SD卡中的视频文件。 然后,我提到this page并使用了一些方法

 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();

我困惑了很久...... 提前谢谢

1 个答案:

答案 0 :(得分:4)

PoC中

MediaRecorder写文件的方式如下: 为空标题留出空间 录制时写入文件内容 录制完成后,搜索文件的开头 将标题写在文件的开头 然后(我相信)还有另一个寻找文件末尾的文件来写入元数据。

因为在套接字上没有“搜索”的概念,你必须弄清楚标题何时到来,寻找文件的开头,然后在适当的位置写入标题。

从这里开始的最佳位置是使用hexeditor确定有效3gpp文件的格式,然后根据接收器程序的十六进制输出分析此十六进制。您还需要查看3gpp文件格式。