2011-01-09 23 views
6

我想从点A(2.1手机)实时获取视频流到点B(我的服务器)。我会怎么做?下面详细描述我尝试(有点长,但简洁!)在录制时流式传输录制文件


的目标是让记录手机到服务器一小时长的视频,而无需暂停/停止流。延迟达几分钟不是问题。我已经尝试了三种方法

  1. 线程一个FileInputStream从视频 目的地
  2. 呼叫MediaRecoder.setOutputFile上 的 的FileDescriptor读取的“发件人”插座的FD。这个 套接字连接到一个 LocalSocketServer,其目的地 是'接收器'套接字。
  3. 打开套接字到我的服务器和 给setOutputFile其FD

不幸的是这两种尝试都失败了。

  1. 只注册24个字节每当我 调用FileInputStream.available(), 和字节的实际数量只有 后,我打电话Recorder.stop()
  2. 给了我这个没用的精美栈跟踪

    错误/ AndroidRuntime(18532):引起:java.lang.RuntimeException:启动失败。 ERROR/AndroidRuntime(18532):在android.media.MediaRecorder.start(本机方法) ERROR/AndroidRuntime(18532):在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); 
} 

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. 如果我使用 setOutputFile(pathToFile),而不是正确地节省了廉洁视频 到SD
  2. 作品。 插座也工作时,我跑 sender.getOutputStream().write(message.getBytes());
+0

我想实现相同的功能。但我不明白你的方法。您设置recorder.setOutputFile两次:一次到一个文件,另一次到一个套接字。我认为无论何时更改,记录器都将使用新的fileID,而不是使用多个fileID。 – user1914692 2013-05-29 16:57:42

+0

1)和2)是两个单独的例子 – ebaum 2013-05-29 17:57:58

回答

2
  1. 我创建了一个移动到服务器的视频流应用这种方法,它的工作。所以这应该是正确的方法。后来,当我不再参与这个项目时,我得到了一些报道,说这种方法并不适用于一些新手机 - 最值得注意的是三星Galaxy S。问题是这款手机会少量刷新视频数据,也许每分钟一次。你用什么手机来测试它?

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