问题标签 [libyuv]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
478 浏览

video - 使用ffmpeg进行H264解码,解码图像中有奇怪的点

我正在尝试使用 FFmpeg 将 H264 流解码为 YUV 数据,然后通过LibYUV将 YUV 数据转换为 RGB 数据,最后绘制它。但是出现了一些奇怪的点(点)。如何解决?

解码图像

为了找出哪一步错了,我在使用前保存了H264数据avcodec_decode_video2,解码后保存了YUV数据。我发现所有的H264数据都是正确的,而YUV数据是错误的,用P帧解码,I帧解码数据是ok的。这是我保存 YUV 数据的方法:

0 投票
1 回答
253 浏览

c++ - 将原始视频图像转换为 I420 用于 vpx 编码器

我试图将原始视频帧提供给 libyuv 以将 UYVY 视频转换为 I420,但是当我使用 libyuv 转换帧时,我只能得到视频的左手角,我试图从我的 decklink 卡中捕获。

这是我使用的函数的代码

我怎样才能让它显示整个框架?谢谢你!!!

0 投票
1 回答
1052 浏览

image-processing - libyuv API MJPGToI420() 的示例用法

我正在尝试使用libyuv API,更具体地说MJPGToI420()

我想首先将 jpeg 图像作为输入MJPGToI420(),其签名如下:

然后,我想为dst_ydst_udst_v指针分配空间。但是,我不知道要为他们分配多少空间。我也对应该是什么步幅感到困惑,即参数和dst_stride_y应该是什么。dst_stride_udst_stride_v

非常感谢任何正确方向的指示。

编辑:这是使用此函数的libyuv单元测试中的一段代码。但是,测试返回 1,这是函数失败的预期行为。该测试也只对数据使用零,而不是实际的 MJPG 文件。

编辑 2:此外,这是我尝试过的,但是,最终的 yuv 文件甚至在 yuv 查看器(使用缓冲区dst_u_opt和创建dst_y_opt)中都无法查看,这让我相信我可能会搞砸功能:

0 投票
2 回答
1617 浏览

android - 使用 libyuv 缩放 YUV420 图像会产生奇怪的输出

This question的可能重复项,主要部分是从这里挑选的。我已经尝试了那里提供的任何解决方案,它们对我不起作用。

背景

我正在捕获从 ARCore 的方法返回的YUV_420_888图像格式的图像。frame.acquireCameraImage()由于我已将相机配置设置为 1920*1080 分辨率,因此我需要将其缩小到 224*224 以将其传递给我的 tensorflow-lite 实现。我通过 Android NDK使用LibYuv库来做到这一点。

执行

准备图像帧

I420Scale我使用Libyuv的方法缩放我的图像

并将其返回给java

实际图像:在此处输入图像描述

缩放后的样子:

在此处输入图像描述

如果我i420_input_frame从不缩放创建图像会是什么样子:

在此处输入图像描述

由于缩放会严重混淆颜色,因此 tensorflow 无法正确识别对象。(它在他们的示例应用程序中正确识别)我做错了什么来搞乱颜色?

0 投票
1 回答
168 浏览

c++ - 无法通过 cpp 文件中的 Visual stduio 构建 yuvlib 库函数

我在 Visual Studio 2017 中构建并使用了 libyuv。我可以构建 libyuv.h 并在 c 文件中运行。但是如果我将main.c文件更改为main.cpp文件,那么我无法在 cpp 文件中构建。谁能帮我?我附上来源/参考以下链接

https://github.com/stevenyeun/libyuvtest/tree/master/LibYuvTest/LibYuvTest

这是 main.cpp

错误 C3861:“NV12ToARGB”:找不到标识符

我尝试添加 extern "C" 关键字但无法构建

0 投票
0 回答
150 浏览

ios - iPhone上的libyuv崩溃

我最近遇到了 libyuv 崩溃。
我尝试了很多,但没有用。
请帮助或尝试提供一些想法如何实现这一目标。谢谢!

