ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras

2023-10-13 23:30

本文主要是介绍ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[1] Mur-Artal R, Tardós J D. ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras[J]. IEEE Transactions on Robotics, 2017, 33(5): 1-8.

为了方便阅读转自【泡泡机器人翻译专栏】ORB-SLAM2:一种开源的VSLAM方案 同时做了一些小修改。


 

摘要

ORB-SLAM2是基于单目,双目和RGB-D相机的一套完整的SLAM方案。它能够实现地图重用,回环检测和重新定位的功能。无论是在室内的小型手持设备,还是到工厂环境的无人机和城市里驾驶的汽车,ORB-SLAM2都能够在标准的CPU上进行实时工作。ORB-SLAM2在后端上采用的是基于单目和双目的光束法平差优化(BA)的方式,这个方法允许米制比例尺的轨迹精确度评估。此外,ORB-SLAM2包含一个轻量级的定位模式,该模式能够在允许零点漂移的条件下,利用视觉里程计来追踪未建图的区域并且匹配特征点。

我们用29个广泛使用的公共数据测试的结果显示,在大多数情况下,本文方案比此前方案精度更高,此外,我们开源了ORB-SLAM2源代码,不仅仅是为了整个SLAM领域,同时也希望能够为其他领域研究者提供一套SLAM的解决方案。

I. 引言

SLAM(同时定位与地图重建)在过去的20年中,一直是计算机视觉和机器人领域的热门话题,同时也吸引了很多高科技公司的关注。SLAM技术是在未知的环境当中建立一个地图并且能够在地图当中实时的定位。在不同类型的传感器当中,相机十分廉价,并且能够提供丰富的环境信息,受到研究者的青睐。相机提供的图像信息可以用作鲁棒的和精确的位置识别。位置识别是SLAM系统中回环检测的关键模块(例如,当传感器检测到一个已经建好图的位置的时候,可以进行修正在探索过程中的误差)以及,能够修正由于剧烈的震动或者在系统进行初始化的时候在相机跟踪失败后的重新定位。因此以相机为核心的视觉SLAM在过去的一年中得到快速的发展。

视觉SLAM仅仅通过一个单目相机就能够完成。单目相机也是最便宜也是最小巧的传感器设备。然而深度信息无法从单目相机中观测到,地图的尺度和预测轨迹是未知的。此外,由于不能从第一帧当中进行三角测量化,单目视觉SLAM系统的启动往往需要多个视角或者滤波技术才能产生一个初始化的地图。最后,单目SLAM可能会造成尺度漂移,以及在探索的过程中执行纯旋转的时候可能会失败。通过使用一个双目或者RGB-D相机将会解决这些问题,并且能够成为一种更加有效的视觉SLAM的解决方案。

在这篇文章当中,我们在单目ORB-SLAM[1]的基础上提出ORB-SLAM2,有以下贡献:

1. 这是首个基于单目,双目和RGB-D相机的开源SLAM方案,这个方案包括,回环检测,地图重用和重定位。

2. 我们的RGB-D结果说明,光速法平差优化(BA)比ICP或者光度和深度误差最小方法的更加精确。

3. 通过匹配远处和近处的双目匹配的点和单目观测,我们的双目的结果比直接使用双目系统更加精确。

4. 针对无法建图的情况,提出了一个轻量级的定位模式 ,能够更加有效的重用地图。

(a)双目输入:带有多次回环检测的城市环境轨迹和稀疏重建

(b) RGB-D输入:房间关键帧和稠密点云已经一次回环检测图,这些点云通过对深度图的关键帧的位姿进行映射得到,不进行渲染(融合)

图1 是ORB-SLAM2处理双目和RGB-D输入评估相机的轨迹并建图。这个系统能够保证在高精度和鲁棒性的前提下,做到在标准CPU上进行实时的,回环检测,重定位以及地图重用。

图a中显示的是双目和RGB输入下的ORBSLAM2的输出。双目例子显示的是最后轨迹和稀疏重建的地图。这里的数据集来源于KITTI的Sequence00数据集。这个城市数据集是ORB-SLAM2多次成功提取特征,并且回环检测而来。

