【发布时间】:2018-01-14 04:48:00
【问题描述】:
给定两个编码流,我想并排加入它们。假设我有两个具有相同帧速率的独立 H.264 编码 1024x768 视频。我想将这两者结合起来,使视频 1 和视频 2 并排形成一个宽度为 (1024*2)x768 或 2048x768 的流。我的第一个想法是解码流并组合各个帧,然后重新编码单个流。解码和重新编码很好,这可以工作,但是它非常慢(就像 ffmpeg 一样)。问题似乎在于将帧从 YUV 转换为 RGB 或将它们组合成 YUV 形式的计算时间。 Android 解码器生成 YUV,用于并排组合帧的数学对于这种形式来说是密集的。所以我的问题是;
1) 如果帧是 YUV 形式,是否有更快或更有效的方法来组合帧?
2a) 如果不是,如果它们是 RGB 形式,在计算上组合它们是否会更快?
2b) 如果是这样,我将如何在 Android 中将 H.264 流解码为 RGB 帧?
附:尝试过的 ffmpeg 和 openCV 都需要 YUV 到 RGB 的转换,这使得它非常慢(~5fps)
谢谢!
【问题讨论】:
-
你是用API还是命令行?
-
API 但在使用 ffmpeg 测试时使用了命令行
-
最快的方法是为两个帧创建足够大的 YUV 缓冲区,并在将数据传递给编码器之前自己复制数据,而无需来回转换为 RGB。
-
这是有道理的。但是,我认为由于 YUV 的性质,我无法批量复制和粘贴(即 memcpy)整个帧,我需要以交错方式进行,我认为这在效率/速度方面是一个大问题
-
您还可以使用内联汇编器来加快从 2 帧复制的速度。很可能比 memcpy 或 C 函数快得多。
标签: android rgb framebuffer android-mediacodec yuv