我搜索了很多但没有找到任何解决方案。我的问题是如何在录制时向视频添加文本,以便我们在观看视频时可以获得相同的文本。当我看到捕获视频时我想要这样的东西。 目前我正在分别获取时间和视频。所以问题是如何结合它。任何形式的帮助将不胜感激。提前致谢..
这是一个非常难以解决的问题,通常使用 Android 假设您正在尝试将文本添加到实际的视频文件中,而不是简单地在
TextView
上显示 VideoView
。您提到您目前的时间和视频是分开的,所以我假设您正在尝试将文本添加到视频文件本身。
为了向视频添加文本,您需要在实际设备上重新编码视频。在 Android 上重新编码视频很棘手,主要是因为 Android 手机上的处理器不同,并且编码取决于处理器。有一个名为
GPUImage
的开源 iOS 库允许您执行此操作,但不幸的是,这在 Android 上不可用。
已经做出了一些努力来为 Android 编译 FFMPEG(理论上这会允许这种事情发生),但这涉及到对底层 C++ 代码的一些认真的工作,而且我还没有发现任何应用程序可以在许多设备上简单地实现这一点(查看此视频转换器,并注意如何针对不同手机不同编解码器需要下载)。对于一种特定的设备,您可能会更幸运,但如果您正在寻找跨许多设备的轻松分发,您可能会很难做到这一点。
目前,这个问题还没有简单的解决方案。
我使用camera2 API。我创建预览和 ImageReader。我从记录表面得到画布。每帧转换为位图并放入画布,然后绘制徽标、文本等,
private val mOnImageAvailableListener = ImageReader.OnImageAvailableListener { reader ->
val image = reader.acquireNextImage() ?: return@OnImageAvailableListener
val bytes = image.toNV21()//image.convertYUV420888ToNV21()
val bitmap = Bitmap.createBitmap(image.width, image.height,
Bitmap.Config.ARGB_8888);
val bmData: Allocation = Converter.renderScriptNV21ToRGBA888(requireContext(),
image.width, image.height, bytes)
bmData.copyTo(bitmap)
val canvas = recorderSurface!!.lockCanvas(null)
canvas.drawBitmap(bitmap, 0f, 0f, Paint())
drawData(canvas)
recorderSurface!!.unlockCanvasAndPost(canvas)
bitmap.recycle()
image.close()
}
这是一个相当老的问题,但现在(2024 年)我们有 Media3 API 可以在视频上添加文本(而不是在实时摄像机录制中)。
这是预览更改的代码。
val mediaItem = MediaItem.Builder()
.setUri(videoUri)
.build()
val textEffect = TextOverlay.createStaticTextOverlay(
SpannableString(text),
)
val player = ExoPlayer.Builder(context)
.build()
.also { exoPlayer ->
exoPlayer.setMediaItem(mediaItem)
exoPlayer.setVideoEffects(listOf(OverlayEffect(ImmutableList.of(textEffect))))
exoPlayer.prepare()
}
这是将视频导出到文件的代码。
val mediaItem = MediaItem.Builder()
.setUri(videoUri.value)
.build()
val textEffect = TextOverlay.createStaticTextOverlay(
SpannableString(text.value),
)
val effects = Effects(
listOf(),
listOf(OverlayEffect(ImmutableList.of(textEffect))),
)
val editedMediaItem = EditedMediaItem.Builder(mediaItem)
.setEffects(effects)
.build()
val outputFile = File(context.filesDir, "test.mp4")
transformer.start(editedMediaItem, outputFile.absolutePath)
transformer.addListener(object : Transformer.Listener {
override fun onCompleted(composition: Composition, exportResult: ExportResult) {
onCompleted()
}
override fun onError(
composition: Composition,
exportResult: ExportResult,
exportException: ExportException
) {
onError(exportException)
}
})
您可以阅读我的博文了解更多详细信息:https://acomputerengineer.com/2024/09/23/add-text-on-video-in-android-using-media3-and-transformer-apis/