LINUX.ORG.RU

Столкнулся с парсингом заголовка wav звука?

 ,


0

1

Юзаю такой код:

struct WAVHEADER
{
  // WAV-формат начинается с RIFF-заголовка:

  // Содержит символы "RIFF" в ASCII кодировке
  // (0x52494646 в big-endian представлении)
  char chunkId[4];

  // 36 + subchunk2Size, или более точно:
  // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
  // Это оставшийся размер цепочки, начиная с этой позиции.
  // Иначе говоря, это размер файла - 8, то есть,
  // исключены поля chunkId и chunkSize.
  unsigned long chunkSize;

  // Содержит символы "WAVE"
  // (0x57415645 в big-endian представлении)
  char format[4];

  // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
  // Подцепочка "fmt " описывает формат звуковых данных:

  // Содержит символы "fmt "
  // (0x666d7420 в big-endian представлении)
  char subchunk1Id[4];

  // 16 для формата PCM.
  // Это оставшийся размер подцепочки, начиная с этой позиции.
  unsigned long subchunk1Size;

  // Аудио формат, полный список можно получить здесь http://audiocoding.ru/wav_formats.txt
  // Для PCM = 1 (то есть, Линейное квантование).
  // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
  unsigned short audioFormat;

  // Количество каналов. Моно = 1, Стерео = 2 и т.д.
  unsigned short numChannels;

  // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
  unsigned long sampleRate;

  // sampleRate * numChannels * bitsPerSample/8
  unsigned long byteRate;

  // numChannels * bitsPerSample/8
  // Количество байт для одного сэмпла, включая все каналы.
  unsigned short blockAlign;

  // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
  unsigned short bitsPerSample;

  // Подцепочка "data" содержит аудио-данные и их размер.

  // Содержит символы "data"
  // (0x64617461 в big-endian представлении)
  char subchunk2Id[4];

  // numSamples * numChannels * bitsPerSample/8
  // Количество байт в области данных.
  unsigned long subchunk2Size;

  // Далее следуют непосредственно Wav данные.
};
int j = 0;
#ifdef _WIN32
  file = open("content//konga.wav", _A_ARCH);
#else
  file = open(filename, O_RDONLY);
#endif // _WIN32
  if (file == -1)
  {
    printf("Open failed on input file: %s\n", "content//konga.wav");
#ifdef _WIN32
    wchar_t path[MAX_PATH];
    GetCurrentDirectory(sizeof(path), path);
    std::wcout << path << std::endl;
#endif // _WIN32
  }
  org = 0;

  FILE* file_;
  errno_t err;
  err = fopen_s(&file_, "content//konga.wav", "rb");
  if (err)
  {
    printf_s("Failed open file, error %d", err);
    return 0;
  }

  WAVHEADER header;

  fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file_);
  printf("audioformat:%d\n", header.audioFormat);
  printf("bitsPerSample:%d\n", header.bitsPerSample);
  printf("blockAlign:%d\n", header.blockAlign);
  printf("byteRate:%lu\n", header.byteRate);
  printf("chunkId:%s\n", header.chunkId);
  printf("chunkSize:%lu\n", header.chunkSize);
  printf("format:%s\n", header.format);
  printf("numCannels:%d\n", header.numChannels);
  printf("sampleRate:%lu\n", header.sampleRate);
  printf("subchunk1Id:%s\n", header.subchunk1Id);
  printf("subchunk1Size:%lu\n", header.subchunk1Size);
  printf("subchunk2Id:%s\n", header.subchunk2Id);
  printf("subchunk2Size:%lu\n", header.subchunk2Size);
  fclose(file_);

Выхлоп такой в случае хорошего файла https://ibb.co/Rv8hJKZ И в моем случае https://ibb.co/dgBg4Fh



Последнее исправление: bad_master (всего исправлений: 2)

Нет никакой гарантии, что в WAV-файле chunk ‘data’ будет идти сразу после ‘fmt’. Нужно проходить по всем chunk’ам, пока не найдешь все нужные тебе.

goto-vlad
()
Ответ на: комментарий от bad_master

Я эты вавы получаю из онлайн конвертера, может есть тот который сконвертирует в мой шаблон?

Нагуглил за тебя:

ffmpeg -i old_file -flags +bitexact new.wav

Может, тогда и онлайн конвертер не понадобится?

goto-vlad
()
Ответ на: комментарий от bad_master

Интересно, оно убрало почти весь INFO chunk, но оставило поле ISFT. На Убунте такого не наблюдается, с этим же файлом. У тебя Windows?

goto-vlad
()
Ответ на: комментарий от goto-vlad

это легко делать гуглится любой файлообменник

bad_master
() автор топика
Ответ на: комментарий от bad_master

Та же команда, только новый wav-файл назови по-другому.

goto-vlad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.