简而言之,我正在寻找一种在录制视频时从摄像机获取字节流的方法。 目标是在保存当前录制的某些部分的同时连续录制,而不必停止实际的录制过程来访问输出文件。这甚至是可能的,还是我需要实际停止录制并保存为可播放?录制时访问输出视频
我见过允许通过本地套接字和ParcelFileDescriptor类从相机直接传输到服务器的项目和开源库,所以我假设(也许不正确)记录器字节流必须以某种方式访问。
任何建议或帮助将不胜感激。
简而言之,我正在寻找一种在录制视频时从摄像机获取字节流的方法。 目标是在保存当前录制的某些部分的同时连续录制,而不必停止实际的录制过程来访问输出文件。这甚至是可能的,还是我需要实际停止录制并保存为可播放?录制时访问输出视频
我见过允许通过本地套接字和ParcelFileDescriptor类从相机直接传输到服务器的项目和开源库,所以我假设(也许不正确)记录器字节流必须以某种方式访问。
任何建议或帮助将不胜感激。
设置输出文件的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" />
我有一个类似的问题,并希望在访问H264 NAL单元相机字节流(将其重定向到libRTMP)时在MP4文件中记录H264。下面的示例帮助了很多(至少需要的Android 4.3):
http://bigflake.com/mediacodec/ < - 的CameraToMpegTest.java和“机器人突围游戏录音机补丁”的例子
基本上,机器人会MediaCodec类提供到装置的编码器低级别的访问/解码器。就拿上面的例子来看看功能drainEncoder():
例子:
int old_pos = encodedData.position();
encodedData.position(0);
byte[] encoded_array = new byte[encodedData.remaining()];
encodedData.get(encoded_array);
encodedData.position(old_pos);
通过使用这种方法,我得到的是不能播放的视频文件。有什么建议么 ? –