RGB-D例子是来源于TUM 的RGB-D 数据库中的fr1_room的数据集,并且进行关键帧的位姿评估而来。通过评估关键帧的位姿,映射深度图,最终形成一个稠密的点云图。指的注意的一点是,ORB-SLAM2虽不像Kinect Fusion一样进行数据融合,但是却能够很精确的估计关键帧的位姿。更多的例子在附件视频中展示。在余下的篇章当中,我们将会在第二部分讨论相关的工作。在第三部分谈论ORB-SLAM2系统框架。第四部分评价ORB-SLAM2,第五部分得出结论。

II. 相关工作

在这个章节,我们将会讨论双目和RGB-D SLAM的相关工作。评估部分我们放在第四部分,本章我们主要讨论的是SLAM的方法。

2.1双目SLAM

最早研究双目SLAM方案的是Paz 等人[5],基于条件独立分割和扩展SLAM,其显著特点是能够在大场景中运行。更重要的是,这是第一个使用近特征点和远特征点(例如,由于双目相机差异较小,导致点的深度不能准确的估计)的双目SLAM系统,使用一个逆深度参数进行估计。经验值表明如果深度小于40倍双目的基线,那么这个点就能被三角测量化。我们就是跟随的这样思想来处理远近不同的特征点,具体解释放在第三部分。

目前大多数双目系统都是基于特征匹配和局部BA优化的方式,来获得尺度。Strasdat等人[8]采用在一个输出窗口的关键帧[7]和位姿的BA联合优化算法。在全局不一致性的情况下,通过限制窗口的大小的方式,实现了约束了时间的复杂程度的目的。Mei等人[9]在限定时间复杂度的条件下,使用路标和位姿相关性的方式的实现了RSLAM解决方案,并且提出和实现了在活动的区域的BA优化算法。即使在全局不一致的条件下,RSLAM也能够进行闭环,同时会扩大回环两侧的活动区域。

Pire等人[10]把局部的BA运用到了邻近S-PTAM上面来,但是,这种方法缺少大量的回环检测。与此相似的是,我们对局部关键帧采用BA优化,因此,这个地图的大小和复杂程度的大小是独立的,进而,我们可以在一个大场景当中运行。然而,我们目标是建立一个全局不变的地图。因此,我们的系统首先在回环的两端执行。这与RSLAM很相似,以便于能够使用旧的地图进行定位,之后进行位姿估计,即将回环产生的累积漂移最小化。

Engel等人[11]提出邻近双目LSD-SLAM方案,采用的是一种直接的半稠密方法,最小化高梯度的图像区域中的光度误差。这种方法希望能够在不依赖特征提取的条件下,能够在纹理不清或者模糊运动的过程中获得更高的鲁棒性。然而,直接法的性能会由于滚动(卷帘)快门,或者非朗伯反射的未建模的因素影响而下降。

2.2 RGB-D SLAM

最早和最著名的RGB-DSLAM系统是有Newcombe等人[4]提出的KinectFusion,这种方法将深度数据进行融合,深度数据来源于传感器到深度模型,常常使用ICP算法来跟踪相机的位姿。由于体积的表现形式和缺乏回环检测,这种算法只能工作在小的工作空间。Whelan 等人[12]提出的Kintinuous能够在大环境中运行。它通过使用一个滚动循环缓冲器和包括使用位置定位和位姿优化来达到回环检测的目的。

第一个开源的RGB-DSLAM方案是由Endres[13]提出的,这是一种基于特征点提取的系统,他的前端采用提取和匹配特征点和ICP来计算帧与帧之间的运动。

后端采用位姿图优化的方式,回环检测约束条件来源于一个启发式搜索。相似的是,Kerl 等人[14]提出的DVO-SLAM,是在关键帧与关键帧之间的优化位姿图,视觉里程计通过计算最小化光度和深度误差来计算约束条件。DVO-SLAM同时在以前的所有帧当中,搜索回环的候选者,而不依赖于位置识别。

Whelan等人[15]提出的邻近ElasticFusion算法,是建立在基于确定环境的地图。这是一种以地图为中心的方法。这种方法忽略了非刚性形变地图的位姿和回环检测的性能,也是不是一个标准的位姿图优化。这种方法在重建和定位的精度都是十分优秀的,但是目前的应用十分有限对于一个房间大小的地图,由于在地图当中面元的数量影响计算的复杂程度。

