Java 录制时流式传输MediaRecorder文件

Java 录制时流式传输MediaRecorder文件,java,android,streaming,video-streaming,mediarecorder,Java,Android,Streaming,Video Streaming,Mediarecorder,我正在尝试实时获取从a点(2.1安卓手机)到B点(我的服务器)的视频流。我该怎么做?下面详细介绍了我的尝试(有点长,但简洁!) 目标是在不暂停/停止视频流的情况下,通过手机将一小时长的视频录制到服务器上。延迟几分钟不成问题。我试过三种方法 线程一个FileInputStream,它从 视频的文件描述符 目的地 在上调用MediaRecoder.setOutputFile “发送方”套接字的FD。这 插座连接到一个 LocalSocketServer,其目标 是一个“接收器”插座 打开服务器的套

我正在尝试实时获取从a点(2.1安卓手机)到B点(我的服务器)的视频流。我该怎么做?下面详细介绍了我的尝试(有点长,但简洁!)


目标是在不暂停/停止视频流的情况下,通过手机将一小时长的视频录制到服务器上。延迟几分钟不成问题。我试过三种方法

  • 线程一个FileInputStream,它从 视频的文件描述符 目的地
  • 在上调用MediaRecoder.setOutputFile “发送方”套接字的FD。这 插座连接到一个 LocalSocketServer,其目标 是一个“接收器”插座
  • 打开服务器的套接字并 将setOutputFile设置为其FD
  • 不幸的是,两次尝试都失败了

  • 每当我 调用FileInputStream.available(), 和实际字节数 在我呼叫录音机之后。停止()
  • 给我这个漂亮的没用的 堆栈跟踪

    错误/AndroidRuntime(18532):原因:java.lang.RuntimeException:启动失败。 错误/AndroidRuntime(18532):在android.media.MediaRecorder.start(本机方法)处 错误/AndroidRuntime(18532):位于com.example.demovideo.demovideo.initializeCamera(…)

  • 同样的错误2

  • 代码片段(省略部分)

    (一)

    (二)

    //在线程中
    服务器=新的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