将 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 转换为字节数组的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为字符串并返回字节数组的问题

将字符串数组转换为字节数组

将 ctype 字节数组转换为字节

将 3 维字节数组转换为单字节数组 [关闭]

Java:将字节列表转换为字节数组

如何将字节数组的字符串转换为字节数组