Вернуться   Развлекательный портал CN.ru - Форум > Технологии > Программирование > Начинающим

Ответ
 
Опции темы
Старый 16.06.2012, 12:25 ↑ #1
aleshqa Мужской
новый эго-житель
 
Регистрация: 04.09.2010
Возраст: 27
Сообщений: 7
Репутация: 0
aleshqa молчание-золото
Отправить сообщение для aleshqa с помощью ICQ
По умолчанию запись wav c++

код считывает побайтно звуковой файл и добавляет эффект эха. подскажите, как теперь записать результат в новый wav файл

Код:
#include <iostream> 
#include <Windows.h>
#include <fstream> 


using namespace std; 


void main(void)
{


    
    setlocale(LC_ALL,"Russian"); //Локаль


    ifstream file("C:/2.wav",ios::beg | ios::in|ios::binary); //Наша wav'ка
    if (!file) cout<<"Не удалось открыть файл"<<endl; 


    DWORD dwRIFF = 0; //И так идет формат wav-файла, он относится к RIFF-файлам, поэтому читаем 4 байта структуы
    file.read((char*) &dwRIFF,4);
    if (dwRIFF != MAKEFOURCC('R','I','F','F')) //Если RIFF не получили, то значит какую то залепу открыли
    {
        cout<<"Файл не является RIFF - formated"<<endl;
      
    }




    
    file.ignore(4); //Пропустим 4 байта там какая то охинея нам совершенно не нужна
    DWORD dwWave = 0; //Секция WAVE
    DWORD dwFormat = 0; // Секция fmt /формат файла/
    long  lSizeFmt = 0; //Размер секции fmt
    
    file.read((char*)&dwWave,4); //Читаем 4 байта, там для Wav-файла должно быть название секции WAVE
    if (dwWave != MAKEFOURCC('W','A','V','E')) //Проверим
    {
        cout<<"Файл не имеет секции WAVE"<<endl;
    
}
    
    file.read((char*)&dwFormat,4); //Если все ОК... То читаем 
    if (dwFormat != MAKEFOURCC('f','m','t',' ')) //Если секция fmt - не найдена 
    {
        cout<<"Файл не имеет Format(fmt)-Секции "<<endl;
       
    }
    file.read((char*)&lSizeFmt,4); //Еще читаем 4 байта, там у нас размер секции формат, где идет сам формат + может идти всякая охинея, формат лежит в 16 байтах
    WAVEFORMATEX WaveFormat = WAVEFORMATEX(); //Определим структуру винды
    file.read((char*)&WaveFormat,16); //Прочитаем ее
    file.ignore(lSizeFmt-16); //Пропустим охинею
    if (WaveFormat.wFormatTag != 1) //Если таг <>1 то значит есть компрессия файла, ее разбирать мы не будем, работаем не с жатыми данными
    {
        cout<<"Файл имеет компрессию"<<endl;
        
    }
    
    DWORD dwSection = 0; //Следующая секция у нас или fact(Не обязательная) или data(это как раз наш звук)
    file.read((char*)&dwSection,4); //Читаем заголовок
    if (dwSection == MAKEFOURCC('f','a','c','t')) //Если все же fact - то пропускаем ее
    {
        cout<<"Файл имеет секцию fact"<<endl;
        DWORD dwSizeFact = 0;
        file.read((char*)&dwSizeFact,4);
        file.ignore(dwSizeFact);
        file.read((char*)&dwSection,4);
    }


    if (dwSection != MAKEFOURCC('d','a','t','a')) //Ну а теперь сама data - это то, над чем мы будем работать
    {
        cout<<"Не найдена секция data"<<endl;
       
    }
    DWORD dwDataSize =0; 
    file.read((char*)&dwDataSize,4); //Прочитаем ее размер
    char *pData = new char[dwDataSize]; //Динамически выделим переменную типа char[размер звуковых данных]


    file.read(pData,dwDataSize); //Прочитаем в нее все звуковые данные
    file.close(); //Закроем файл, он нам уже не нужен, у нас есть pData


    //И так реализация эха
    char *pDataEcho = new char[dwDataSize+int(1.5*WaveFormat.nAvgBytesPerSec)];  //Введем новую указатель на данные и увеличим его на 1.5(секунды) * Байты в секунду
    memset(pDataEcho,0,dwDataSize+1.5*WaveFormat.nAvgBytesPerSec); //обнулим его
    for (int i = 0; i<dwDataSize; i++) //Обходим весь массив (исходных данных) которые из файла вытащили
    {
       
        pDataEcho[i] += pData[i]; 
        pDataEcho[i+int(0.5*WaveFormat.nAvgBytesPerSec)]+= 0.6 * pData[i]; //Сдвигаем на 0.5 секунд и слогаем текущий(исходный) байт * на коэффициент первого затухания
        pDataEcho[i+int(1*WaveFormat.nAvgBytesPerSec)]+= 0.3 * pData[i]; //Сдвигаем на 1 секунду и так же (только коэффициент 0.3)
        pDataEcho[i+int(1.5*WaveFormat.nAvgBytesPerSec)]+= 0.1 * pData[i]; //И последняя волна через 1.5 секунды которая дойдет (коэф. 0.1) -почти не ощутимый
    }
    pData = pDataEcho; //Заменим данные


  






  }
aleshqa вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Текущее время: 16:22. Часовой пояс GMT +6.
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot

ВКонтактeTwitterFacebook
Хотите связаться с нами? Напишите письмо, и мы обязательно ответим.