android camera2 api - 如何在录制的视频文件中添加公司徽标
android camera2 api - How can i add a company logo to the recorded video file
大家好。
我想在我录制的视频的角落里添加一个小标志。我尝试将 imageView 直接添加到记录表面,但这不是解决方案。
我想我必须创建另一个表面并将它们合并在一起,但我找不到此类东西的任何教程或代码示例。
我找到了添加前景可绘制对象的选项,但它没有在预览界面上显示徽标。
这是代码:
private void startRecording(){
try {
setupMediaRecorder();
mTextureView.setForeground(getDrawable(R.drawable.toolbarlogo));
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());
Surface previewSurfice = new Surface(surfaceTexture);
Surface recordSurface = mMediaRecorder.getSurface();
mPreviewCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mPreviewCaptureRequestBuilder.addTarget(previewSurfice);
mPreviewCaptureRequestBuilder.addTarget(recordSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurfice, recordSurface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
session.setRepeatingRequest(
mPreviewCaptureRequestBuilder.build(),null,null
);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
},null);
} catch (Exception e) {
e.printStackTrace();
}
}
请帮忙。
谢谢
添加一个单独的表面只会在您在应用程序中查看徽标时显示徽标 - 如果您想将徽标添加到文件中以便在共享或加载视频时可以查看它,那么您需要将其添加到视频本身。
假设您将视频捕获到本地设备,那么您可以执行此操作的一种方法是使用 ffmpeg 向视频添加图像 - 请参阅此答案,其中包括有关如何定位图像的注释:
有多种方法可以将 ffmpoeg 包含在 Android 项目中,但也许最简单的方法是使用像这样的受良好支持的 ffmpeg 包装器项目:
包装器基本上围绕命令行 ffmpeg 工具包装了一个接口,其优点是您可以使用相同的语法 - 例如上面提到的答案中的语法,并利用网络上围绕它的支持和问答。
缺点是命令行工具最初并非设计为以这种方式使用,但如果您使用支持良好的包装器,您可能会发现很多问题都已解决。
需要注意一件事 - 视频处理非常高 CPU,因此对移动设备的电池要求很高。如果您要将视频上传到服务器进行共享,将图像添加到此处可能更有意义,因为您有更多 CPU 马力。
大家好。 我想在我录制的视频的角落里添加一个小标志。我尝试将 imageView 直接添加到记录表面,但这不是解决方案。
我想我必须创建另一个表面并将它们合并在一起,但我找不到此类东西的任何教程或代码示例。
我找到了添加前景可绘制对象的选项,但它没有在预览界面上显示徽标。 这是代码:
private void startRecording(){
try {
setupMediaRecorder();
mTextureView.setForeground(getDrawable(R.drawable.toolbarlogo));
SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());
Surface previewSurfice = new Surface(surfaceTexture);
Surface recordSurface = mMediaRecorder.getSurface();
mPreviewCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mPreviewCaptureRequestBuilder.addTarget(previewSurfice);
mPreviewCaptureRequestBuilder.addTarget(recordSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurfice, recordSurface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
session.setRepeatingRequest(
mPreviewCaptureRequestBuilder.build(),null,null
);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
},null);
} catch (Exception e) {
e.printStackTrace();
}
}
请帮忙。 谢谢
添加一个单独的表面只会在您在应用程序中查看徽标时显示徽标 - 如果您想将徽标添加到文件中以便在共享或加载视频时可以查看它,那么您需要将其添加到视频本身。
假设您将视频捕获到本地设备,那么您可以执行此操作的一种方法是使用 ffmpeg 向视频添加图像 - 请参阅此答案,其中包括有关如何定位图像的注释:
有多种方法可以将 ffmpoeg 包含在 Android 项目中,但也许最简单的方法是使用像这样的受良好支持的 ffmpeg 包装器项目:
包装器基本上围绕命令行 ffmpeg 工具包装了一个接口,其优点是您可以使用相同的语法 - 例如上面提到的答案中的语法,并利用网络上围绕它的支持和问答。
缺点是命令行工具最初并非设计为以这种方式使用,但如果您使用支持良好的包装器,您可能会发现很多问题都已解决。
需要注意一件事 - 视频处理非常高 CPU,因此对移动设备的电池要求很高。如果您要将视频上传到服务器进行共享,将图像添加到此处可能更有意义,因为您有更多 CPU 马力。