Android 13 录像添加水印:MediaMuxer 实现及示例代码
在 Android 13 系统中,可以使用 MediaMuxer 类来实现录像时添加水印。以下是示例代码:
- 在录像前创建一个 MediaMuxer 对象,并调用 addTrack 方法添加视频轨道和音频轨道。
MediaMuxer mediaMuxer = new MediaMuxer(outputFilePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
int videoTrackIndex = mediaMuxer.addTrack(videoFormat);
int audioTrackIndex = mediaMuxer.addTrack(audioFormat);
mediaMuxer.start();
- 在录像时,在每一帧视频数据编码前,使用 Canvas 对象绘制水印,并将绘制结果作为视频数据的一部分。
while (!isStopRecording) {
// 获取摄像头采集的一帧视频数据
byte[] videoData = getVideoData();
// 获取当前时间,用于绘制时间水印
long time = System.currentTimeMillis();
// 创建 Bitmap 对象,并将视频数据转换成 Bitmap
Bitmap bitmap = convertToBitmap(videoData);
// 创建 Canvas 对象,并使用 Paint 对象绘制水印
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(50);
canvas.drawText('Watermark', 50, 100, paint);
canvas.drawText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time)), 50, 200, paint);
// 将 Bitmap 对象转换成视频数据,并写入 MediaMuxer
ByteBuffer buffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(buffer);
buffer.rewind();
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
bufferInfo.presentationTimeUs = time * 1000;
bufferInfo.size = buffer.limit();
bufferInfo.flags = MediaCodec.BUFFER_FLAG_KEY_FRAME;
bufferInfo.offset = 0;
mediaMuxer.writeSampleData(videoTrackIndex, buffer, bufferInfo);
}
- 在录像结束时,调用 MediaMuxer 的 stop 和 release 方法,释放资源。
mediaMuxer.stop();
mediaMuxer.release();
原文地址: https://www.cveoy.top/t/topic/oUIb 著作权归作者所有。请勿转载和采集!