- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从 UWP 中的一些 RenderTargetBitmap
创建视频。我通过使用 MediaClips
来做到这一点。从 RenderTargetBitmap
我可以获得一个 IBuffer
或像素字节数组。要创建一个 MediaClip
,我需要一个图像文件或一个 IDirect3DSurface
。创建图像只是为了创建剪辑非常昂贵,所以我想到了使用 IDirect3DSurface
。我怎样才能做到这一点?我试过这个:
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(RenderedGrid, 100, 100);
IBuffer pixels = await renderTargetBitmap.GetPixelsAsync();
var values = Enum.GetValues(typeof(DirectXPixelFormat));
CanvasBitmap bitmap=null;
foreach (DirectXPixelFormat format in values)
{
try
{
videoClip = new MediaComposition();
bitmap = CanvasBitmap.CreateFromBytes(myWidget.Device, pixels, renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight, format);
StorageFile video2 = await storageFolder.CreateFileAsync("video2" + ".mp4", CreationCollisionOption.ReplaceExisting);
MediaClip d = MediaClip.CreateFromSurface(bitmap, DateTime.Now - previousFrame+new TimeSpan(100));
videoClip.Clips.Add(d);
await videoClip.RenderToFileAsync(video2);
break;
}
catch(Exception e)
{
}
}
我尝试了 DirectXPixelFormat
中的所有格式,但都不起作用。
我有一个名为 myWidget
的 CanvasControl
是空的。
我从 Ibuffer
创建了一个 CanvasBitmap
(CanvasBitmap
实现了 IDirect3DSurface
)
从 CanvasBitmap
创建一个 Mediaclip
将其添加到 MediaComposition
。
然后我尝试渲染到视频文件。当我尝试保存到文件时它抛出一个错误
System.Runtime.InteropServices.COMException Stream is not in a state to handle the request.
编辑:我想出了问题出在哪里,但不知道为什么,也不知道如何解决。
await videoClip.SaveAsync(video2);
videoClip= await MediaComposition.LoadAsync(video2);
var x=await videoClip.RenderToFileAsync(video2);
现在用这三行我可以保存视频,但是只使用第三行它会抛出上面的错误。我无法理解它。为什么保存和加载可以解决问题??
最佳答案
最可能的原因是,CanvasBitmap
有一个底层的 IDirce3DSurface
对象以及像 byte[]
或其他东西的图像数据,虽然我不确定这一点。
如果这是真的,那么从 byte[]
或 IBuffer
创建一个 CanvasBitmap
将不会影响底层的 IDirect3DSurface
,将只构建图像部分。您可以看到,通过将该图像保存在磁盘上,它没有给出任何错误。
但是如果您想跳过在磁盘上保存数据,我认为有一个解决方法:
如果你这样做,你可以构造底层 IDirect3DSurface
Offscreen Drawing到 CanvasRenderTarget .
因此,您可以使用 CanvasBitmap
构建一个 CanvasRenderTarget
,然后使用该 CanvasRenderTarget
构建一个 MediaClip
:
CanvasRenderTarget rendertarget;
using (CanvasBitmap canvas = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), pixels, renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight, format))
{
rendertarget = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), canvas.SizeInPixels.Width, canvas.SizeInPixels.Height, 96);
using (CanvasDrawingSession ds = rendertarget.CreateDrawingSession())
{
ds.Clear(Colors.Black);
ds.DrawImage(canvas);
}
}
MediaClip d = MediaClip.CreateFromSurface(renderTarget, TimeSpan.FromMilliseconds(80));
mc.Clips.Add(m);
关于c# - 如何从 UWP 中的 IBuffer 或字节数组创建 IDirect3DSurface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51027900/
我使用ibuffer并且打开了几个框架。我的 ibuffer 最常见的用例是按名称/文件名过滤缓冲区列表 (C-x C-b)。问题是过滤器对所有帧都以相同的方式工作(我相信这是预测的)。我希望必须对每
我使用ibuffer 并打开了几个框架。我对 ibuffer 非常频繁的用例是按名称/文件名过滤缓冲区列表 (C-x C-b)。问题是过滤器对所有帧都以相同的方式工作(我相信这是预测的)。我想为我拥有
在构建过程中,他们提到要获得 IBuffer,在字节数组上有一个名为 AsBuffer() 的扩展方法。不幸的是,他们没有提到它隐藏在哪个命名空间中,并且似乎不在我添加的许多命名空间中。有没有人发现它
如果我有一个 IRandomAccessStream 对象,我该如何创建一个 IBuffer 对象? 最佳答案 我发现最简单的方法是通过 MemoryStream.GetWindowsRuntimeB
我知道我可以将 IBuffer 转换为 Stream,然后从那里转换为 IRandomAccessStream。但是必须有一个直接的方法。 最佳答案 IBuffer 不是一个流,所以您需要有一些东西来
如何根据缓冲区类型为 ibuffer 中的条目着色? 基于缓冲区的模式 - 例如python模式是蓝色,lisp模式是黄色等...... 这可能吗 ? 最佳答案 基于@lawlist 的评论,这里有一
我正在努力连接两个 API。从一个我得到一个 Windows::Storage::IBuffer ,另一个要求 ComPtr.我似乎没有找到一种方法来桥接这两者,即使我想在流中复制数据。 到目前为止,
我需要通过 TCP 连接传输一个字符串。为此,我一次性序列化了我的对象(超过 10000 行列表),没有预期。但是大字符串不会传输(据我所知,由于缓冲区大小)。所以 MSDN,在这个页面 ( http
如何将 C#(UWP 应用程序)中类型为 IBuffer 的变量复制到字符串? IBuffer 本身似乎没有任何方法。它的长度似乎是正确的值。但是我看不到调试器中的值(说需要 native 调试)。下
我想从 UWP 中的一些 RenderTargetBitmap 创建视频。我通过使用 MediaClips 来做到这一点。从 RenderTargetBitmap 我可以获得一个 IBuffer 或像
我有一个实现接口(interface) Windows::Storage::Streams::IBuffer 的对象,我想从中获取一个字节数组,但是在查看该接口(interface)的文档时看起来毫无
Windows.Security.Cryptography.CryptographicBuffer 类包含用于在字符串和 IBuffer 实现对象之间进行转换的静态方法,该对象可由加密函数使用。这些对
这个问题在这里已经有了答案: How to wrap a char* buffer in a WinRT IBuffer in C++ (2 个答案) 关闭 5 年前。 如何在通用 Windows
我想实现一个包装 char* 缓冲区的 C++ WinRT IBuffer,因此我可以将它与接受 IBuffer^ 参数的 WinRT WriteAsync/ReadAsync 操作一起使用。 编辑
我正在为 Windows Phone 8.1 编写应用程序。 我需要将 UIElement 保存为图像文件(我更喜欢 JPG 或 PNG)。我正在使用 RenderTargetBitmap 类来执行此
当我处理多个框架时,我想决定 Emacs 应该在哪个框架中打开文件/缓冲区。 最佳答案 你不能开箱即用。 有 find-buffer-other-frame 等,但它们会打开一个新框架。 您可以像这样
我想从 C# 转换为 C++ 并将缓冲区再次返回给 C#如何将 IBuffer 转换为“const unsigned char *data”并再次转换为 IBuffer Windows::Storag
我是一名优秀的程序员,十分优秀!