Web硬件编解码-WebCodec
WebCodec 是一个较新的 Web API,它为网页应用提供了接近硬件级的编解码能力。使用 WebCodec,开发者可以在浏览器中直接对音频和视频数据进行高效编解码,这对于实现复杂的媒体应用(如实时视频通信、视频编辑和游戏流)非常有用。
WebCodec 编解码流程
解码
创建解码器
设置解码器名称
WebCodec设置上参数与其它平台不同的一点,在于其名称字段比较繁琐
1 | if (VideoType == H264) |
WebCodec 是一个较新的 Web API,它为网页应用提供了接近硬件级的编解码能力。使用 WebCodec,开发者可以在浏览器中直接对音频和视频数据进行高效编解码,这对于实现复杂的媒体应用(如实时视频通信、视频编辑和游戏流)非常有用。
WebCodec设置上参数与其它平台不同的一点,在于其名称字段比较繁琐
1 | if (VideoType == H264) |
std::declval
的作用std::declval
是 C++ 标准库中的一个工具,用于在不创建对象的情况下获得一个类型的引用。其主要作用是在编译时期在表达式中使用一个类型的实例而不实际构造对象。这在模板元编程和 SFINAE 中尤其有用,因为它允许我们在编译时对类型的潜在成员进行推断和检查。
std::declval
在 <utility>
头文件中定义,并且仅在 unevaluated context(未求值上下文,例如 sizeof 和 decltype 中)是合法的,这意味着它不能用于在运行时创建对象。
std::declval
的使用场景最常见的场景是在使用 decltype
来推导表达式的类型时,尤其是当你需要推导一个类的成员函数的返回类型,但又不想或不能创建这个类的实例。
例如,下面的代码展示了如何使用 std::declval
来推导成员函数的返回类型:
1 | #include <utility> |
在这里,decltype
用来确定 myFunction
的返回类型,而 std::declval<MyClass>()
“假装” 有一个 MyClass
的对象来允许我们调用成员函数。
在 SFINAE(替换失败并非错误)或写类型萃取(trait)时,std::declval
能够确保在没有默认构造函数的情况下依然能进行操作。
1 | #include <type_traits> |
在这个例子中,即使 MyClass
没有默认构造函数,我们也能用 std::declval
来进行编译时检查。
在某些复杂的重载决策场景中,你可能希望根据类型是否支持某个操作来选择不同的函数重载。std::declval
可以在不创建对象的情况下 “假设” 该对象的存在,以便进行这样的检查。
1 | #include <iostream> |
这里 std::declval
在编译时帮助确定 T
类型是否有一个名为 print
的成员函数。
std::declval
是模板编程中一个极为有用的工具,它能够让程序员在不实例化对象的情况下引用任意类型,特别是在仅仅需要类型信息而不需要对象的场合。它通常与 decltype
结合使用,以便在编译时对表达式类型进行操作和推导。由于 std::declval
仅在未求值上下文中有效,因此它
主要用于模板元编程和编译时类型推导,而不是在实际运行时代码中创建对象。
SFINAE 是 “Substitution Failure Is Not An Error” 的缩写。这是 C++ 模板元编程中的一个重要概念,它允许在模板类型推导过程中,如果某个替换失败,这个失败不会立即导致编译错误。而是使得编译器简单地放弃这次替换,并尝试其他重载或模板特化。
SFINAE 最常见的用途包括:
在 C++11 及其之后的版本中,SFINAE 最常见的实现方式是使用 decltype
、std::enable_if
和类型特征(如 std::is_integral
等)。下面是一些使用 SFINAE 的例子:
std::enable_if
禁用某些函数重载1 | #include <type_traits> |
在这个例子中,foo
函数模板有两个重载。通过 std::enable_if
,我们能够让编译器在模板类型是整型时选择第一个重载,在模板类型是浮点型时选择第二个重载。
1 | #include <type_traits> |
在这个例子中,我们使用模板特化和 decltype
来检查 MyType
是否有一个接受 int
参数的 serialize
成员函数,decltype
检测函数返回类型时,函数只需声明即可,无需实现。
C++17 引入了 if constexpr
和 auto
类型推导的新特性,让 SFINAE 使用起来更为方便。
if constexpr
1 | template<typename T> |
这个例子演示了如何在函数模板内部使用 `
if constexpr` 来在编译时选择执行路径,这样可以在不生成错误的情况下根据类型条件编译代码。
SFINAE 是 C++ 模板编程中一项强大的技术,可以用来在编译时根据类型特性来选择不同的代码路径。虽然 SFINAE 可以使代码变得非常灵活,但它也可能使得代码难以阅读和维护。随着 C++ 标准的发展,引入了更简洁的特性如 if constexpr
和概念(C++20 中的 concepts),它们可以使得之前需要 SFINAE 来实现的功能变得更简单和直观。
OpenGL的着色器使用GLSL语言编写,类C风格。一个着色器由变量声明和main函数组成, 能声明的变量数量是有限的,具体由硬件决定。
1 | #version 330 core |
通俗来讲,OpenGL是一个图形库,提供了一系列操作图形图像的API。因为OpenGL只是一个规范,具体的实现一般是由显卡提供。类似的图形库还有Windows平台的DirectX、iOS平台的Metal以及新一代的Vulkan
图形渲染管线也叫做渲染流水线,指的是将输入的原始图形数据经过渲染管线处理,输出一帧想要的图像的过程。
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,所以图形渲染管线主要是在将输入的3D坐标转换成2D坐标,再将2D坐标转换成实际有颜色的像素。(将输入的3D坐标画在3D坐标系中,然后根据视锥范围截取一个2D平面,将截取的平面转换为平面坐标显示)
2D坐标精确的表示一个点在2D空间的位置;而像素是这个点的近似值,像素的显示受到屏幕分辨率的限制