将 VideoFrame 转换为字节数组
Posted
技术标签:
【中文标题】将 VideoFrame 转换为字节数组【英文标题】:Converting a VideoFrame to a byte array 【发布时间】:2015-09-20 05:07:31 【问题描述】:我一直在尝试将捕获的VideoFrame 对象转换为字节数组,但收效甚微。从文档中可以清楚地看出,每一帧都可以保存到SoftwareBitmap 对象中,例如
SoftwareBitmap bitmap = frame.SoftwareBitmap;
我已经能够将此位图保存为图像,但我想获取它的数据并将其存储在字节数组中。许多 SO 问题已经解决了这个问题但是 SoftwareBitmap 属于 Windows.Graphics.Imaging 命名空间(不是其他 SO 帖子地址的更典型的 Xaml.Controls.Image,such as this one)所以传统方法像image.Save()
不可用。
似乎每个 SoftwareBitmap 都有一个 CopyToBuffer()
方法,但是关于如何实际使用它的文档非常简洁。而且我也不确定这是否是正确的方法?
编辑:
使用下面 Alan 的建议,我已经成功地完成了这项工作。我不确定它是否有用,但如果其他人遇到此问题,这是我使用的代码:
private void convertFrameToByteArray(SoftwareBitmap bitmap)
byte[] bytes;
WriteableBitmap newBitmap = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
bitmap.CopyToBuffer(newBitmap.PixelBuffer);
using (Stream stream = newBitmap.PixelBuffer.AsStream())
using (MemoryStream memoryStream = new MemoryStream())
stream.CopyTo(memoryStream);
bytes = memoryStream.ToArray();
// do what you want with the acquired bytes
this.videoFramesAsBytes.Add(bytes);
【问题讨论】:
【参考方案1】:对于希望从SoftwareBitmap
(例如 jpeg)访问 编码 byte[]
数组的任何人:
private async void PlayWithData(SoftwareBitmap softwareBitmap)
var data = await EncodedBytes(softwareBitmap, BitmapEncoder.JpegEncoderId);
// todo: save the bytes to a DB, etc
private async Task<byte[]> EncodedBytes(SoftwareBitmap soft, Guid encoderId)
byte[] array = null;
// First: Use an encoder to copy from SoftwareBitmap to an in-mem stream (FlushAsync)
// Next: Use ReadAsync on the in-mem stream to get byte[] array
using (var ms = new InMemoryRandomAccessStream())
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, ms);
encoder.SetSoftwareBitmap(soft);
try
await encoder.FlushAsync();
catch ( Exception ex ) return new byte[0];
array = new byte[ms.Size];
await ms.ReadAsync(array.AsBuffer(), (uint)ms.Size, InputStreamOptions.None);
return array;
【讨论】:
【参考方案2】:通过使用CopyToBuffer()
方法,您可以将像素数据复制到WriteableBitmap 的PixelBuffer 中。
那我想你可以参考the answer in this question将其转换为字节数组。
【讨论】:
以上是关于将 VideoFrame 转换为字节数组的主要内容,如果未能解决你的问题,请参考以下文章