Strasdat等人[8]提出ORB-SLAM2这种方法,这个方法使用深度信息去合成一个三维坐标,能够精确的提取到一副图像的信息。ORB-SLAM2能够处理来自双目和RGB-D的图像,与上述方法不同的是,我们的后端是用的BA算法,来建立一个全局的稀疏的地图重建,因此我们的方法更加轻量级并且能够在标准的CPU上面运行。我们的目标是长时间并且全局精准定位,而不是建立一个有很多细节的稠密地图。然而,高精度的关键帧的位姿,能够融合深度图像以及在计算中得到精准的重建,或者能够处理所有的关键帧和深度图,以及所有的BA并且得到一个精准的3D模型。

III. ORBSLAM2

针对双目相机和RGB-D相机的ORB-SLAM2建立在单目ORB-SLAM的基础上,它的核心组件,如图2所示。

图2 ORB-SLAM2由三个平行的线程组成,跟踪,局部建图和回环检测。在一次回环检测后,会执行第四个线程,去执行BA优化。跟踪的线程在双目或者RGB-D输入之前进行,因此剩下的系统模块能够跟传感器模块独立运行。单目的ORB-SLAM2工作图也是这幅图。

这个系统主要有3个并行的线程:

1、通过寻找对局部地图的特征,并且进行匹配,以及只运用BA算法来最小化重投影误差,进行跟踪和定位每帧的相机。

2、运用局部的BA算法设置局比地图并且优化。

3、回环检测检能够通过执行位姿图的优化来更正累计漂移误差。在位姿优化之后,会启动第四个线程来执行全局BA算法,来计算整个系统最优结构和运动的结果。

这个系统是一个基于DBoW2[16]的嵌入式位置识别模型,来达到重定位,防止跟踪失败(如遮挡),或者已知地图的场景重初始化,和回环检测的目的。这个系统产生关联可见的图[8],连接两个关键帧的共同点,连接所有关键帧的最小生成树方面。这些关键帧的图结构能够得到一个关键帧的局部的窗口,以便于跟踪和局部建图,并且在大型的环境当中的回环检测部分,作为一种图优化的结构。

这个系统使用相同的ORB特征进行跟踪,建图和位置识别的任务。这些特征在旋转不变和尺度不变性上有良好的鲁棒性,同时对相机的自动增益,曝光和光线的变化表现出良好的稳定性。并且能够迅速的提取特征和进行匹配,能够满足实时操作的需求,能够在基于词袋的位置识别过程中,显示出良好的精度[18]。

在本章的剩下的部分当中,我将会展示双目或者深度信息是如何利用,和到底会影响系统中的那些部分。对每个系统块更详尽的描述,可参见论文[1]

3.1 单目、近处双目和远处双目特征点

ORB-SLAM2作为一种基于特征提取的方法,在一些关键的位置上的提取进行预处理,如图2b所示,系统的所有运行都是基于输入图像的特征展开,而不依赖于双目或者RGB-D的相机。我们的系统处理单目或者双目的特征点,分成远处特征点和近处特征点两类。

双目特征点 通过三个坐标定义当中,是这个左边图像的坐标,是右图当中的水平坐标。对于双目相机而言,我们提取两幅图像当中的ORB特征,对于每个左边的ORB特征我们对其匹配到右边的图像中。这对于建设双目图像校正十分有效,因此极线是水平的。之后我们会在左边的图像产生双目的ORB特征点,和一条水平的线向右边的图像进行匹配,通过修补相关性来重新定义亚像素。对于RGB-D相机,正如Strasdat等人[8]所言,我们提取在图像通道上提取ORB特征点,。我们将深度值和已经处理的深度地图,和基线在结构光投影器和红外相机进行匹配,对每一帧的图像与右边图像的坐标系进行融合。这是kinect和华硕 Xtion 精度大约是8cm。

近双目特征点的定义是:匹配的深度值小于40倍双目或者RGB-D的基线,否则的话,是远特征点。近的特征点能够从一帧的深度值能够三角测量化,是精确的估计,并且能够提供尺度,平移和旋转的信息。另外一方面,远的特征点,能够提供精确的旋转信息,但是很少的尺度和平移信息。当提供多视图的时候,我们才能三角化那些远的点。

