【问题标题】:Get Raw data from org.bytedeco.javacv.Frame从 org.bytedeco.javacv.Frame 获取原始数据
【发布时间】:2018-10-13 08:10:44
【问题描述】:

我想从javacv Frame 获取原始数据。

我正在使用FFmpegFrmaeFilter 旋转Android 相机预览。所以,我从FFmpegFrameFilter 中提取Frame,然后提供转换后的byte[]MediaCodec

但是,这样做时,我得到了错误的数据(绿色图片)。我从 Frame.Image[0].array(); 获取原始数据

有没有其他方法可以从 Frame 中获取原始数据,我可以将其提供给 Mediacodec

【问题讨论】:

  • 运气好?我也在尝试有效地从 Frame 中获取 RGB 像素值数组,而现在我正在通过 BufferedImage 弹跳,这很慢。

标签: android android-camera android-mediacodec android-ffmpeg javacpp


【解决方案1】:

绿色图片很可能意味着您为图像的色度分量传递了零。 Android 相机通常会生成 YUV 420 图像,其中您有亮度 (Y) 的宽度*高度数组,后跟 U 和 V,宽度/2*高度/2 各。

FFmpegFrameFilter 理解不同的帧格式,但这也取决于一些heuristics,它从Frame 参数导出输入像素格式。

MediaCodec 可以接收flexible YUV 420 format 中的帧,但您有责任正确设置Image

【讨论】:

  • 嗨,亚历克斯,感谢您的回复。我正在使用 Android NV21 图像格式设置 FFmpegFrameFilter。但是,我仍然没有得到正确的视频。当我使用 FFmpegFrameRecorder 而不是 MediaCodec 来存储视频时,视频是正确的。我也尝试过用于视频旋转的 OpenCV 函数,但同样的问题也在发生,我无法找到与 Android 兼容的正确格式。
  • 正如我所解释的,MediaCodec 需要将帧包装为CodecCapabilities.COLOR_FormatYUV420Flexible。你可以为 NV21 准备这样的包装器。
  • 嗨@Alex,我尝试使用 FFmpegFrameFiter 和 OpenCV 获得我的解决方案,但无法做到。最后,我通过将 YUVImage 转换为 Bitmap 并旋转它来旋转它。感谢您的帮助。
  • ……然后您将位图提供给 MediaCodec?
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 2022-01-26
  • 2021-12-09
  • 2017-07-21
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多