TorchAudio 的 C++ API 目前处于原型阶段。API/ABI 的向后兼容性无法保证。
顶层命名空间已从
torchaudio
更改为torio
。StreamWriter
已重命名为StreamingMediaEncoder
。
torio::io::StreamingMediaEncoder
StreamingMediaEncoder
是 Python 等效实现所使用的类,并提供了相似的接口。当处理自定义 I/O(例如内存中的数据)时,可以使用 StreamingMediaEncoderCustomIO
类。
这两个类定义了相同的方法,因此它们的用法是一致的。
构造函数
StreamingMediaEncoder
classStreamingMediaEncoder
逐块编码并写入音视频流
由 torio::io::StreamingMediaEncoderCustomIO 继承
explicittorio::io::StreamingMediaEncoder::StreamingMediaEncoder(conststd::string\&dst, conststd::optional
从目标 URI 构造 StreamingMediaEncoder
参数:
-
dst – 编码数据写入的目标位置。
-
format – 指定输出格式。如果未提供,则从
dst
中推测。
流媒体编码器自定义IO
classStreamingMediaEncoderCustomIO:privatedetail::CustomOutput,publictorio::io::StreamingMediaEncoder
StreamingMediaDecoder 的子类,支持自定义读取函数。可用于将媒体编码到内存或自定义对象中。
torio::io::StreamingMediaEncoderCustomIO::StreamingMediaEncoderCustomIO(void*opaque, conststd::optional
使用自定义的写入和查找函数构造 StreamingMediaEncoderCustomIO。
参数:
-
opaque – 由
write_packet
和seek
函数使用的自定义数据。 -
format – 指定输出格式。
-
buffer_size – 中间缓冲区的大小,FFmpeg 使用它来将数据传递给 write_packet 函数。
-
write_packet – 自定义的写入函数,由 FFmpeg 调用以实际将数据写入自定义目标。
-
seek – 可选的定位函数,用于在目标中进行定位。
配置方法
add_audio_stream
voidtorio::io::StreamingMediaEncoder::add_audio_stream(intsample_rate, intnum_channels, conststd::string\&format, conststd::optional
添加一个输出音频流。
参数:
-
sample_rate – 采样率。
-
num_channels – 通道的数量。
-
format – 输入样本格式,它决定了输入张量的数据类型。
-
"u8"
: 输入张量必须为torch.uint8
类型。 -
"s16"
: 输入张量必须为torch.int16
类型。 -
"s32"
: 输入张量必须为torch.int32
类型。 -
"s64"
: 输入张量必须为torch.int64
类型。 -
"flt"
: 输入张量必须为torch.float32
类型。 -
"dbl"
: 输入张量必须为torch.float64
类型。
默认值:
"flt"
。 -
-
encoder – 要使用的编码器名称。
当提供该参数时,将使用指定的编码器而非默认编码器。
要列出可用的编码器,您可以使用
ffmpeg -encoders
命令。 -
encoder_option – 传递给编码器的选项。要列出某个编码器的选项,您可以使用
ffmpeg -h encoder=<ENCODER>
。 -
encoder_format – 用于编码媒体的格式。当编码器支持多种格式时,传递此参数将覆盖用于编码的格式。要列出编码器支持的格式,您可以使用
ffmpeg -h encoder=<ENCODER>
命令。 -
encoder_sample_rate – 如果提供,将在编码前执行重采样。
-
encoder_num_channels – 如果提供,在编码之前更改通道配置。
-
codec_config – 编解码器配置。
-
filter_desc – 在编码输入数据之前应用的额外处理
add_video_stream
voidtorio::io::StreamingMediaEncoder::add_video_stream(double frame_rate, int width, int height, const std::string& format, const std::optional
添加一个输出视频流。
参数:
-
frame_rate – 帧率
-
width – 宽度
-
height – 高度
-
format – 输入像素格式,它决定了输入张量的颜色通道顺序。
-
"gray8"
: 单通道,灰度图像。 -
"rgb24"
: 三个通道,顺序为RGB。 -
"bgr24"
: 三个通道,顺序为BGR。 -
"yuv444p"
: 三个通道,顺序为YUV。
无论哪种情况,输入张量必须是
torch.uint8
类型,且形状必须为 (帧, 通道, 高度, 宽度)。 -
-
encoder – 参见
addaudiostream()
。 -
encoder_option – 参见
addaudiostream()
。 -
encoder_format – 请参见
addaudiostream()
。 -
encoder_frame_rate – 如果提供,将在编码前更改帧率。
-
encoder_width – 如果提供此参数,在编码之前调整图像大小。
-
encoder_height – 如果提供,则在编码前调整图像大小。
-
hw_accel – 启用硬件加速。
-
codec_config – 编解码器配置。
当视频在 CUDA 硬件上编码时,例如
encoder="h264_nvenc"
,将 CUDA 设备指示符传递给hw_accel
(即hw_accel="cuda:0"
)会使 StreamingMediaEncoder 期望视频块为 CUDA 张量。传递 CPU 张量将导致错误。如果为
None
,则视频块张量必须为 CPU 张量。 -
filter_desc – 在编码输入数据之前应用的额外处理
set_metadata
voidtorio::io::StreamingMediaEncoder::set_metadata(constOptionDict\&metadata)
设置文件级别的元数据
参数:
metadata – 元数据。
写入方法
open
voidtorio::io::StreamingMediaEncoder::open(conststd::optional\
打开输出文件/设备并写入头部信息。
参数:
opt – 用于协议、设备和复用器的私有选项。
关闭
voidtorio::io::StreamingMediaEncoder::close()
关闭输出文件/设备并完成元数据的最终化。
写入音频片段
voidtorio::io::StreamingMediaEncoder::write_audio_chunk(int i, const torch::Tensor& frames, const std::optional
写入音频数据
参数:
-
i – 流索引。
-
frames – 波形张量。形状:
(frame, channel)
。dtype
必须与传递给addaudiostream()
方法的类型一致。 -
pts –
表示时间戳。如果提供了该值,它将覆盖第一帧的 PTS。否则,PTS 将按照采样率的倒数递增。仅当提供的值超过内部处理的 PTS 值时才会生效。
注意:提供的值会被转换为基于采样率的整数值。因此,它会被截断为最接近的
n / sample_rate
值。
write_video_chunk
voidtorio::io::StreamingMediaEncoder::write_video_chunk(inti, consttorch::Tensor\&frames, conststd::optional\
写入视频数据
参数:
-
i – 流索引。
-
frames – 视频/图像张量。形状:
(时间, 通道, 高度, 宽度)
。dtype
必须为torch.uint8
。形状(高度, 宽度和通道数)
必须与调用addvideostream()
时配置的内容匹配。 -
pts –
展示时间戳。如果提供,它将用提供的值覆盖第一帧的 PTS。否则,PTS 会按照帧率的倒数递增。只有超过内部处理的 PTS 值的值才会被使用。
注意:提供的值会被转换为基于帧率的整数值。因此,它会被截断为最接近的
n / 帧率
的值。
刷新
voidtorio::io::StreamingMediaEncoder::flush()
刷新编码器中的帧并将这些帧写入目标位置。