单目的特征点通过右边图像的两个坐标当中的定义,必须保证所有的ORB特征是一致的,否则双目特征点的提取将不能够完整,或者在RGB-D的情况下,有产生一个无效的深度值。这些点仅能够从多视图中三角测量化并且不能够提供尺度信息,但是可以提供旋转和平移的估计信息。

3.2 系统引导

使用双目和RGB-D相机的主要优势在于,我们可以直接获得深度信息,我们不需要像单目情况中那样做一个特定的SFM初始化。在系统初始化的时候,我们就创造了一个关键帧(也就是第一帧),将他的位姿进行初始化,从所有的立体点中创造一个初始化地图。

3.3 使用单目或者双目光束优化法

我们的系统采用光束优化法(BA),优化在跟踪过程(纯运动BA)中相机的位姿,优化本地窗口的关键帧和局部地图的特征点(局部BA),并且在回环检测之后优化所有的关键帧和特征点(全局BA)。我们在g2o当中使用Levenberg-Marquadt方法[19]。

纯运动BA,优化相机旋转矩阵和位置,最小化世界坐标系下匹配3D点云和特征点(单目的或双目的,其中)的重投影误差:

在这个式子当中,是强健的Huber的cost函数,是协方差矩阵,关联对于特征点的尺度。这个投影函数,单目的时候使用,修正双目的时候用,他们的定义如下:

在这个式子当中是焦距,是主要点(象点),b是基线,所有的这些参数都是通过标定获得。

局部BA 采用一系列可用的关键帧和所有在关键帧可观点,所有的其他关键帧是,而不是,观察当中所有的特征点用于代价函数,但是在优化中是固定的。定义为中关键帧k的一系列匹配特征点,这个优化问题如下:

全局BA是 局部光束法的一个特例,这个方法除了初始帧所有的关键帧和点在地图当中都会被优化.初始帧是固定的,用来消除随机化。

3.4 闭环检测和全局BA

回环检测有两步:首先,一个回环信息被确定检测到,然后利用这个回环纠正和优化位姿图。相比于单目的ORB-SLAM中可能出现尺度漂移的地方[20],这个双目或者深度的信息将会使得尺度信息可观测。并且,几何校验和位姿图优化将不再需要处理尺度漂移,而且是基于刚体变换的,而不是基于相似性。

在ORB-SLAM2的位姿优化后,我们包含一个全局的BA优化,为了实现一个优化方案,我们必须采用一个独立的线程,允许系统能够持续的建图,并且检测到回环信息。但是这将会再次触发全局BA优化与当前地图的合成。如果在优化运行时检测到新的循环,我们将中止优化并继续关闭循环,这将再次启动完整的BA优化。当完整的BA结束时,我们需要将更新的关键帧子集和由完整BA优化的点与未更新的关键帧和在优化运行时插入的点合并。最后通过更新更新关键帧校正(例如,这个变换从未优化到已优化)到一个未更新关键帧通过生成树当中。根据校正参考帧来改造呢些未更新的特征点。

3.5 关键帧的插入

ORB-SLAM2遵循在单目ORB-SLAM中提的法则,即经常插入关键帧并且剔除上一帧的冗余。在远近特征点的差异为我们插入一个新的关键帧提供了条件,这在大场景的条件下是至关重要的,如图3所示。

图3 高速公路的跟踪点。绿色的特征点深度小于40倍双目的基线,蓝色特征点大于40倍双目的基线,在这种数据集当中,需要插入大量的关键帧,以便于能够让近处的特征点更加精确的估计平移和尺度,远处的特征点来估计方向,但是不能够计算平移和尺度。

在这样的环境中,我们需要一个大量的近点用以精确估计平移,因而如果这个被跟踪近点小于并且这个帧将会创造个新邻近立体点,这个系统将会插入一个新的关键帧,我们经验值认为,当和的条件下我们效果最好。

3.6 定位模式

ORB-SLAM2包括一个定位模式,该模式适用于轻量级以及在地图已知情况下长期运行,只要那个环境没有发生剧烈变化。在该模式中,局部建图和回环检测的线程中是停用的,并且这个相机始终都是在通过追踪进行重定位。在这个模式下,追踪模块使用视觉里程计进行匹配图像的点云。视觉里程计匹配在当前帧的ORB算子和由双目或者深度相机收集的3D点云。这些匹配使得在没有地图的区域也能够精确重新定位,但是漂移将会被累加。地图点云匹配要确保在一个已经存在的地图当中零漂移定位,这个模型在附带的video当中会显示。

