【问题标题】:new Dart ByteBuffer from region of existing ByteBuffer?来自现有 ByteBuffer 区域的新 Dart ByteBuffer?
【发布时间】:2017-08-07 21:31:22
【问题描述】:

我在 Dart Web 应用程序中加载二进制文件,其中包括压缩音频数据作为二进制数据的一部分。当通过 http 请求加载数据时,它以 ByteBuffer 的形式出现,据我所知,这是 Dart 对 JS ArrayBuffer 的替代品。 AudioContext.decodeAudioData() 方法需要一个 ByteBuffer,我试图弄清楚如何给它加载的 ByteBuffer 的相关部分。加载的 ByteBuffer 包含与音频无关的附加数据。 JS 中的 ArrayBuffers 支持 slice() 方法,但我在 ByteBuffer 类中缺少此方法,并且在转换为允许范围选择的任何列表后,我看不到任何返回 ByteBuffer 的方法。

我想我可以使用原始 JS 创建一个混合解决方案,但如果可能的话,我想将它保留在 Dart 中。想法赞赏!

【问题讨论】:

    标签: dart


    【解决方案1】:

    Dart ByteBuffer 没有切片方法。您可以通过Uint8List 进行检查,因此您可以使用buffer.asUint8List().sublist(a, b).buffer 而不是buffer.slice(a, b)。类型化数据列表上的sublist 方法返回由新缓冲区支持的相同类型的列表,buffer getter 返回任何类型化数据列表的底层缓冲区。 它不如直接在缓冲区上的slice 漂亮,但它可以在没有任何对齐问题的情况下完成工作(Int32List 要求其起始偏移量为 4 字节对齐,因此对于任意切割,始终使用 8 -位列表)。

    【讨论】:

    • 谢谢!这是一种简洁的方法,也是选择 1 字节列表类型的好方法。
    • 它在哪里说sublistnew 缓冲区支持?我在documentation 中只能找到它返回“一个新列表”。我在 DartPad 中尝试过,它似乎可以工作,但我担心这是一个实现细节。
    【解决方案2】:

    在转换为 ByteBuffer 后,我看不到任何返回字节缓冲区的方法 任何允许范围选择的列表

    有几种方法可以解决这个问题,但由于您不想修改原始缓冲区(我猜),因此您将复制几个字节:

    // extract 2 ints (8 bytes) - no copying done yet
    var rangeIterable = buffer.asInt32List().getRange(8, 10);
    
    // create new typed list (copies the bytes from the iterable)
    var newList = new Int32List.fromList(rangeIterable);
    var newBuffer = newList.buffer;
    
    print(buffer.lengthInBytes);
    print(newBuffer.lengthInBytes);
    

    【讨论】:

    • 非常感谢!我认为对此的一个小补充是应该在 rangeIterable 上调用 toList() 以与 Int32List.fromList() 一起使用。我什至没有想到在创建新的 Int32List 时会填充缓冲区属性。我已经习惯了这只是对原始数据的引用,但是它代表复制的数据当然是有道理的。
    • 您真的需要添加.toList()吗?因为当我在本地尝试时它就像那样工作(即没有强模式)。
    • 我相信是的。当我在没有它的情况下尝试它时,它给了我一个类型转换错误。 “type 'SubListIterable' is not a subtype of type 'List' of 'elements'” 请注意,我正在 Dartium 中进行测试,从 Intellij 启动,我认为这可能会默认启用检查模式 - 会这样做?
    • 很有可能 - 我在控制台应用程序中尝试过 :)
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多