我正在用Qt编写媒体播放器,但现在我面临着一些未知的情况。实际上,我正在尝试使用QAudioOutput和QAudioDecoder来播放高分辨率音乐(24,32甚至64位音频(。但是QAudioFormat(所有音频类之间的粘合(指定了一个 sampleType,如下表所示:
| Constant | Value | Description |
|---------------------------|-------|--------------------------------|
| QAudioFormat::Unknown | 0 | Not Set |
| QAudioFormat::SignedInt | 1 | Samples are signed integers |
| QAudioFormat::UnSignedInt | 2 | Samples are unsigned intergers |
| QAudioFormat::Float | 3 | Samples are floats |
现在,当我还将样本大小设置为大于 16 位时,就会出现问题。我现在有一个需要确认的假设:
- 假设整数的大小为 32 位,如果我想支持高达 32 位的样本大小,我必须使用 QAudioFormat::SignedInt 和 pcm 音频用于 24 位和 32 位音频(填充 0 表示 24 位音频(。
但是,如果样本量更高(例如:将 dsd 的 64 位音频转换为 pcm(怎么办。我是否应该假设我仍然将样本类型设置为 QAudioFormat::SignedInt,但每个 64 位的"样本"都存储在两个整数中?还是QtMultimedia根本不支持它?
我对任何启蒙😙都持开放态度!
来自QAudioFormat::setSampleSize()
的文档:
void QAudioFormat::setSampleSize(int sampleSize(
将样本大小设置为指定的样本大小(以位为单位(。
这通常是 8 或 16,但某些系统可能支持更高的样本 大小。
因此,若要使用 64 位示例,需要调用setSampleSize(64)
。 这可以与调用setSampleType()
结合使用,以指定样本是定点有符号还是定点无符号还是浮点 - 请注意,setSampleType()
中的值并不意味着任何特定的样本大小。
对于 64 位音频,每个样本将存储为 64 位数据;您可以将每个样本作为long long int
访问,或者作为int64_t
访问(或unsigned long long int
或uint64_t
对于无符号样本,或作为浮点样本的double
(。
(当然,这些都不能保证你的Qt库的QtMultimedia实际上支持64位样本;它可能会也可能不会,但至少API支持告诉Qt你想要什么:)(