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

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

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

Какой тип данных использовать для хранения сэмплов? - C++

30.10.2012, 18:59. Просмотров 467. Ответов 0
Метки нет (Все метки)

Добрый день. Начал изучать формат .wav. Хочу прочитать его заголовок, ну и, собсно, данные. С заголовками все ясно.
А какой тип данных мне использовать для сэмплов, чтобы был доступ к каждому сэмплу?
или доступ к каждому сэмплу не нужен? и достаточно будет двухбайтового short int?
Начал юзать прогу 010 Editor - реадер двоичных файлов. там представляется структура читаемого файла. Эта прога написана на Си и вот там для хранения сэмплов используется short.


Вот прога для считывания данных с файла .wav. Считываю данные и проверяю, правильно ли считалось методом вывода прочитанного на консоль и сверки с байтами файла аааа.wav в проге 010 Editor. В конце проги динамически выделяю массив short. Прога работает, но насчет типа данных для сэмплов я не уверен. нужен ли доступ к 1му сэмплу? или можно обойтись к доступу к паре сэмплов?

В дальнейшем планирую считанные дата закодировать хаффманом и перегнать в другой формат аудио. мб lossless.

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
#include <iostream>
 
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("c:\\aaaa.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);
    cout<<"buffer1="<<buffer[0]<<endl;
    cout<<"buffer2="<<buffer[1]<<endl;
    delete [] buffer;
    fclose(rd_wav);
    return 0;
}
Добавлено через 41 минуту
тупанул)
дело в поле BitPerSample и в том, что в базовых кодерах-декодерах идет 16 бит на сэмпл) поэтому и юзают везде short.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2012, 18:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какой тип данных использовать для хранения сэмплов? (C++):

Какой тип данных использовать для работы с большими числами? - C++
Здравствуйте! Какой тип данных можно использовать для больших чисел( unsigned long long не получается)?

Какой тип использовать для создания рекрсивного массива - C++
Здравствуйте. Не в первый раз встречаюсь с различными задачами в которых очень удобно было бы использовать универсальный тип...

Использовать в качестве контейнера для хранения данных динамические массивы - C++
Задача состоит в том, чтобы разработать программу, используя в качестве контейнера для хранения данных динамические массивы. В прошлой...

Создать класс, содержащий поля, которые можно использовать для хранения данных - C++
Создать класс &lt;имя класса&gt; (имя класса задается в соответствии с выбранным вариантом), содержащий поля, которые можно использовать для...

Какой тип лучше использовать для расположения тестовых данных? - C++
доброго времени суток имеется файл, в котором есть последовательность данных для теста - последовательность вопросов и вариантов ответов...

Какой тип данных нужен для возведения в степень - C++
Добрый день. При возведении числа в степень столкнулся с проблемой, что при возведении числа 9 в 8 степень (как пример) выдает абракадабру...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 18:59
Привет! Вот еще темы с ответами:

Какой тип использовать? - C++
В какой тип нужно преобразовать int, что бы вывести через TextOut? Пытался через wchar_t, потом пробовал через TextOutA и через char, но...

Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? - C++
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не...

Какой тип данных лучше подойдет для приложения, которое делит числа int или float? - C++
Ответ написал int Хотя нутром чую, что float

Смысл const char* и о том, какой тип строк лучше использовать - C++
Я никак не могу понять смысла const char*. Это строка в стиле C, я знаю. Но чем эта запись отличается от char*? Или вообще, просто char?...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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