录制时访问输出视频

时间:2013-05-30 03:26:53

标签: android recording mediarecorder

简而言之,我正在寻找一种在录制视频时从相机获取字节流的方法。 目的是在保存当前记录的某些部分的同时连续记录而不停止实际记录过程以访问输出文件。这是否可能,或者我是否需要实际停止录制并保存以使其可播放?

我见过项目和开源库允许通过本地套接字和ParcelFileDescriptor类从摄像头直播到服务器,因此我假设(可能不正确)必须以某种方式访问​​记录器字节流。

非常感谢任何建议或帮助。

2 个答案:

答案 0 :(得分:1)

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

http://bigflake.com/mediacodec/< - CameraToMpegTest.java和" Android Breakout游戏刻录机补丁"实例

基本上,Androids 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);

答案 1 :(得分: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);
        }
    }
}

不要忘记将清单添加到清单文件中:

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