在我的应用程序中,我使用drawBitmap()来显示低分辨率位图,同时我将其缩小.我在几个设备上测试了它(Galaxy Tab,Kindle Fire,Moto Xoom和Nexus 7).在所有这些中,我获得了相同的渲染质量,除了在Nexus 7中.您可以在附加的屏幕截图上看到差异.外部区域是我正在使用drawBitmap的那个,如下所示:
mSrcRectF.set(src_x1, src_y1, src_x2, src_y2);
mDesRectF.set(view_x1, view_y1, view_x2, view_y2);
mMatrix.setRectToRect(mSrcRectF, mDesRectF, Matrix.ScaleToFit.CENTER);
canvas.drawBitmap(bmp, mMatrix, mPagePaint);
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用其他变体drawBitmap(位图位图,Rect src,RectF dst,Paint paint)而没有矩阵我得到相同的结果.
我相信这个问题/差异可能与硬件加速有关.如果我将其关闭(在清单文件中),我会得到所有设备相同的结果.如果我打开它,除了Nexus之外,所有这些渲染都会得到改善,Nexus仍会显示更"像素化"的位图.我已经读过HA中不支持某些例程,但即便如此,我也无法理解在这种情况下发生了什么.在Romain Guy最近的博客中,他评论说:
请注意,在调用drawBitmap()的"简单"版本时,alpha位图仅适用于着色器.目前硬件加速不支持采用Matrix或源和目标矩形的变体.
有人可以对此有所了解吗?
Nexus 7:Nexus 7屏幕截图
Xoom(或Galaxy Tab,Kindle Fire):Xoom屏幕截图
我正在创建一个离屏位图+画布,将一堆较小的位图绘制到其中,然后将其绘制到视图中.isHardwareAccelerated()方法为我的画布返回false:
mBitmap = new Bitmap(500, 500, Bitmap.Config.RGB_565);
mCanvas = new Canvas(mBitmap);
mCanvas.isHardwareAccelerated(); // false
Run Code Online (Sandbox Code Playgroud)
我可以看到在我的View的onDraw()方法中给我的画布是硬件加速的:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.isHardwareAccelerated(); // true
// My current approach, but maybe better to draw directly
// to the view's canvas if it's hardware accelerated?
canvas.drawBitmap(mBitmap, ...);
}
Run Code Online (Sandbox Code Playgroud)
我想知道我们是否可以为屏幕外画布打开它?
我也想知道我是否应该直接绘制视图的硬件加速画布,而不是打扰屏幕外的画面,如果它不会加速.我认为首先将所有内容绘制到屏幕外会更快.
我必须重新组织我的代码来测试它,只是想知道我是否遗漏了屏幕外显示的东西.
谢谢
-------更新-----------------------------------
我重构了我的绘图代码,直接在onDraw()中直接绘制视图的画布,而不是使用离屏画布.性能更好.
尽管为屏幕外画布启用硬件加速仍然很好,但肯定有大量的用例.
我有"华擎"中的"Beebox".该机器的处理器是Intel Celeron N3150,支持VP8视频流的硬件编码和解码.我想在Google Chrome(在Debian Linux上)中使用此功能来进行WebRTC调用.但我不确定如何证明Chrome真正使用硬件编码/解码.
到目前为止我的发现
不幸的是,Linux上的情况非常令人困惑.除了不同的加速API(VAAPI,VDPAU等),其中我不知道Chrome实际上使用了哪些,Chrome通过以下方式增加了额外的混淆:
视频解码:仅限软件,硬件加速不可用
视频编码:硬件加速
在" chrome:// gpu "页面上.
编码:尽管ist说加速编码,但在将HD Video编码为VP8流时,我的CPU负载为60-70%.这对我来说看起来不像HW编码.
解码:就我在网上看到的而言,Linux下的Chrome上似乎根本不支持硬件解码.有一个名为--ignore-gpu-blacklist的Chrome开关确实将" 视频解码 "行从" 仅软件...... "变为" 硬件加速 ",但这并没有改变任何东西.我还与Kodi和VLC等不同的媒体播放器进行了一些研究.这些播放器在播放VP8时显示CPU负载约为25-30%,这确实可能是硬件解码,但令人惊讶的是,当我关闭这些播放器中的硬件编码时,根本没有任何变化.这反过来让我相信即使这些也不会在HW中解码.
工具: 我发现了一些工具,甚至来自英特尔,但大多数都是指GPU负载(这意味着3D加速).我还尝试了来自mesa-utils的glxinfo,其中说:" 直接渲染:是 ",并且根据该线程确认支持HW解码(?).但这只是说明支持是可用的,而不是当前是否有任何应用程序真正使用它.
题
当在Linux上编码或解码VP8视频流时,有没有办法清楚地验证硬件编码器和/或解码器是否正常工作?
我非常感谢你的帮助!
我正在使用 Xamarin 为 android 开发一个应用程序。我正在使用 Visual Studio 2017 和来自 Visual Studio 安装程序的 Xamarin 包附带的 Android SDK 模拟器。
模拟器很慢。我按照本文中的说明启用 Hyper-V 加速:https : //docs.microsoft.com/en-us/xamarin/android/get-started/installation/android-emulator/hardware-acceleration
这篇文章没有说必须设置 VM 或配置模拟器本身才能使用 Hyper-V,只说如何启用 Hyper-V...
模拟器还是慢。如何验证模拟器是否实际使用 Hyper-V?
hyper-v visual-studio hardware-acceleration android-emulator xamarin.android
我正在尝试实现 vp9 硬件加速编码过程。我遵循 ffmpeg 官方 github 的示例(此处 -> vaapi_encode.c)。
但给定的示例仅将 .yuv 文件保存到 .h264 文件,我想将帧保存到 .mp4 或 .webm 容器。并具有质量控制能力等。
我不是从文件中读取帧,而是从实时源中收集帧。当实时视频中有完整的 5 秒帧时,使用 vp9_vaapi 将这些帧编码为 5 秒 .mp4 文件。
我可以将实时直播中的所有 5 秒帧保存到 .mp4 或 .webm 文件中,但它们无法正确播放(更准确地说:继续加载,然后我打开)。
官方网站示例的结果:
cpu编码vp9 .mp4文件结果:
我正在尝试在树莓派 4B 型号上启用对 H264 编码的硬件支持。编译 FFmpeg 源以启用配置
sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-omx --enable-omx-rpi --enable-nonfree
Run Code Online (Sandbox Code Playgroud)
但是在正确构建和安装 ffmpeg 并正确配置这些配置后执行编码命令时,我收到以下错误
[h264_omx @ 0x156b6e0] Using OMX.broadcom.video_encode
[h264_omx @ 0x156b6e0] OMX error 80001000
[h264_omx @ 0x156b6e0] err 80001018 (-2147479528) on line 561
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!
Run Code Online (Sandbox Code Playgroud)
使用的命令:
ffmpeg -i /media/pi/pic_1_org.png -c:v h264_omx -c:a copy -b:v 1500k outputfile.mp4
Run Code Online (Sandbox Code Playgroud)
我只想使用 …
我一直在研究使用硬件加速的 h.264 编码和解码流式传输实时视频,并且我已经能够使用 Windows Media Foundation 使其工作。
我使用 d3d11 视频处理器将帧从 RGB 压缩为 NV12 格式,并使用硬件 MFT 编码为 h.264。
我现在唯一的问题是在解码和渲染视频后,锯齿和光晕效果与文本一起出现在屏幕上。
下面的图片显示了我的问题。
经过一番研究,我发现了H.264/AVC 444,其中微软通过引入带有 RDP 10 的全屏 AVC 444 模式解决了这个问题。
在 AVC 444 模式下,通过显着提高帧吞吐量,我们可以使用 4:2:0 硬件编码器/解码器获得 4:4:4 质量的文本。
介绍 AVC 444 模式 在远程桌面场景中使用 AVC/H.264 作为唯一的编解码器的主要挑战是文本显示具有典型 AVC/H.264 实现的光环效果。这是由作为压缩的一部分发生的颜色转换过程引起的,该过程丢弃了一些色度信息,如 4:2:0 格式所示。对于人眼来说,视频内容缺乏色度信息并不那么明显,但是对于主要使用文本的远程桌面场景,这是显而易见的,用户会认为这是模糊的。AVC/H.264 标准定义了使用 4:4:4 格式的能力,在转换过程中不会丢失色度,但是通常这不是大多数 AVC/H.264 硬件编码器和解码器实现的一部分,因此提供一个挑战。
我试图在 Media Foundation 中实现相同的目标,但尚未找到任何资源来破解它。
我发现颜色转换为 NV12 是这个问题背后的原因,我一直在努力解决它,我也尝试过 YUV 444,但找不到支持它的硬件 MFT。我无法使用硬件 MFT 编码除 NV12 之外的任何其他颜色格式
有什么办法可以克服这个问题吗?任何帮助将不胜感激。
directx video-streaming h.264 hardware-acceleration ms-media-foundation
我不完全确定 Stack Overflow 是否是提出这个问题的正确网站,但自从一周前一位朋友向我提到这个问题以来,我一直在思考这个问题。我知道硬件加速的基本功能:将某些工作负载卸载到计算机中的其他组件(即 GPU 或声卡),以提高各种应用程序的性能。我只是想知道当流式传输 Google Chrome 窗口时硬件加速打开/关闭时到底发生了什么,以及为什么它在完全不同的应用程序中产生差异。
如果您不熟悉我在标题中提到的内容,这里有一个简单的例子来说明我的意思:假设您想在 Discord 上与朋友一起观看 Netflix 节目或体育赛事,所以你们一起加入通话在应用程序上观看您在 Chrome 选项卡中流式传输视频。但是,当您的朋友加入流时,他们可以听到您正在流式传输的音频,但对于观看的人来说,视频源将被屏蔽。有趣的是,人们发现这个问题的解决方案之一是在 Google Chrome 的设置中禁用硬件加速,这样视频和音频就可以毫无问题地传输。
发生这种情况的原因是有道理的:为了防止潜在的盗版和非法重新分发文案材料,但为什么禁用硬件加速会重新启用此功能呢?硬件加速是否允许在应用程序之间共享数据?Discord 是否设置了一个标志,表示正在流式传输特定窗口/屏幕,并且 Chrome 只能在启用硬件加速时“看到”该标志?
我想根本的问题是:启用硬件加速如何让 Netflix、电视提供商或任何其他网站知道他们的内容正在流式传输?
请随意为这篇文章推荐其他标签,不想包含不和谐,因为它没有引用他们的 API
编辑:另外,请告诉我这是否偏离主题,以便我可以将其删除并重新发布到另一个网站上
此代码使用位图的Alpha通道绘制单一颜色(带alpha)形状.
Bitmap alphaMask = bitmap.extractAlpha();
Paint paint = new Paint();
int color = Color.GRAY;
...
paint.setColor(color);
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.DST_IN));
...
canvas.drawBitmap(alphaMask, x, y, paint);
Run Code Online (Sandbox Code Playgroud)
例如,它将采用左侧Bitmap并将其绘制到画布上,如右图所示:

