Функция PlaySound не будет работать для моих файлов wav, созданных вручную, даже если они хорошо открываются в проигрывателе Windows Media.

Я использую [VS 2015 для рабочего стола] и я пишу на C ++. Я использовал Audacity для записи WAV-файлов, а затем использовал PlaySound для их воспроизведения, и они отлично работают.

Я буквально открыл потоки и вставил, побайтно, заголовок и данные для нового файла WAV. (Я признаю, что почти весь этот код скопирован из Интернета, но я все еще анализировал его, чтобы изучить для себя.) Синтезированные файлы wav, из этого кода, могут воспроизводиться на любом аудиоплеере (включая Audacity), так же как записи Audacity могут , но они не работают для PlaySound. Настройки заголовка такие же, я проверял.

namespace little_endian_io {
template <typename Word> std::ostream& write_word(std::ostream& outs, Word value, unsigned size = sizeof(Word))
{
for (; size; --size, value >>= 8)
outs.put(static_cast <char> (value & 0xFF));
return outs;
}
}

using namespace little_endian_io;

ofstream out(pathpat + "\\voces\\_audiophiles\\outputs.wav", std::ios::binary);

///HEADER
out << "RIFF----WAVEfmt ";
write_word(out, 16, 4);  // no extension data
write_word(out, 1, 2);  // PCM - integer samples
write_word(out, 2, 2);  // stereo
write_word(out, 44100, 4);  // Hz
write_word(out, 176400, 4);  // (Sample Rate * BitsPerSample * Channels) / 8
write_word(out, 4, 2);  // data block size (size of two integer samples, one for each channel, in bytes)
write_word(out, 16, 2);  // number of bits per sample (use a multiple of 8)

///DATA
size_t data_chunk_pos = out.tellp();
out << "data----";

//~~CONTENTS
for (int i = 0; i < gemz.size(); i++) {
ifstream inn(gemz[i], std::ios::binary);
inn.seekg(44);

out << inn.rdbuf();
}

//~~CONTENTS

// (We'll need the final file size to fix the chunk sizes above)
size_t file_length = out.tellp();

// Fix the data chunk header to contain the data size
out.seekp(data_chunk_pos + 4);
write_word(out, file_length - data_chunk_pos + 8,4); //i added the 4 as the third arg, thanks to Remy

// Fix the file header to contain the proper RIFF chunk size, which is (file size - 8) bytes
out.seekp(0 + 4);
write_word(out, file_length - 8, 4);

out.close();

PlaySound(TEXT(pathpat + "\\voces\\_audiophiles\\output.wav".c_str()), NULL, SND_FILENAME);
PlaySound(pathpat + "\\voces\\_audiophiles\\output.wav".c_str(), NULL, SND_FILENAME);

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]