IV. 评估

我们使用三个著名的数据集来评估ORB-SLAM2的算法的性能。我们在一台16G的RAM,Intel Core i7-4790的台式机运行,以低于传感器的帧率,对处理跟踪时间求平均。我们运行数据集5次,取中间值,来消除多线程系统的不确定性。我们开源了在运行这几个系统的数据集的方法包括标定具体操作实现。

4.1 KITTI数据集

KITTI数据集包含双目数据,这些数据从一个正在高速公路上行驶的车上采集到的。这个双目传感器有个小于54厘米的基线并且在在1392*512像素上,以10Hz的采样速率进行采样,其中序列00,02,05,06,和09包含回环。我们的ORB-SLAM2能够检测出回环并且能够地图重用,除了09序列以外,09序列的回环只发生在尾端少数的几帧当中。表1显示的这个结果11个训练数据,这是一个公开的真实数据,对比于原先的LSD-SLAM算法,我们展示了的双目SLAM系统测试数据结果。我们使用两个不同的米制,均方根误差在论文[3]中提到,并且取平均相关平移和旋转误差在论文[2],我们的系统在大多数序列当中比双目的LSD-SLAM要优秀很多,并且能够获得的相关误差低于1%。这个序列01如图3所示,是一个高速公路的序列,作为训练集,以及转换误差。转换误差是在这个序列当中难以评估的,因为只有几个很近的点能够被侦测,由于很高的速度和较低的帧率。然而这个方向能够被精确的评估,获得的误差是每100米做0.21度。很多较远的点能够被检测,如图4所示,显示了一些评估的例子。

表1两种SLAM在测试KITT,I数据的精度对比

图4 在KITTE数据集01,05,07和08数据集,估计轨迹(黑色线)和以及实际运动(红色线)

4.2 EuRoC 数据集

EuRoC 数据集包含了11个双目的序列,通过一个微型飞行器(MAV)采集到的数据,飞行在两个不同的房间和大量的工业环境。这个双目传感器有一个小于11cm的基线和能够提供20HZ的WVGA格式的图像,这个序列分成,简单、中等、和困难,这取决于MAV(微型飞行器)的速度,照明和场景的纹理。在所有的序列当中,MAV(微型飞行器)再次访问这个环境的时候,ORB-SLAM2能够重用地图,回环检测。这个表格2显示的是ORB-SLAM2的最小均方误差的绝对值变换,对于所有序列而言。相比较对双目的LSD-SLAM的结果。

ORB-SLAM2能够实现一个厘米级精准的定位,并且比双目的LSD-SLAM更加的精确。跟踪部分可能会在V2_ 03_ difficul,序列当中跟丢,由于一些运动模糊。在第22篇论文解释的情况,这个序列在处理的过程中是使用IMU信息,如图5所示,显示的一些估计轨迹对真实的世界相比的例子。

图5 在EuRoC V1_02_medium,V2_02_medium,MH_03_medium和MH_05_数据集测试结果,其中估计轨迹(黑色)实际运动轨迹(红色)

4.3 TUM RGB-D数据集

TUM RGB-D数据集包含一些室内的序列,在不同的纹理下,不同的光照和不同的结构条件,从RGB-D传感器采集到的数据中分别去评估物体的重建和SLAM/视觉里程计的性能。和大多数RGB-DSLAM方法一样,我们将实验结果展示在一个序列子集当中,在表格3当中,我们比较我们的精准性和其他方法,例如ElasticFusion,Kintinuous,DVO-SLAM以及RGB-DSLAM,ORB-SLAM2是唯一一种基于光束流差法,并且比其他的方法都更加优秀。我们已经注意到RGB-DSLAM,深度地图对于freiburg2序列有一个4%的尺度误差,误差可能来自错误的标定,我们已经在运行过程中,进行了一定程度的补偿。这能够部分解释我们取得好的结果的原因。图6显示的点云的结果来源于后端映射的传感器深度的地图,从计算关键帧的位姿在四个序列当中。实验的结果显示,ORB-SLAM2很好的展示了桌子和海报的轮廓线,以及高精度的重定位。

