录制时流式传输MediaRecorder文件

eba*_*aum 8 java streaming android video-streaming mediarecorder

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


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

  1. 线程化一个从视频目的地的FileDescriptor读取的FileInputStream
  2. 在'sender'套接字的FD上调用MediaRecoder.setOutputFile.此套接字连接到LocalSocketServer,其目标是"接收器"套接字.
  3. 打开我的服务器的套接字,并给它的FD提供setOutputFile

不幸的是,两次尝试都失败了.

  1. 每当我调用FileInputStream.available()时,只注册24个字节,并且只有在我调用Recorder.stop()之后才会注册实际的字节数
  2. 给了我这个美丽无用的堆栈跟踪

    ERROR/AndroidRuntime(18532):引起:java.lang.RuntimeException:启动失败.ERROR/AndroidRuntime(18532):在android.media.MediaRecorder.start(Native Method)ERROR/AndroidRuntime(18532):at com.example.demovideo.DemoVideo.initializeCamera(...)...

  3. 同样的错误2

代码片段(部分省略)

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);
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
  1. 正确地将未损坏的视频保存到SD
  2. 如果我使用setOutputFile(pathToFile),则可以正常工作.我运行时套接字也可以工作 sender.getOutputStream().write(message.getBytes());

Pet*_*ego 2

  1. 我用这种方法创建了一个移动到服务器的视频流应用程序,并且它有效。所以这应该是正确的方法。后来,当我不再参与该项目时,我收到报告称,这种方法不适用于某些较新的手机,尤其是三星 Galaxy S。问题在于,这些手机很少刷新视频数据,可能每分钟刷新一次。你用什么手机来测试这个?

  2. & 3. MediaRecorder 是本机库的包装器。我假设这个库想要一个具体的文件来写入而不是管道。在文件系统级别,文件和管道看起来相同,但不能随机访问管道(查找)。