forked from xiaozhi/xiaozhi-esp32
Support ogg files frame duration <= 60
This commit is contained in:
@@ -554,7 +554,6 @@ void AudioService::PlaySound(const std::string_view& ogg) {
|
|||||||
bool seen_head = false;
|
bool seen_head = false;
|
||||||
bool seen_tags = false;
|
bool seen_tags = false;
|
||||||
int sample_rate = 16000; // 默认值
|
int sample_rate = 16000; // 默认值
|
||||||
int frame_duration = OPUS_FRAME_DURATION_MS; // 默认值
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
size_t pos = find_page(offset);
|
size_t pos = find_page(offset);
|
||||||
@@ -595,15 +594,8 @@ void AudioService::PlaySound(const std::string_view& ogg) {
|
|||||||
if (pkt_len >= 19 && std::memcmp(pkt_ptr, "OpusHead", 8) == 0) {
|
if (pkt_len >= 19 && std::memcmp(pkt_ptr, "OpusHead", 8) == 0) {
|
||||||
seen_head = true;
|
seen_head = true;
|
||||||
|
|
||||||
// OpusHead结构:
|
// OpusHead结构:[0-7] "OpusHead", [8] version, [9] channel_count, [10-11] pre_skip
|
||||||
// 0-7: "OpusHead"
|
// [12-15] input_sample_rate, [16-17] output_gain, [18] mapping_family
|
||||||
// 8: version (1)
|
|
||||||
// 9: channel_count
|
|
||||||
// 10-11: pre_skip (little-endian)
|
|
||||||
// 12-15: input_sample_rate (little-endian)
|
|
||||||
// 16-17: output_gain (little-endian)
|
|
||||||
// 18: mapping_family
|
|
||||||
|
|
||||||
if (pkt_len >= 12) {
|
if (pkt_len >= 12) {
|
||||||
uint8_t version = pkt_ptr[8];
|
uint8_t version = pkt_ptr[8];
|
||||||
uint8_t channel_count = pkt_ptr[9];
|
uint8_t channel_count = pkt_ptr[9];
|
||||||
@@ -612,18 +604,8 @@ void AudioService::PlaySound(const std::string_view& ogg) {
|
|||||||
// 读取输入采样率 (little-endian)
|
// 读取输入采样率 (little-endian)
|
||||||
sample_rate = pkt_ptr[12] | (pkt_ptr[13] << 8) |
|
sample_rate = pkt_ptr[12] | (pkt_ptr[13] << 8) |
|
||||||
(pkt_ptr[14] << 16) | (pkt_ptr[15] << 24);
|
(pkt_ptr[14] << 16) | (pkt_ptr[15] << 24);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "OpusHead: version=%d, channels=%d, sample_rate=%d",
|
ESP_LOGI(TAG, "OpusHead: version=%d, channels=%d, sample_rate=%d",
|
||||||
version, channel_count, sample_rate);
|
version, channel_count, sample_rate);
|
||||||
|
|
||||||
// 根据采样率推断可能的帧持续时间
|
|
||||||
if (sample_rate == 48000) {
|
|
||||||
frame_duration = 20;
|
|
||||||
} else if (sample_rate == 16000) {
|
|
||||||
frame_duration = 60;
|
|
||||||
} else {
|
|
||||||
frame_duration = OPUS_FRAME_DURATION_MS; // 保持默认值
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -640,7 +622,7 @@ void AudioService::PlaySound(const std::string_view& ogg) {
|
|||||||
// Audio packet (Opus)
|
// Audio packet (Opus)
|
||||||
auto packet = std::make_unique<AudioStreamPacket>();
|
auto packet = std::make_unique<AudioStreamPacket>();
|
||||||
packet->sample_rate = sample_rate;
|
packet->sample_rate = sample_rate;
|
||||||
packet->frame_duration = frame_duration;
|
packet->frame_duration = 60;
|
||||||
packet->payload.resize(pkt_len);
|
packet->payload.resize(pkt_len);
|
||||||
std::memcpy(packet->payload.data(), pkt_ptr, pkt_len);
|
std::memcpy(packet->payload.data(), pkt_ptr, pkt_len);
|
||||||
PushPacketToDecodeQueue(std::move(packet), true);
|
PushPacketToDecodeQueue(std::move(packet), true);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ dependencies:
|
|||||||
espressif/esp_lcd_panel_io_additions: ^1.0.1
|
espressif/esp_lcd_panel_io_additions: ^1.0.1
|
||||||
78/esp_lcd_nv3023: ~1.0.0
|
78/esp_lcd_nv3023: ~1.0.0
|
||||||
78/esp-wifi-connect: ~2.5.0
|
78/esp-wifi-connect: ~2.5.0
|
||||||
78/esp-opus-encoder: ~2.4.0
|
78/esp-opus-encoder: ~2.4.1
|
||||||
78/esp-ml307: ~3.2.6
|
78/esp-ml307: ~3.2.6
|
||||||
78/xiaozhi-fonts: ~1.4.0
|
78/xiaozhi-fonts: ~1.4.0
|
||||||
espressif/led_strip: ^2.5.5
|
espressif/led_strip: ^2.5.5
|
||||||
|
|||||||
Reference in New Issue
Block a user