图6 TUM RGB-D数据的fr3office, fr1 room, fr2 desk and fr3 nst 序列的通过评估关键帧的位姿和深度图进行稠密的点云重建图

V. 结论

本文呈现了一个基于于单目,双目和RGB-D传感器的完整SLAM框架,在实时和标准的CPU的前提下能够进行重新定位和回环检测,以及地图的重用。在实验当中,我们关心的是在大场景中建立可用的地图和长期的定位。与此前的SLAM方案进行对比,在大多数的情况下,ORB-SLAM2展现出一样好的精确程度。

值得注意的是,我们的RGB-D实现的结果显示,如果相机的定位精度更好,那么BA将会比直接法或者ICP的方法更好,将会减少一些额外的计算量。我们开放了我们系统的源码,和一些例子和指导,以便于能够更加方便为其他研究者而使用。未来的方向可能包含,测试更多的序列,多视角相机,鱼眼相机或者其他全相相机的,大场景的稠密重建,以及联合建图或者增加运动模糊的鲁棒性。

 

 

 

这篇关于ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/206615

相关文章

文件权限修改为777,php failed to open stream: Permission denied

记录一次在谷歌云上的异常诡异的事件: 环境 centos7.5 nginx php7.0 mysql 问题: 问题一 我用相同的nginx配置,只是修改了nginx root目录。 打开/var/www/html/ 这个目录就报 2018/06/22 04:35:03 [error] 15840#0: *438 FastCGI sent in stderr: “Primary scr

CS162 Operating System-lecture2

A tread is suspended or no longer executing when its state’s not loaded in registers the point states is pointed at some other thread .so the thread that’s suspended is actually siting in memory and

SLAM Paper Reading和代码解析

最近对VINS、LIO-SAM等重新进行了Paper Reading和代码解析。这两篇paper和代码大约在三年前就读过,如今重新读起来,仍觉得十分经典,对SLAM算法研发具有十分重要的借鉴和指导意义。重新来读,对其中的一些关键计算过程也获得了更新清晰的了解,现整理分享出来,供有需要的同学参考。 VINS-MONO算法总结-徐胜攀.pdf资源-CSDN文库 对VINS-MONO的算法框架进

在WinCE的C#编程中,需要静态调用C++的动态库,需要添加using System.Runtime.InteropServices

using System.Runtime.InteropServices;         [DllImport("Win32DLL.dll", EntryPoint = "WriteREG_SZToRegTCHAR")]         private static extern bool WriteREG_SZToRegTCHAR(int iFlag, string regKeyP

c语言使用system函数后台运行python脚本

最近需要在c工程的mian函数中使用system函数调用一个shell脚本,shell脚本是用来将某些系统配置通过sock通信发送给主核进程,但是可能出现偶发性的配置失败情况,经过分析可以大概断定是由于sock通信的时候,主核进程正在忙于其他事物导致未能在expire之前将消息接受并处理,导致消息丢失,而发送方无法感知系统是否成功加载配置。         所以,需要在脚本的最后

java system.in问题

public static final InputStream in system关于in属性的定义InputStream是一个抽象类。抽象类本身是没有对象的,怎么可能用IN 属性调用reaad()方法?system.in.read();方法的解释 我想具体的知道是怎么得到这个 InputStream对象的。system方法中并没有给出定义。既然IN对象没有创建,有怎么可能调用IN方法?说起

FFplay源码分析-stream_component_open

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。 本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。 上一篇文章已经讲解完了 stream_component_op

FFplay源码分析-streams_open

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。 本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。 如下图所示,本文主要讲解 streams_open() 函数的

FFplay源码分析-avformat_open_input

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。 本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下: ffplay -i rtmp://192.168.0.122/live/livestream 前两篇文章 《FFplay源码分析-rtmp入口》 《FFplay源

JSP中System.out.println()与out.println()区别

out.println()输出到客户端。   在out.println()中,out是response的实例,是以response为对象进行流输出的,即将内容输出到客户端。如果在JSP页面中使用System.out.println(),在客户端只会输出一个空格。System.out.println()打印在控制台当中。    System.out.println()用的是标准输出流,这个是输出在