我正在從 Riff wav fmt 檔案中讀取資料,我有一個DataBufferwav 檔案的資料塊陣列,如何將讀取資料的位元組數轉換為從 wav 檔案中讀取的秒數。
int size_buffer = (Subchunk2Size / (NumOfChan * bitsPerSample / 8));
FILE* WavResult = fopen(FileNom, "rb");
u8* DataBuffer = new u8[size_buffer];
size_t nRead = fread(DataBuffer, sizeof DataBuffer[0], size_buffer, WavResult);
uj5u.com熱心網友回復:
我覺得你有點混淆了。假設 WAV 標頭中的欄位名稱如http://soundfile.sapp.org/doc/WaveFormat 中所述:
ChunkID - "RIFF"
ChunkSize
Format - "WAVE"
Subchunk1ID - "fmt "
Subchunk1Size
AudioFormat
NumChannels
SampleRate
ByteRate
BlockAlign
BitsPerSample
Subchunk2ID - "data"
Subchunk2Size
data
你的這一行:
int size_buffer = (Subchunk2Size / (NumOfChan * bitsPerSample / 8));
計算單個通道中的多個樣本。或者多個塊,其中塊是一個結構,每個通道包含一個樣本。如果您使用的是用于分配記憶體位元組從data塊,那么它只會在8位單聲道音頻的情況下是不夠的。
如果為位元組分配記憶體確實是您想要的,那么只需將其Subchunk2Size用作大小。
如果你想為samples分配記憶體,那么它會有所不同,具體取決于音頻是 8 位還是 16 位(我忽略了其他可能性)。對于 8 位:
const uint32_t num_of_samples = Subchunk2Size / (BitsPerSample / 8);
uint8_t *samples = new uint8_t[num_of_samples];
對于 16 位:
const uint32_t num_of_samples = Subchunk2Size / (BitsPerSample / 8);
int16_t *samples = new int16_t[num_of_samples];
就個人而言,我寧愿使用std::vector而不是 c 陣列:
const uint32_t num_of_samples = Subchunk2Size / (BitsPerSample / 8);
std::vector<int16_t> samples;
samples.resize(num_of_samples); // could be done in the constructor, but I am afraid of vector constructors ;-)
我還假設音頻是最流行的編碼(我認為),即 8 位無符號和 16 位有符號。我也忽略了位元組序的問題。
但回到秒數。我們可以使用塊的總數和 來計算SampleRate。SampleRate告訴我們每秒有多少樣本(在單個通道中)。或者換句話說,每秒有多少塊。所以秒數是:
const double num_of_seconds = 1.0 * num_of_blocks / SampleRate;
您可以使用第一行中的公式計算塊數:
const uint32_t num_of_blocks = Subchunk2Size / (NumChannels * BitsPerSample / 8);
或者,正如我們已經知道的num_of_samples,它是來自所有通道的樣本總數,我們可以將其除以NumChannels:
const uint32_t num_of_blocks = num_of_samples / NumChannels;
最后,如果您想要的只是從位元組數中獲取秒數,那么有 2 個選項。您可以計算塊大小:
const int block_size = NumChannels * BitsPerSample / 8;
這應該與 基本相同BlockAlign,然后除以Subchunk2Size它,得到塊數,再除以SampleRate得到秒數:
const double num_of_seconds = 1.0 * Subchunk2Size / block_size / SampleRate;
// or
const double num_of_seconds = 1.0 * Subchunk2Size / BlockAlign / SampleRate;
或者您可以使用ByteRate,這是每秒的位元組數:
const double num_of_seconds = 1.0 * Subchunk2Size / ByteRate;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376900.html
上一篇:使用std::map保持正確性
