2013-05-30 46 views
1

简而言之,我正在寻找一种在录制视频时从摄像机获取字节流的方法。 目标是在保存当前录制的某些部分的同时连续录制,而不必停止实际的录制过程来访问输出文件。这甚至是可能的,还是我需要实际停止录制并保存为可播放?录制时访问输出视频

我见过允许通过本地套接字和ParcelFileDescriptor类从相机直接传输到服务器的项目和开源库,所以我假设(也许不正确)记录器字节流必须以某种方式访问​​。

任何建议或帮助将不胜感激。

回答

0

设置输出文件的FileDescriptor:

mRecorder.setOutputFile(getStreamFd()); 

然后使用此功能:

private FileDescriptor getStreamFd() { 
    ParcelFileDescriptor[] pipe = null; 

    try { 
     pipe = ParcelFileDescriptor.createPipe(); 

     new TransferThread(new ParcelFileDescriptor.AutoCloseInputStream(pipe[0]), 
       new FileOutputStream(getOutputFile())).start(); 
    } catch (IOException e) { 
     Log.e(getClass().getSimpleName(), "Exception opening pipe", e); 
    } 

    return (pipe[1].getFileDescriptor()); 
} 

private File getOutputFile() { 
    return (new File(Environment.getExternalStorageDirectory().getPath().toString() + "/YourDirectory/filename")); 
} 

新线程代码:

static class TransferThread extends Thread { 
    InputStream in; 
    FileOutputStream out; 

    TransferThread(InputStream in, FileOutputStream out) { 
     this.in = in; 
     this.out = out; 
    } 

    @Override 
    public void run() { 
     byte[] buf = new byte[8192]; 
     int len; 

     try { 
      while ((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      in.close(); 

      out.flush(); 
      out.getFD().sync(); 
      out.close(); 

     } catch (IOException e) { 
      Log.e(getClass().getSimpleName(), 
        "Exception transferring file", e); 
     } 
    } 
} 

不要忘记persmissions添加到您的清单file:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

通过使用这种方法,我得到的是不能播放的视频文件。有什么建议么 ? –

1

我有一个类似的问题,并希望在访问H264 NAL单元相机字节流(将其重定向到libRTMP)时在MP4文件中记录H264。下面的示例帮助了很多(至少需要的Android 4.3):

http://bigflake.com/mediacodec/ < - 的CameraToMpegTest.java和“机器人突围游戏录音机补丁”的例子

基本上,机器人会MediaCodec类提供到装置的编码器低级别的访问/解码器。就拿上面的例子来看看功能drainEncoder():

  • 将视频数据发送到MediaMuxer创建一个输出文件
  • 您可以轻松地从encodedData ByteBuffer的访问H264 NAL单元和处理它们的你想要的方式

例子:

int old_pos = encodedData.position(); 
encodedData.position(0); 
byte[] encoded_array = new byte[encodedData.remaining()]; 
encodedData.get(encoded_array); 
encodedData.position(old_pos);