Java 录制时流式传输MediaRecorder文件
我正在尝试实时获取从a点(2.1安卓手机)到B点(我的服务器)的视频流。我该怎么做?下面详细介绍了我的尝试(有点长,但简洁!)Java 录制时流式传输MediaRecorder文件,java,android,streaming,video-streaming,mediarecorder,Java,Android,Streaming,Video Streaming,Mediarecorder,我正在尝试实时获取从a点(2.1安卓手机)到B点(我的服务器)的视频流。我该怎么做?下面详细介绍了我的尝试(有点长,但简洁!) 目标是在不暂停/停止视频流的情况下,通过手机将一小时长的视频录制到服务器上。延迟几分钟不成问题。我试过三种方法 线程一个FileInputStream,它从 视频的文件描述符 目的地 在上调用MediaRecoder.setOutputFile “发送方”套接字的FD。这 插座连接到一个 LocalSocketServer,其目标 是一个“接收器”插座 打开服务器的套
目标是在不暂停/停止视频流的情况下,通过手机将一小时长的视频录制到服务器上。延迟几分钟不成问题。我试过三种方法
//在线程中
服务器=新的LocalServerSocket(套接字地址);
while(true){
receiver=server.accept();
如果(接收器!=null){
InputStream输入=receiver.getInputStream();
…//处理将转到这里
} }
sender=新的LocalSocket();
sender.connect(新的LocalSocketAddress(SOCKET_地址));
setOutputFile(sender.getFileDescriptor());
...
记录器。准备();
recorder.start();//
我用这种方法创建了一个移动到服务器的视频流应用程序,它成功了。因此,这应该是正确的方法。后来,当我不再参与该项目时,我收到报告说,这种方法不适用于一些较新的手机——最著名的是三星Galaxy S。问题是,这些手机很少刷新视频数据,可能每分钟只刷新一次。你用什么手机来测试这个
&三,。MediaRecorder是本机库的包装器。我假设这个库需要一个具体的文件来写入,而不是管道。在文件系统级别,文件和管道看起来是一样的,但不能随机访问管道(查找)
我正在使用。。。galaxy S.我没想到会这样,谢谢你的接球!如果我将接收器套接字设置为输出到文件,2或3会起作用吗?您好,我也在尝试做同样的事情。。。你是不是碰巧在华为IDEOS手机或HTC G1上试用过?如果没有,我可以访问APK并测试它吗?谢谢。那时候它在G1上工作(大约1.5年前),我不知道另一部手机。apk在www.livecliq.net上。我不知道这个项目的现状。我有类似的工作。我们创建了一个包裹在套接字文件描述符周围的ParcelFileDescriptor;使用方法ParcelFileDescriptor.fromSocket(套接字)。不幸的是;这在棒棒糖上已经不可能了。我一直在寻找用文件流传输信息的替代方案,但遇到了很多困难。是否有人有任何将MediaRecorder管道连接到java.net.Socket的解决方案/示例?@user1743524您找到解决方案了吗?我正在尝试实现相同的功能。但我不明白你的方法。将recorder.setOutputFile设置两次:一次设置为文件,另一次设置为套接字。我认为无论何时更改,记录器都将使用新的文件ID,而不是使用多个文件ID。1)和2)是两个单独的示例如果它们是单独的,那么如何同时执行这两个任务?事实上,如果你分开做这两项任务,这应该是一个困难的问题。有关流式处理任务,请参见代码中的Spydroid ipcamera。google@ebaum你能告诉我任务的最新情况吗?我也有同样的问题。也许在19年我们有更新鲜的方法?这仍然是最好的方法还是你可以提出其他建议?
fileOut = new FileOutputStream(pathToFile);
...
recorder.setOutputFile(fileOut.getFD());
recorder.prepare()
recorder.start()
// in an Async Thread
fileIn = FileInputStream(fileOut.getFD);
while (recording) {
fos.flush();
Log.w("---", "bytesAvailable: " + fileIn.available()); //always returns 24
Thread.sleep(1000);
}
// in a Thread
server = new LocalServerSocket(SOCKET_ADDRESS);
while (true){
receiver = server.accept();
if (receiver != null){
InputStream input = receiver.getInputStream();
... // processing would go here
} }
sender = new LocalSocket();
sender.connect(new LocalSocketAddress(SOCKET_ADDRESS));
recorder.setOutputFile(sender.getFileDescriptor());
...
recorder.prepare();
recorder.start(); // <- error