Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
korul
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 9
#1

Ошибка загрузки сэмплов из WAV - C++

20.02.2014, 00:48. Просмотров 751. Ответов 5
Метки нет (Все метки)

Здравствуйте, извиняюсь сразу,миллион раз обсуждали эту проблему,но поиск мне не помог ее решить.
у меня программа загружает wav файл и потом я должен получить массив с отчетами, я не знаю как учесть заголовок,чтобы он не записывался в сэмплы, но беда вся в том , что n (количество отчетов) у меня получается в 2 раза больше чем j (сколько отчетов записывается в массив) ,зарание благодарен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include <iostream>
#include <fstream>
 
using namespace std;
// Структура, описывающая заголовок WAV файла.
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;
 
    // Аудио формат, полный список можно получить здесь [url]http://audiocoding.ru/wav_formats.txt[/url]
    // Для 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 main()
{
    setlocale(LC_CTYPE,"Russian");
    FILE *file;
    errno_t err;
    err = fopen_s(&file, "Slipknot - Three Nil.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_s("Sample rate: %d\n", header.sampleRate);
    printf_s("Channels: %d\n", header.numChannels);
    printf_s("Bits per sample: %d\n", header.bitsPerSample);
 
 
   // Посчитаем длительность воспроизведения в секундах
float fDurationSeconds = 1.f * header.subchunk2Size / (header.bitsPerSample / 8) / header.numChannels / header.sampleRate;
int iDurationMinutes = (int)(fDurationSeconds) / 60;
fDurationSeconds = fDurationSeconds - (iDurationMinutes * 60);
printf_s("Duration: %02d:%02.f\n", iDurationMinutes, fDurationSeconds);
 
//выгрузим данные из wav    
 ifstream in ("Slipknot - Three Nil.wav", ios::binary); // open file
    if(!in) {cout << "LOX"; return 0;} 
    in.seekg(0, ios::end);
 
    long q=in.tellg();
    long bitsize = 8*in.tellg();
    //размер файла в байтах. 1 бит - 1 цифра. т.о. размер *8=количество элементов/32 получим кол-во отчетов
    long n = (bitsize/header.bitsPerSample*header.numChannels);
 
 
   // long n=header.subchunk2Size*8/(header.numChannels * header.bitsPerSample);
 
    float *data = new float[n];  //объявляем массив данных выбранного канала
    
    ifstream instrm ("Slipknot - Three Nil.wav", ios::binary); //заново открываем для считывания данных
    float a = 0;
    int j = 0;
    int i = 0;
    cout << "\nЗагрузка данных в память\n" << endl;
    while(instrm.read((char *)&a, sizeof(float)))   // читаем числа по одному из файла и заполняем массив
    {                                             
        data[j] = a;
        //cout<<data[j]<<endl;
        j++;                    
           
    }
    cout << "Загрузка " << j << " объектов завершена\n" << endl;  
 
    fclose(file);
 
   
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2014, 00:48     Ошибка загрузки сэмплов из WAV
Посмотрите здесь:

Написать программу, формирующую по исходному WAV файлу новый WAV файл - C++
Написать программу, формирующую по исходному WAV файлу новый WAV файл, со сглаженным вершинами перегруженных (клипированных) фрагментов....

Ошибка сохранения/загрузки объекта с файла - C++
Привет всем. Столкнулся с проблемой сохранения/загрузки объекта в/из файла. Вытащил из моего проекта куски кода, и создал новый проект,...

Ошибка при попытке загрузки файла - C++
Задача состоит в том, чтобы по очереди загрузить файлы, введя их имена в консоль. #include &lt;fstream&gt; #include &lt;iostream&gt; using...

Карточная игра "Дурак" - Ошибка загрузки dll карт - C++
Есть проект (вроде должен работать). Запуская в Visual Studio 2010 получаю ошибку &quot;Ошибка загрузки dll карт&quot;. Самому исправить не...

2 wav одновременно - C++
доброго времени суток всем. нужно одновременно проигрывать несколько wav файлов.. пробывал audiere, ничего сложного, но при попытке...

обработка WAV на C++ - C++
Совсем не работал с форматами на C++. Задание следующее: Написать программу, формирующую по исходному WAV ( 8 бит на отсчет) файлу новый...

Wav в bmp - C++
Подскажите, пожалуйста, как разложить побитово wav-file и сложить его в bmp? Можно примеры кода?

txt to wav - C++
имеется txt файл с отчетами сигнала с известной частотой, необходимо из этих отсчетов сделать wav файл. Подскажите пожалуйста по этому...

Редактирование wav файлов в С++ - C++
Добрый день, друзья. Подскажите, кто сможет, как в С++ именно в консольном приложении редактировать аудио файлы? В большом и широком...

микширование файлов wav - C++
Нужна помощь, нужно написать микшер, чтобы воспроизводилось два файла в формате wav. возможно кто-то писал видел, поделитесь ... А если...

Стегография. Формат .wav - C++
Пишу лабу по стегографии. Необходимо использовать формат .wav (.wave) и алгоритм LSB. Подскажите, сколько байт заголовка занимает сей...

Шумящие биты в WAV - C++
Вот такой вопросик как писать программу для сохранения собственного сообщение в звуковом файле расширения .WAV программа должна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6932 / 4125 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
20.02.2014, 03:02     Ошибка загрузки сэмплов из WAV #2
Уже глубокая ночь и могу ошибиться, но мне кажется зря ты второй раз файл открываешь.
Сперва считал заголовок, потом используя этот же открытый поток, читаешь данные. Должно быть все нормально.
korul
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 9
20.02.2014, 14:16  [ТС]     Ошибка загрузки сэмплов из WAV #3
Даже если я его открою, вытащу из заголовка все что нужно, закрою и заново открою ,чтобы забрать отчеты из ваф ,то он серавно в 2 раза меньше отчетов загружает . n в два раза больше j ( и как мне ,когда открываю второй раз пропустить заголовок,его не загружать в массив,а сразу начать с отчетов?
DrOffset
6932 / 4125 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
20.02.2014, 14:28     Ошибка загрузки сэмплов из WAV #4
Цитата Сообщение от korul Посмотреть сообщение
Даже если я его открою, вытащу из заголовка все что нужно, закрою и заново открою ,чтобы забрать отчеты из ваф ,то он серавно в 2 раза меньше отчетов загружает . n в два раза больше j ( и как мне ,когда открываю второй раз пропустить заголовок,его не загружать в массив,а сразу начать с отчетов?
Зачем вообще файл закрывать? Читаете сначала заголовок, потом данные, в одной "сессии".
HighPredator
5465 / 1831 / 338
Регистрация: 10.12.2010
Сообщений: 5,412
Записей в блоге: 3
20.02.2014, 14:39     Ошибка загрузки сэмплов из WAV #5
Цитата Сообщение от korul Посмотреть сообщение
он серавно в 2 раза меньше отчетов загружает
Тут четыре варианта:
1) Вы неправильно считаете количество отсчетов.
2) Количество отсчетов вычислено правильно, но тип данных, необходимый под 1 отсчет у вас в 2 раза меньше чем должен быть.
3) У вас 2 канала в звуке, а грузите 1.
4) Файл обработан кодеком (не стандартный).

