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

Работа со звуком - C++

Восстановить пароль Регистрация
 
mago
Сообщений: n/a
31.01.2013, 16:12     Работа со звуком #1
В общем, мне нужно реализовать обычное эхо в некомпрессированном wav файле со звуком и сохранить в новый файл. Но при добавлении появляется шум! Обычное ли это явление, или я что-то делаю не так?
В моём примере пытаюсь сделать задержку в 1 секунду.
Привожу код:
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
#include <stdio.h>
#include <iostream> 
#include <Windows.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include <fstream>
using namespace std;
void main (void)
{
    setlocale(LC_ALL,"Russian"); //Локаль
    ifstream file("C:\\ok.wav",ios::beg | ios::in|ios::binary); //Наша wav'ка
    
    DWORD dwRIFF = 0; //И так идет формат wav-файла, он относится к RIFF-файлам, поэтому читаем 4 байта структуы
    file.read((char*) &dwRIFF,4);
    if (dwRIFF != MAKEFOURCC('R','I','F','F')) //Если RIFF не получили, то значит какую то залепу открыли
    {
        cout<<"Файл не является RIFF - formated"<<endl;
        system("pause");
        return;
    }
 
    long chunkSize = 0;
    file.read((char*)&chunkSize,4);
    cout<<"chunkSize = "<<chunkSize<<endl;
    
    DWORD dwWave = 0; //Секция WAVE
    file.read((char*)&dwWave,4); //Читаем 4 байта, там для Wav-файла должно быть название секции WAVE
    if (dwWave != MAKEFOURCC('W','A','V','E')) //Проверим
    {
        cout<<"Файл не имеет секции WAVE"<<endl;
        system("pause");
        return;
    }
 
    DWORD dwFormat = 0; // Секция fmt /формат файла/
    file.read((char*)&dwFormat,4); //Если все ОК... То читаем 
    if (dwFormat != MAKEFOURCC('f','m','t',' ')) //Если секция fmt - не найдена 
    {
        cout<<"Файл не имеет Format(fmt)-Секции "<<endl;
        system("pause");
        return;
    }
 
    long  lSizeFmt = 0; //Размер секции fmt
    file.read((char*)&lSizeFmt,4);
    cout<<"lSizeFmt = "<<lSizeFmt<<endl;
 
    long  audioFormat = 0;
    file.read((char*)&audioFormat,2);
    cout<<"audioFormat = "<<audioFormat<<endl;
 
    long numChannels = 0;
    file.read((char*)&numChannels,2);
    cout<<"numChannels = "<<numChannels<<endl;
    
    long sampleRate = 0;
    file.read((char*)&sampleRate,4);
    cout<<"sampleRate = "<<sampleRate<<endl;
 
    long byteRate = 0;
    file.read((char*)&byteRate,4);
    cout<<"byteRate = "<<byteRate<<endl;
 
    long blockAlign = 0;
    file.read((char*)&blockAlign,2);
    cout<<"blockAlign = "<<blockAlign<<endl;
    
    long bitsPerSample = 0;
    file.read((char*)&bitsPerSample,2);
    cout<<"bitsPerSample = "<<bitsPerSample<<endl;
 
    DWORD dwSection = 0; //Следующая секция у нас data(это как раз наш звук)
    file.read((char*)&dwSection,4); //Читаем заголовок
    if (dwSection != MAKEFOURCC('d','a','t','a')) //Ну а теперь сама data - это то, над чем мы будем работать
    {
        cout<<"Не найдена секция data"<<endl;
        system("pause");
        return;
    }
    
    long dwDataSize = 0; 
    file.read((char*)&dwDataSize,4);
    cout<<"dwDataSize = "<<dwDataSize<<endl;
 
    char *pData = new char[dwDataSize]; //Динамически выделим переменную типа char[размер звуковых данных]
    file.read (pData, dwDataSize); //Прочитаем в нее все звуковые данные
    
    file.close();
 
    char *pDataEcho = new char [dwDataSize + int (1 * byteRate)]; 
    memset (pDataEcho, 0, dwDataSize + 1 * byteRate); 
    signed long sum;
//////////Далее самое главное - делаем эхо///////////
    for (int i = 0; i < dwDataSize; i++) 
    {
        pDataEcho [i] += pData [i];
        pDataEcho [i + int (1 * byteRate)] += pData[i];
    }
    long dwDataSize2 = 0;
    dwDataSize2 = dwDataSize + 1 * byteRate;
 
    long chunkSize2 = dwDataSize2 + 36;
 
    ofstream file2("C:\\ok2.wav",ios::beg | ios::out|ios::binary);
 
    file2.write((char*)&dwRIFF,4);
    file2.write((char*)&chunkSize2,4);
    file2.write((char*)&dwWave,4);
    file2.write((char*)&dwFormat,4);
    file2.write((char*)&lSizeFmt,4);
    file2.write((char*)&audioFormat,2);
    file2.write((char*)&numChannels,2);
    file2.write((char*)&sampleRate,4);
    file2.write((char*)&byteRate,4);
    file2.write((char*)&blockAlign,2);
    file2.write((char*)&bitsPerSample,2);
    file2.write((char*)&dwSection,4);
    file2.write((char*)&dwDataSize2,4);
    file2.write(pDataEcho, dwDataSize2);
 
    file2.close();
    delete pDataEcho;
    delete pData;
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2013, 16:12     Работа со звуком
Посмотрите здесь:

C++ Работа со звуком средствами библиотеки мультимедиа Windows
Работа со звуком в с++ C++
Работа со звуком C++
Работа со звуком! (Ошибка) Аппаратный генератор случайных чисел! C++
C++ Работа со звуком! Ошибка! SOS!
Работа со звуком C++
Работа со звуком в C++ C++
C++ Работа со звуком (VS 2012)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 01:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru