4 changed files with 69 additions and 9 deletions
-
37core/components/audio/wav_recorder.cpp
-
26core/components/audio/wav_recorder.hpp
-
6core/components/audio/wavheader.hpp
-
9module.cmake
@ -0,0 +1,37 @@ |
|||
#include "wav_recorder.hpp"
|
|||
using namespace std; |
|||
using namespace iflytop; |
|||
using namespace core; |
|||
|
|||
void WavRecorder::writeVoice(string filename, uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, |
|||
const char* data, uint32_t size) { |
|||
ofstream file; |
|||
WAVHeader wavHeader; |
|||
// logger->info("writeVoice filename:{} {} {} {} {}", filename, sample_rate, bits_per_sample, num_channels, size);
|
|||
file.open(filename, ios::out | ios::binary | ios::app); |
|||
|
|||
/**
|
|||
* @brief 判断文件大小,文件大小大于等于44字节,说明文件已经存在,不需要写入头部 |
|||
*/ |
|||
file.seekp(0, ios::end); |
|||
uint32_t filesize = file.tellp(); |
|||
|
|||
if (filesize < 44) { |
|||
wavHeader.initialize(sample_rate, bits_per_sample, num_channels, 0); |
|||
file.seekp(0, ios::beg); |
|||
file.write((char*)wavHeader.data(), wavHeader.size()); |
|||
} |
|||
file.seekp(0, ios::end); |
|||
file.write(data, size); |
|||
/**
|
|||
* @brief 更新头部信息 |
|||
*/ |
|||
file.seekp(4, ios::beg); |
|||
uint32_t chunk_size = filesize + size - 8; |
|||
file.write((char*)&chunk_size, 4); |
|||
file.seekp(40, ios::beg); |
|||
uint32_t subchunk2_size = filesize + size - 44; |
|||
file.write((char*)&subchunk2_size, 4); |
|||
|
|||
file.close(); |
|||
} |
@ -0,0 +1,26 @@ |
|||
#pragma once
|
|||
#include <fstream>
|
|||
#include <iostream>
|
|||
#include <list>
|
|||
#include <map>
|
|||
#include <memory>
|
|||
#include <set>
|
|||
#include <sstream>
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "iflytopcpp/core/components/audio/wavheader.hpp"
|
|||
#include "iflytopcpp/core/spdlogfactory/logger.hpp"
|
|||
#include "iflytopcpp/core/thread/thread.hpp"
|
|||
|
|||
namespace iflytop { |
|||
namespace core { |
|||
class WavRecorder { |
|||
ENABLE_LOGGER(WavRecorder); |
|||
|
|||
public: |
|||
void writeVoice(string filename, uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, |
|||
const char* data, uint32_t size); |
|||
}; |
|||
} // namespace core
|
|||
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue