Python API¶
关于安装、升级和使用 DepthAI Python API 的说明。
安装系统依赖¶
运行 DepthAI 库需要几个基本的系统依赖。
它们中的大多数应该已经安装在大多数系统中,但是如果没有安装,
我们准备了一个 安装脚本
,这将确保安装了所有依赖项以及方便的开发/编程工具。还有适用于macOS( 此处 ),Raspberry Pi( 此处 ), Ubuntu( 此处 )和Windows 10( 此处 )的视频指南。
macOS¶
bash -c "$(curl -fL http://docs.luxonis.com/_static/install_dependencies.sh)"
执行此命令后,关闭并重新打开终端窗口。
该脚本还可以在M1 Mac上运行,并且在Rosetta 2下安装了Homebrew,因为某些Python软件包仍缺少对M1的原生支持。如果您已经在本地安装了Homebrew并且无法正常工作,请参见 此处 以了解其他一些疑难解答步骤。
请注意,如果未出现视频流窗口,请考虑运行以下命令:
python3 -m pip install opencv-python --force-reinstall --no-cache-dir
有关更多信息,请参见我们论坛上的 macOS 视频预览窗口未能出现 话题讨论。
Raspberry Pi OS¶
sudo curl -fL http://docs.luxonis.com/_static/install_dependencies.sh | bash
Ubuntu¶
sudo wget -qO- http://docs.luxonis.com/_static/install_dependencies.sh | bash
Windows¶
右键单击开始
选择Windows PowerShell(管理员)
安装Chocolatey软件包管理器(类似于macOS的Homebrew):
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
关闭PowerShell,然后通过重复前两个步骤重新打开另一个PowerShell(管理员)。
安装Python和PyCharm
choco install cmake git python pycharm-community -y
启用 USB 设备(仅在 Linux 上)¶
由于 DepthAI 是 USB 设备,因此为了在使用 udev
工具的系统上与之通信,
您需要添加 udev 规则以使设备可访问。
以下命令将向您的系统添加新的 udev 规则
echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666"' | sudo tee /etc/udev/rules.d/80-movidius.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
从 PyPi 安装¶
我们的软件包是 通过 PyPi 分发的,为了可以在您的环境中安装,请使用
python3 -m pip install depthai
有关其他安装选项,请参阅 其他安装选项 。
测试安装¶
我们在 GitHub 上有 depthai 存储库, 其中包含许多有用的示例和准备好的神经网络, 您可以使用它们来加快原型制作速度。它还包括由我们的贡献者维护的测试脚本, 该脚本应有助于您验证设置是否正确。
首先,克隆 depthai 存储库,并将目录更改为该目录:
git clone https://github.com/luxonis/depthai.git
cd depthai
接下来是安装此仓库的要求。请注意,我们建议将依赖项安装在虚拟环境中,以免它们干扰系统上的其他Python工具/环境。
对于Mac / Windows / Ubuntu / etc等开发工具,我们建议使用PyCharm IDE,因为它会自动为您创建和管理虚拟环境,以及许多其他好处。可替代的有: conda , pipenv 或者 virtualenv 可以直接使用(或用您的首选IDE)。
有关资源受限的系统,如树莓派或其他小型Linux系统的安装,我们建议 conda , pipenv 或者 virtualenv 中的一个。要使用 virtualenv 设置虚拟环境,请运行 virtualenv venv && source venv/bin/activate 。
使用虚拟环境(或者如果需要在整个系统范围内),运行以下命令以安装此示例存储库的依赖:
python3 install_requirements.py
现在,从 DepthAI 内部运行演示脚本,以确保一切正常:
python3 depthai_demo.py
如果一切顺利的话,会弹出一个小视频窗口。 如果画面中的物体属于 物体检测示例 20 类 中的某一类,画面上会叠加该物体的信息。
运行其他示例¶
运行此演示之后,您可以运行 python3 depthai_demo.py -h
来查看默认情况下可以运行的其他神经网络。
检查完之后,继续执行以下操作:
您还可以在下面继续学习如何转换自己的神经网络以在DepthAI上运行。
另外,我们还在下面提供了在线模型训练,该演示向您展示了如何为DepthAI训练和转换模型。
在线机器学习训练和模型转换: 此处
准备 MyriadX blob 文件和它的配置文件¶
正如你在 本例 中所看到的,Device.create_pipeline()
方法的基本用法包括指定所需的输出流和 AI 部分,在其中指定 MyriadX blob 及其配置。
在本节中,我们将介绍如何同时获取 blob_file
和 blob_file_config
。
获取 MyriadX Blob¶
由于我们使用的是 MyriadX VPU, 您的模型需要被编译(或准确地进行优化和转换)为 MyriadX Blob 文件,然后将其发送到设备并执行。
最简单的方法是使用我们的在线 BlobConverter应用程序 来获取这个 blob 文件。 它有编译所需的所有工具, 所以你不需要设置任何东西–你甚至可以从 OpenVINO模型Zoo 下载一个模型的blob。
如果你愿意,你也可以自己编译 blob。 你需要安装 OpenVINO 工具包, 然后使用 Model Optimizer 和 Myriad Compiler 来获得 MyriadX blob。 我们已经在 这里 记录了这些编译器的使用实例。
创建 Blob 配置文件¶
如果未提供配置文件或将 output_format
设置为 raw
,
则设备上不会进行解码,用户必须在主机端手动进行解码。
当前支持在设备上对基于 Mobilenet-SSD
和 (tiny-)YOLO-v3
的网络进行解码。
对于该配置文件,需要使用网络特定的参数。
tiny-yolo-v3 网络示例:
{
"NN_config":
{
"output_format" : "detection",
"NN_family" : "YOLO",
"NN_specific_metadata" :
{
"classes" : 80,
"coordinates" : 4,
"anchors" : [10,14, 23,27, 37,58, 81,82, 135,169, 344,319],
"anchor_masks" :
{
"side26" : [1,2,3],
"side13" : [3,4,5]
},
"iou_threshold" : 0.5,
"confidence_threshold" : 0.5
}
},
"mappings":
{
"labels":
[
"person",
"bicycle",
"car",
"..."
]
}
}
NN_config
- 网络配置output_format
"detection"
- 设备上完成解码, 接收到的数据包为Detections
格式"raw"
- 在主机上完成解码
NN_family
- “YOLO” 或 “mobilenet”NN_specific_metadata
- 仅用于 “YOLO”classes
- classes 数量coordinates
- coordinates 数量anchors
- YOLO 网络的锚点anchor_masks
- 每个输出层的锚定遮罩 :26x26
,13x13
(+ 52x52 for full YOLO-v3)iou_threshold
- 检测到的对象的联合阈值交集confidence_threshold
- 检测物体的得分置信度阈值
mappings.labels
- 使用depthai_demo.py
脚本来解码ID的标签
将 output_format
设置为 detection
时的解码示例:
nnet_packets, data_packets = p.get_available_nnet_and_data_packets()
for nnet_packet in nnet_packets:
in_layers = nnet_packet.getInputLayersInfo()
input_width = in_layers[0].get_dimension(depthai.TensorInfo.Dimension.W)
input_height = in_layers[0].get_dimension(depthai.TensorInfo.Dimension.H)
detections = nnet_packet.getDetectedObjects()
objects = list()
for detection in detections:
detection_dict = detection.get_dict()
# 将标准化坐标缩放为图像坐标
detection_dict["x_min"] = int(detection_dict["x_min"] * input_width)
detection_dict["y_min"] = int(detection_dict["y_min"] * input_height)
detection_dict["x_max"] = int(detection_dict["x_max"] * input_width)
detection_dict["y_max"] = int(detection_dict["y_max"] * input_height)
objects.append(detection_dict)
print(objects)
主机和设备上基于完整 yolo-v3
和 tiny-yolo-v3
的解码示例在 此处
主机和设备上基于 mobilenet
的网络的解码示例在 此处
其他安装方式¶
要从我们的源代码中获取最新但尚未发布的功能,您可以继续手动编译 DepthAI 软件包。
从源构建的依赖项¶
CMake > 3.2.0
生成工具 (Ninja, make, …)
C/C++ 编译器
libusb1 开发包
Ubuntu, Raspberry Pi OS, … (基于 Debian 的系统)¶
在基于 Debian 的系统 (Raspberyy Pi OS, Ubuntu, …)上,可以通过运行以下命令获取安装依赖:
sudo apt-get -y install cmake libusb-1.0-0-dev build-essential
macOS (Mac OS X)¶
假设安装了 Mac OS X , 则 depthai-python 库需要以下依赖项
HomeBrew (如果尚未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Python, libusb, CMake, wget
brew install coreutils python3 cmake libusb wget
现在你已经准备好克隆 depthai-python ,并在 Mac OSX 上构建。
使用 GitHub commit 进行安装¶
Pip 允许用户从特定的 commit 安装软件包,即使它们尚未在 PyPi 上发布。
为此,请使用以下命令 - 并确保使用正确的 commit hash 替换 <commit_sha>
python3 -m pip install git+https://github.com/luxonis/depthai-python.git@<commit_sha>
使用/测试特定的 分支/PR¶
有时,使用特定分支可能会引起您的注意。
例如,这可能是因为我们已经听取了您的功能要求并在分支中实现。
或者可能是出于稳定性目的,在合并到 main
中之前,在 develop
中实现。
因此,当在 depthai 存储库中工作时, 可以通过以下命令来使用分支。
在此示例中, 我们将尝试使用 develop
分支
(这是在将新功能合并到 main
之前我们用来吸收新功能的分支):
在运行以下命令之前, 您可以独立克隆存储库
(以免覆盖任何本地更改) 也可以先执行 git pull
。
git checkout develop
python3 install_requirements.py
从源安装¶
如果需要,您还可以从源代码本身安装该软件包 - 它将允许您对 API 进行更改,并看到它们的实际操作。
为此,请先下载存储库,然后在开发模式下将该包添加到您的 python 解释器中
git clone https://github.com/luxonis/depthai-python.git
cd depthai-python
git submodule update --init --recursive
python3 setup.py develop # 如果使用系统解释器而不是虚拟环境,则可能需要添加sudo
如果您要使用默认(main
)以外的其他分支(e.g. develop
), 可以通过键入
git checkout develop # replace the "develop" with a desired branch name
git submodule update --recursive
python3 setup.py develop
或者,如果您要使用特定的 commit,请键入
git checkout <commit_sha>
git submodule update --recursive
python3 setup.py develop
API 参考¶
-
class
Device
¶ 用与之交互的方法表示 DepthAI 设备。
Warning
请注意,除
get_available_streams()
之外的所有方法都要首先运行create_pipeline()
。例如
import depthai device = depthai.Device('', False) pipeline = device.create_pipeline(config={ 'streams': ['previewout', 'metaout'], 'ai': { "blob_file": "/path/to/model.blob", "blob_file_config": "/path/to/config.json", }, })
方法
-
__init__
(device_id: str, usb2_mode: bool) → Device¶ 标准和推荐的方式来设置对象。
device_id 代表设备连接的 USB 端口 ID。 如果设置为特定值 (例如:
"1"
) 它将在特定的 USB 端口中查找设备, 而如果留空 -''
- 将在所有端口上查找设备。 当我们连接了不止一台 DepthAI 设备并希望在代码中指定要使用哪一台设备时,这个方法很有用。usb2_mode, 为
True/False
, 允许 DepthAI 使用 USB2 协议(而不是 USB3)进行通信。 这降低了管道的吞吐量,但允许使用> 1m USB 电缆进行连接。
-
__init__
(cmd_file: str, device_id: str) → Device 初始化 DepthAI 设备的开发和调试方法。
cmd_file 是固件
.cmd
文件的路径,该文件将加载到设备上以进行引导。device_id 代表设备连接的 USB 端口 ID。 如果设置为特定值 (例如:
"1"
) 它将在特定的 USB 端口中查找设备,而如果留空 -''
- 将在所有端口上查找设备。 当我们连接了不止一台 DepthAI 设备并希望在代码中指定要使用哪一台设备时,这个方法很有用。
-
create_pipeline
(config: dict) → depthai.CNNPipeline¶ 初始化 DepthAI 管道,如果成功,则返回创建的
CNNPipeline
否则返回None
。config(dict) - 管道的配置使用
dict
设置。 配置的示例键/值:{ # Possible streams: # 'color' - 4K 彩色摄像机预览 # 'left' - 左单声道相机预览 # 'right' - 右单声道相机预览 # 'rectified_left' - 校正左镜头预览 # 'rectified_right' - 校正右镜头预览 # 'previewout' - 神经网络输入预览 # 'metaout' - CNN 输出张量 # 'depth' - 原始深度图,视差转换为现实距离 # 'disparity' - 视差图,左右摄像机之间的视差,以像素为单位 # 'disparity_color' - 视差图着色 # 'meta_d2h' - device metadata stream # 'video' - H.264/H.265 编码的彩色摄像机帧 # 'jpegout' - JPEG 编码的彩色相机帧 # 'object_tracker' - 对象跟踪器结果 'streams': [ 'left', # 如果使用left,它必须在第一个位置 'right', {'name': 'previewout', 'max_fps': 12.0}, # 流可以指定为对象 'metaout', # 与深度有关的流 {'name': 'depth', 'max_fps': 12.0}, {'name': 'disparity', 'max_fps': 12.0}, {'name': 'disparity_color', 'max_fps': 12.0}, ], 'depth': { 'calibration_file': consts.resource_paths.calib_fpath, 'left_mesh_file': consts.resource_paths.left_mesh_fpath, 'right_mesh_file': consts.resource_paths.right_mesh_fpath, 'padding_factor': 0.3, 'depth_limit_m': 10.0, # 以米为单位,用于在 x,y,z calc 期间进行过滤 'median_kernel_size': 7, # 视差/深度中值滤波器内核大小(N x N)。 0 = 禁用过滤 'lr_check': True # 启用双目“左右检查”功能。 'warp_rectify': { 'use_mesh' : True, # 如果为 False,将使用单应性。 'mirror_frame': True, # 如果为 False,则视差将被镜像 'edge_fill_color': 0, # 灰色 0..255 或 -1 以复制像素值 }, }, 'ai': { 'blob_file': blob_file, 'blob_file_config': blob_file_config, 'blob_file2': blob_file2, 'blob_file_config2': blob_file_config2, 'calc_dist_to_bb': True, # 带边界框输出的 CNN 模型的深度计算 'keep_aspect_ratio': False, # 保持宽高比,不要对 NN 使用完整的 RGB FOV 'camera_input': "left", # 'rgb', 'left', 'right', 'left_right', 'rectified_left', 'rectified_right', 'rectified_left_right' 'shaves' : 7, # 1 - 14 NN 使用的 shaves 数量。 'cmx_slices' : 7, # 1 - 14 NN 使用的 cmx_slices 数。 'NN_engines' : 2, # 1 - 2 NN 使用的 NN_engine 的数量。 }, # 对象追踪器 'ot': { 'max_tracklets' : 20, # 最多支持 20 个 'confidence_threshold' : 0.5, # 仅针对超过此阈值的检测跟踪对象 }, 'board_config': { 'swap_left_and_right_cameras': True, # 交换左右摄像机。 'left_fov_deg': 71.86, # 立体摄像机的水平视场(HFOV),以[deg]为单位。 'rgb_fov_deg': 68.7938, # RGB 摄像机的水平视场(HFOV),以[deg]为单位 'left_to_right_distance_cm': 9.0, # 左/右摄像机基线,以[cm]为单位 'left_to_rgb_distance_cm': 2.0, # RGB 相机与左相机的距离。 'store_to_eeprom': False, # 将校准和 board_config(fov,baselines,swap-lr)存储在板载 EEPROM 中 'clear_eeprom': False, # 使 EEPROM 中的 calib 和 board_config 无效 'override_eeprom': False, # 使用主机上的 calib 和 board_config,如果编程则忽略 EEPROM 数据. }, 'camera': { 'rgb': { # 3840x2160, 1920x1080 # 目前仅支持 UHD / 1080p / 30 fps 'resolution_h': 3040, # possible - 1080, 2160, 3040 'fps': 30, }, 'mono': { # 1280x720, 1280x800, 640x400 (启用分箱) 'resolution_h': 800, # possible - 400, 720, 800 'fps': 30, }, }, 'app': { 'sync_video_meta_streams': False, # 同步“ previewout”和“ metaout”流 'sync_sequence_numbers' : False, # 同步所有数据包的序列号。 实验性 'usb_chunk_KiB' : 64, # 设备上的 USB 传输块。 更高(高达兆字节)可以提高吞吐量,或者为 0 则禁用分块 }, #'video_config': #{ # 'rateCtrlMode': 'cbr', # 选件: cbr / vbr # 'profile': 'h265_main', # 选件: 'h264_baseline' / 'h264_main' / 'h264_high' / 'h265_main / 'mjpeg' ' # 'bitrate': 8000000, # 使用 CBR 时(仅限 H264 / H265) # 'maxBitrate': 8000000, # 使用 CBR 时(仅限 H264 / H265) # 'keyframeFrequency': 30, (H264/H265 only) # 'numBFrames': 0, (H264/H265 only) # 'quality': 80 # (0-100%)使用 VBR 或 MJPEG 配置文件时 #} #'video_config': #{ # 'profile': 'mjpeg', # 'quality': 95 #} }
-
get_available_streams
() → List[str]¶ 返回 DepthAI 库支持的所有流的列表。
>>> device.get_available_streams() ['meta_d2h', 'color', 'left', 'right', 'rectified_left', 'rectified_right', 'disparity', 'depth', 'metaout', 'previewout', 'jpegout', 'video', 'object_tracker']
-
get_nn_to_depth_bbox_mapping
() → dict¶ 返回允许将 CNN 输出与视差信息匹配的字典。
由于 RGB 相机具有 4K 分辨率,并且神经网络仅接受具有特定分辨率的图像(例如 300x300),则原始图像会被裁剪以满足神经网络的要求。另一方面,由神经网络返回的视差帧在单声道相机上具有完整分辨率。
为了能够确定 CNN 预览图像在视差帧上的位置,应使用此方法指定要使用的偏移量和尺寸。
>>> device.get_nn_to_depth_bbox_mapping() {'max_h': 681, 'max_w': 681, 'off_x': 299, 'off_y': 59}
-
request_af_mode
()¶ 将 4K RGB 相机自动对焦模式设置为可用的
AutofocusMode
之一。
-
request_af_trigger
()¶ 在 4k RGB 相机上手动将触发操作发送到 AutoFocus
-
request_jpeg
()¶ 从 RGB 相机捕获 JPEG 帧,并将其发送到:
jpegout
流。框架具有完整的可用分辨率,但未裁剪为符合 CNN 输入的尺寸。
-
send_disparity_confidence_threshold
(confidence: int)¶ 发送用于 StereoSGBM 算法的视差置信度阈值的功能。如果视差值置信度低于阈值,则将该值标记为无效视差并当作背景。
-
get_right_homography
()¶
-
get_left_homography
()¶
-
get_left_intrinsic
()¶
-
get_right_intrinsic
()¶
-
get_rotation
()¶
-
get_translation
()¶
-
-
class
AutofocusMode
¶ 一个包含所有可用自动对焦模式的枚举
成员
-
AF_MODE_AUTO
¶ 该模式将自动对焦设置为手动模式,您需要调用
Device.request_af_trigger()
来启动对焦程序。
-
AF_MODE_CONTINUOUS_PICTURE
¶ 此模式连续调整焦点以提供最佳的对焦图像流,并且在拍摄时相机静止不动时应使用此模式。 对焦过程会以最快的速度完成。
这是 DepthAI 运行的默认模式。
-
AF_MODE_CONTINUOUS_VIDEO
¶ 此模式不断调整焦距以提供最佳对焦图像流,应在相机尝试捕捉流畅的视频流时使用。 对焦程序较慢,可避免对焦过冲。
-
AF_MODE_EDOF
¶ 该模式将禁用自动对焦。 EDOF 代表增强景深,是一种数字对焦。
-
AF_MODE_MACRO
¶ 这和
AF_MODE_AUTO
的工作模式是一样的。
-
-
class
CNNPipeline
¶ 管道对象,设备可以用它向主机发送结果。
方法
-
get_available_data_packets
() → List[depthai.DataPacket]¶ 只返回设备本身产生的数据包,不含 CNN 结果
-
get_available_nnet_and_data_packets
() → tuple[List[depthai.NNetPacket], List[depthai.DataPacket]]¶ 同时返回神经网络的结果和设备产生的数据
-
-
class
NNetPacket
¶ 对于任何神经网络推理输出,都可以使用
NNPacket.get_tensor()
。 对于Mobilenet-SSD
的具体情况,可以在固件中进行YOLO-v3
解码。 解码后的对象除了原始输出外,还可以通过getDetectedObjects()
访问解码后的对象,以便轻松访问此常用网络的结果。 有关不同神经网络输出格式以及如何在这些格式之间进行选择的更多详细信息,请参见 blob 配置文件 。神经网络结果包。这不是单个结果,而是附加了其他元数据的一批结果
方法
-
getMetadata
() → depthai.FrameMetadata¶ 返回包含与此数据包相关的所有专有数据的元数据对象
-
get_tensor
(name: Union[int, str]) → numpy.ndarray¶ Warning
只有在 blob 配置文件 中
output_format
被设置为raw
时才有效。根据神经网络的输出层信息,返回特定网络输出张量的形状 numpy 数组。
例如:在使用
Mobilenet-SSD
的情况下,它返回一个[1, 1, 100, 7]
形状的数组,其中numpy.dtype
是float16
。用法示例:
nnetpacket.get_tensor(0) # or nnetpacket.get_tensor('detection_out')
-
__getitem__
(name: Union[int, str]) → numpy.ndarray¶ 和
get_tensor()
相同Mobilenet-SSD
的使用实例:nnetpacket[0] # or nnetpacket['detection_out']
-
getOutputLayersInfo
() → depthai.TensorInfo¶ 返回网络的输出层信息。
-
getInputLayersInfo
() → depthai.TensorInfo¶ 返回网络的输入层信息。
-
getDetectedObjects
() → depthai.Detections¶ Warning
当 blob 配置文件 中的
output_format
设置为detection
并使用检测网络 (以Mobilenet-SSD
,(tiny-)YOLO-v3
为基础的网络)时,可以使用。以
Detections
格式返回检测到的对象。在设备端对网络进行解码。
-
-
class
Detections
¶ 在设备端解码的神经网络结果的容器。
访问 detections 的示例
假设检测到的对象存储在
detections
对象中。detection 的数量
detections.size() # or len(detections)
访问第 n 个 detection
detections[0] detections[1] # ...
遍历所有 detection
for detection in detections:
-
class
Detection
¶ 检测到的对象描述符。
属性
方法
-
class
Dimension
¶ 张量形状的维度描述符。 由于并非所有神经网络模型都尊重输出张量的
维度
语义,因此对输入张量的意义最大。Values
-
W / WIDTH
宽
-
H / HEIGHT
高
-
C / CHANNEL
通道数
-
N / NUMBER
推断数
-
B / BATCH
推断批次
-
-
class
DataPacket
¶ DepthAI 数据包,包含设备上生成的信息。 与 NNetPacket 不同的是,它包含一个单一的 “结果 “和源流信息。
属性
Methods
-
getData
() → numpy.ndarray¶ 返回数据为 NumPy 数组,你可以使用 OpenCV
imshow
对其进行进一步转换或显示。用于返回帧的流,例如
previewout
,left
,right
, 或编码数据,例如video
,jpegout
.
-
getMetadata
() → FrameMetadata¶ 返回包含与此数据包相关的所有专有数据的元数据对象
-
getObjectTracker
() → ObjectTracker¶ Warning
仅对来自
object_tracker
流的数据包有效。返回包含
ObjectTracker
对象的元数据对象。
-
-
class
FrameMetadata
¶ 附加在通过管道发送的数据包上的元数据对象
Methods
-
class
ObjectTracker
¶ 表示跟踪器当前状态的对象,通过对来自
object_tracker
流的数据包调用DataPacket.getObjectTracker()
方法获得方法
-
getTracklet
(tracklet_nr: int) → Tracklet¶ 返回具有指定
tracklet_nr
的 tracklet。 要检查有多少个 tracklet,请使用getNrTracklets()
方法
-
-
class
Tracklet
¶ Tracklet 表示单个被跟踪的对象,由
ObjectTracker
类生成。 要获取它,请调用ObjectTracker.getTracklet()
方法。方法
有疑问?
我们很乐意为您提供代码或其他问题的帮助。