Добавлено через 3 минуты

Не по теме:

Попробую сейчас ободрать какой-нибудь из своих старых проектов, чтобы вы могли сравнить.

korul
0 / 0 / 0
Регистрация: 17.02.2014
Сообщений: 9
21.02.2014, 00:16  [ТС]     Ошибка загрузки сэмплов из WAV #6
кол-во отсчетов считано правильно,так как через другую прогу считал количество отсчетов, которая точно правильно работает.
а какой тип данных надо использовать?
1 канал , там не песня,а специальный файл,где я знаю количество отсчетов ,то что он 32 битный , однокональный,моно.

Добавлено через 5 часов 49 минут
нашел чей то проект,чуть чуть преобразовал свой - в итоге получил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct Wav_Header
{
    char Wav_ChunkId[4];
    int Wav_ChunkSize;
    char Wav_Format[4];
    char Wav_SubChunkId[4];
    int Wav_SubChunkSize;
    short int Wav_AudioFormat;
    short int Wav_NumChannels;
    int Wav_SampleRate;
    int Wav_ByteRate;
    short int Wav_BlockAlign;
    short int Wav_BitPerSample;
    char Wav_SubChunk2Id[4];
    int Wav_SubChunk2Size;
};
 
 
 
int main()
{
    FILE *rd_wav;
    Wav_Header ob1;
    cout<<sizeof(short)<<endl;
    if ((rd_wav=fopen("Slipknot - Three Nil.wav","rb"))==NULL)
        {
        fprintf(stderr,"owibka otkritiya faila dlya 4teniya");
        return 1;
        }
 
    fread(&ob1,sizeof(ob1),1,rd_wav);
    cout<<ob1.Wav_ChunkSize<<endl;
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_ChunkId[i];
    cout<<'\n';
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_Format[i];
    cout<<'\n';
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_SubChunkId[i];
    cout<<'\n';
    cout<<ob1.Wav_SubChunkSize<<endl;
    cout<<ob1.Wav_AudioFormat<<endl;
    cout<<ob1.Wav_NumChannels<<endl;
    cout<<ob1.Wav_SampleRate<<endl;
    cout<<ob1.Wav_ByteRate<<endl;
    cout<<ob1.Wav_BlockAlign<<endl;
    cout<<ob1.Wav_BitPerSample<<endl;
    for (int i=0; i<4; i++)
        cout<<ob1.Wav_SubChunk2Id[i];
    cout<<'\n';
    cout<<ob1.Wav_SubChunk2Size<<endl;
    /*
    short* buffer=new short [ob1.Wav_SubChunk2Size/2];
    fread(buffer, 2, ob1.Wav_SubChunk2Size/2, rd_wav);
    */
  char *pBuf = ( char * )malloc( sizeof( char ) * ob1.Wav_SubChunk2Size );
  fread( pBuf, 1, ob1.Wav_SubChunk2Size, rd_wav );
 
  fclose(rd_wav);
 
 
 
/*
    pFile = fopen( "RAW.raw", "wb" ); 
  BYTE RAW[256][256] = {0};
  BYTE bL = 0;
  for(int i = 0; i < ob1.Wav_SubChunk2Size; i++ )
  {
    bL = 256-pBuf[i];
    RAW[ bL ][ i/(ob1.Wav_SubChunk2Size/256) ] = 254;
  }
  fwrite( RAW, sizeof(RAW), 1, pFile );
*/
 
 
  //  delete [] buffer;
    
    return 0;
}
Можно ли такой тип данных использовать для хранения отсчетов?
Как их вывести или посчитать кол-во для того,чтобы проверить правильность?
ну эт более сложное - как отсчеты из массива перегнать в вектор ,для последующего БПФ?

Добавлено через 2 минуты
вся загвоздка в этих 2х строках,помогите пожалуйста)
C++
1
2
 char *pBuf = ( char * )malloc( sizeof( char ) * ob1.Wav_SubChunk2Size );
  fread( pBuf, 1, ob1.Wav_SubChunk2Size, rd_wav );
Yandex
Объявления
21.02.2014, 00:16     Ошибка загрузки сэмплов из WAV
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru