我正在Android Studio上创建一个应用程序,在该应用程序中,用户可以在录制视频时选择要应用的各种帧,如下所示:
录制视频时,很容易“模拟”这种效果,因为我要做的就是将ImageView放在TextureView上(相机预览显示在ImageView上)。 但是,我不知道在录制视频时如何应用选定的帧。
我相信这类似于在Instagram故事上添加图片之类的东西,但是我找不到相关的代码或教程。
这是Java源文件中处理记录的部分:
private void startRecord(){
try {
setupMediaRecorder();
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface previewSurface = new Surface(surfaceTexture);
Surface recordSurface = mMediaRecorder.getSurface();
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mCaptureRequestBuilder.addTarget(previewSurface);
mCaptureRequestBuilder.addTarget(recordSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordSurface),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
mRecordCaptureSession = session;
try{mRecordCaptureSession.setRepeatingRequest(
mCaptureRequestBuilder.build(),null,null
);} catch(CameraAccessException e){
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
//Log.d(TAG,"onConfigurationFailed: startRecord");
}
@Override
public void onClosed(CameraCaptureSession session ){
super.onClosed(session);
startPreview();
}
}, null);
} catch(Exception e){
e.printStackTrace();
}
}
private void startPreview(){
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());
Surface previewSurface = new Surface(surfaceTexture);
try {
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mCaptureRequestBuilder.addTarget(previewSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
Log.d(TAG, "PS");
try {
session.setRepeatingRequest(mCaptureRequestBuilder.build(), null, mBackgroundHandler);
} catch(CameraAccessException e){
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Toast.makeText(getApplicationContext(), "Unable to setup camera preview",Toast.LENGTH_SHORT).show();
}
@Override
public void onClosed(CameraCaptureSession session ){
super.onClosed(session);
Log.d(TAG,"PC");
}
}, null);
} catch(CameraAccessException e){
e.printStackTrace();
}
}
private void setupMediaRecorder() throws IOException{
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setOutputFile(mVideoFileName);
mMediaRecorder.setVideoEncodingBitRate(1000000);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(mVideoSize.getWidth(),mVideoSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setOrientationHint(mTotalRotation);
mMediaRecorder.prepare();
}
这是Java源文件中保存的部分:
private void createVideoFolder(){
File movieFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
mVideoFolder = new File(movieFile, "OneanOne");
if(!mVideoFolder.exists()){
mVideoFolder.mkdirs();
}
}
private File createVideoFileName() throws IOException {
String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String prepend = "VIDEO_"+timestamp+"_";
File videoFile = File.createTempFile(prepend,".mp4",mVideoFolder);
mVideoFileName = videoFile.getAbsolutePath();
return videoFile;
}
这是xml(以防万一这也很重要):
<TextureView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textureView"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:src="@drawable/frame1"
></ImageView>
我将如何实现这种效果?提前非常感谢。