我有一个 iOS 项目(目标 C)。其中一项功能是对视频流进行编码。
我的想法是
步骤 1:启动计时器(20 FPS)
步骤 2:复制并获取位图数据
步骤 3:将位图数据传输到 YUV I420(libyuv
步骤 4:编码为 h264 格式(Openh264
步骤 5:发送使用 RTSP 的 h264 数据
所有功能都在前台运行。

它适用于 3~4 小时。
但它总是会在 4 小时后崩溃。
检查 CPU(39%)、内存(140MB),是否稳定(无内存泄漏、CPU 忙等)。
我尝试了很多,但没有用(包括在我的项目中添加 try-catch,在此行中运行之前检测数据大小)
我发现如果减少 FPS 时间(20FPS -> 15FPS)它会运行更多
它是否需要在每帧编码后添加一些东西?
有人可以帮助我或为此提供一些想法吗?谢谢!

在此处输入图像描述

在此处输入图像描述



[2020 年 1 月 8 日更新]

我在 Google 问题报告中报告了这张票
https://bugs.chromium.org/p/libyuv/issues/detail?id=853


谷歌员工给我一个反馈。


我会试试的。

0 投票
1 回答
589 浏览

c++ - opencv 无法打开 yuv422 图像,而 rawpixels.net 可以显示图像

我正在尝试打开一个 yuv 格式的图像。我可以用 rawpixels.net 打开它并在设置以下内容后显示它

但是,如果我使用以下代码打开 opencv,我将无法打开。

该程序打印为“图像为空”。

我很困惑为什么我不能用opencv打开文件。

示例图像可在此处找到。

用 rawpixels.net 打开的 yuv 图像看起来像这样。

在此处输入图像描述

谢谢,

0 投票
0 回答
130 浏览

android-camera - 应该使用什么颜色格式来编码媒体编解码器中libyuv转换的i420帧?

我用libyuv将 nv21 帧转换为 i420 帧,然后用mediacodec将帧编码成视频文件,视频看起来很奇怪。我使用和颜色格式。COLOR_FormatYUV420SemiPlanarCOLOR_FormatYUV420Flexible奇怪的颜色

那么,我应该使用什么颜色格式来编码 libyuv 转换的 i420 帧。

0 投票
0 回答
92 浏览

android - Android 如何将相机流拆分为具有不同 fps/分辨率/water_marks 的多个流以进行预览/录制/实时流/AI

我正在开发一个具有预览/本地录制/实时流/AI 功能的项目。

所有这些功能都可能随时被激活/停用。

并且每个流在特定的帧速率下都有自己的分辨率,并带有自定义的水印。

所以我正在为此寻找解决方案,

如果解决方案能够在用户体验和效率上取得平衡,那就太好了。

我学到的潜在解决方案。

----

[Android 相机 API2]

通过将不同的目标输出表面激活为相机重复请求。

优点:

  1. 易于拆分为不同的分辨率。

缺点:

  1. 替换重复请求将引入帧间隙和明显的抖动。
  2. 无法控制每个输出表面的 fps,并且可能会减慢整个请求的 fps。(yuv 数据提取的输出表面和 ImageReader 太多)
  3. 支持有限的输出表面。(通常 3 个)
  4. 不知道如何对每个流进行帧后处理,例如添加水印。

[Android Camera API2 + libyuv]

将一个 ImageReader 添加到 Camera API2 并将 ImageReader 的数据复制到多个流中,并使用 libyuv 为每个流进行缩放/水印。

优点:

  1. 每个流的 FPS 可控。
  2. 即时添加/删除流。

缺点:

  1. 使用 libyuv 进行 sacle/water-mark 的 CPU 负载较高。
  2. 用于处理和传输过多数据缓冲区的高 CPU。
  3. 如果涉及 4K 分辨率,则会出现散热问题。

【安卓相机API2+OpenGLES】

  1. 生成纹理对象。
  2. 创建一个 TextureSurface(纹理对象)。
  3. 将 TextureSurface 馈送到 Camera API2。
  4. 当 FrameAvailable 时更新 TexImage。

通过以下方式添加流:

  1. 使用共享的 GlContext 创建一个线程。
  2. 为输出表面创建 EGLSurface。(SurfaceView/MediaCodec/ImageReader..)
  3. 设置一个周期性定时器(fps 控制)来绘制帧。
  4. 当铃声响起。
  5. BindTexture 并绘制到当前的 EGLSurface。
  6. 将位图混合为水印。
  7. 如果流需要 YUV420 输出,我可以rgbaToYuv通过片段着色器实现,然后 glReadPixels()。

通过以下方式删除流:

  1. 释放相关资源。
  2. 终止此线程。

优点:

  1. 动态添加/删除流而不影响其他流。
  2. 简单的fps控制
  3. 轻松添加水印

缺点:

  1. 可能是 GPU 加载过多?

我真的不确定。我对OpenGLES的东西不是很熟悉。

所以请发表评论。

您如何看待上述解决方案?

哪一个更好?

和任何其他方法?

如果我缺乏理解,请原谅我。

0 投票
0 回答
40 浏览

ios - iOS - NV12 到 I420 硬件加速

有没有办法在 iOS (CoreVideo/CoreGraphics) 上使用硬件加速原生 API 进行 NV12 到 I420 的转换?

我正在使用 libyuv 进行类似的转换,但它不是硬件加速的