录制时流式传输MediaRecorder文件

时间:2011-01-09 09:19:51

标签: java android streaming video-streaming mediarecorder

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


目标是将手机录制的一小时长视频发送到服务器,而不会暂停/停止流。延迟几分钟不是问题。我尝试了三种方法

  1. 线程从中读取的FileInputStream 视频的FileDescriptor 目的地
  2. 调用MediaRecoder.setOutputFile “发送者”套接字的FD。这个 套接字连接到 LocalSocketServer,其目的地 是一个'接收器'插座。
  3. 打开我的服务器的套接字 给setOutputFile它的FD
  4. 不幸的是,两次尝试都失败了。

    1. 每当i只注册24个字节 调用FileInputStream.available(), 和实际的字节数 在我调用Recorder.stop()
    2. 之后
    3. 给了我这个美丽无用的东西 栈跟踪

      错误/ AndroidRuntime(18532):引起:java.lang.RuntimeException:启动失败。 错误/ AndroidRuntime(18532):在android.media.MediaRecorder.start(本机方法) ERROR / AndroidRuntime(18532):at com.example.demovideo.DemoVideo.initializeCamera(...) ...

    4. 同样的错误2

    5. 代码片段(省略部分)

      1)

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

      2)

      // 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
      
      1. 正确保存未损坏的视频 到sd
      2. 如果我使用,
      3. 有效 改为使用setOutputFile(pathToFile)。 我运行时套接字也可以工作 sender.getOutputStream().write(message.getBytes());

1 个答案:

答案 0 :(得分:2)

  1. 我用这种方法创建了一个移动到服务器的视频流应用程序,但它确实有效。所以这应该是正确的方法。后来,当我不再参与该项目的时候,我得到报告说这种方法不适用于一些较新的手机 - 最值得注意的是三星Galaxy S.问题是这款手机可以节制地刷新视频数据,每分钟一次。你用什么手机测试这个?

  2. &安培; 3. MediaRecorder是本机库的包装器。我假设这个库想要一个具体的文件写入不是管道。在文件系统级文件&amp;管道看起来一样,但是人们不能随意访问管道(寻找)。