但是,当打开硬件加速时,它不适用于Honeycomb(Android 3.0).无论如何,它都会将形状描绘成黑色.它忽略了颜色值.但是,它可以在ICS(Android 4.0)上运行硬件加速.
我知道硬件加速不支持某些API,正如Romain Guy在此处所述,在支持哪些绘图操作下?,但我似乎没有使用任何提到的不支持.
另外,听起来他说setColorFilter应该在这篇文章中工作.
我的代码中有什么东西在Honeycomb中不受支持吗?任何解决方法?在这种情况下,我希望保持硬件加速.
谢谢
有没有办法强制在ListView中加速硬件.我有一个包含400多个项目的ListView,图标滚动非常慢.每个项目都有相同的图标.我还添加了一个ViewHolder.在清单文件中,我启用了硬件加速.当我运行此代码时:
ListView list_new = (ListView) findViewById(R.id.listview01);
list_new.isHardwareAccelerated();
Run Code Online (Sandbox Code Playgroud)
它返回false.我的手机是带果冻豆的Nexus S. 我如何强制硬件加速?
编辑: 这是我的ListView:
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:persistentDrawingCache="scrolling"
android:hardwareAccelerated="true"
android:fastScrollEnabled="true"
android:scrollingCache="true"
android:smoothScrollbar="true" >
</ListView>
Run Code Online (Sandbox Code Playgroud)