Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2013, 01:42   #1
Flipsss
 
Регистрация: 20.07.2013
Сообщений: 4
По умолчанию Работа со звуком

Требуется написать программу на С++, которая будет делать инверсию звукового(в формате wav) файла.
Flipsss вне форума Ответить с цитированием
Старый 20.07.2013, 23:58   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

Код:
#include <fstream>
#include <iostream>
#include <string>
#include <locale>

#define WAV_HEADER_LENGTH 44

typedef struct waveformat_tag {

} WAVEFORMAT, *PWAVEFORMAT;

typedef struct waveheader_tag {
	unsigned short    wFormatTag;        /* format type */
	unsigned short    nChannels;         /* number of channels (i.e. mono, stereo, etc.) */
	unsigned int nSamplesPerSec;    /* sample rate */
	unsigned int nAvgBytesPerSec;   /* for buffer estimation */
	unsigned short    nBlockAlign;       /* block size of data */
	unsigned short        wBitsPerSample;

} WAVEHEADER, *PWAVEHEADER;

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	wstring wsfWavIn;
	wstring wsfWavOut;

	string sHead;
	string sWrkr;

	setlocale(LC_ALL, "russian");

	switch (argc)
	{
	case 1:
		cout << "Первый параметр - исходный файл.\nВторой параметр - конвертированный файл.\n";
		getchar();
		return 0;
	case 2:
		wsfWavIn = argv[1];
		wsfWavOut.append(wsfWavIn.data(), wsfWavIn.length() - 4);
		wsfWavOut += L"_reversed.wav";
		break;
	case 3:
		wsfWavIn = argv[1];
		wsfWavOut = argv[2];
		break;
	default: 
		cout << "Не верное количество аргументов.\n";
		getchar();
		return 1;
	}



	std::fstream in;
	in.open(wsfWavIn, std::ios_base::in | std::ios_base::binary);
	if (!in.is_open())
	{
		cout << "Невозможно открыть исходный файл.\n\"";
		getchar();
		return -1;
	}

	in.seekg(0, ios_base::end);
	size_t nSize = in.tellg();
	size_t nDatsize = nSize - WAV_HEADER_LENGTH;
	in.seekg(0, ios_base::beg);


	char * head = new char[WAV_HEADER_LENGTH];
	char * chWrk = new char[nSize - WAV_HEADER_LENGTH];
	in.read(head, WAV_HEADER_LENGTH);
	in.read(chWrk, nSize - WAV_HEADER_LENGTH);
	in.close();

	PWAVEHEADER wavFrm = (PWAVEHEADER)(head + 20);
	int bytSamp = wavFrm->wBitsPerSample/ 8;
	int botSamp = wavFrm->nBlockAlign;

	ofstream out;
	out.open(wsfWavOut, ios_base::out | ios_base::binary | ios_base::trunc);
	if (out)
	{
		out.write(head, WAV_HEADER_LENGTH);

		for (__int64 i = (__int64)(nDatsize / bytSamp) - 1; i >= 0 ; i--)
		{
			out.write(chWrk+ i * bytSamp, bytSamp);

		}
	}

	out.close();

	return 0;
}
Smogg вне форума Ответить с цитированием
Старый 23.07.2013, 14:45   #3
Flipsss
 
Регистрация: 20.07.2013
Сообщений: 4
По умолчанию

Расскажите поподробней про принцип работы, каким образом загнать в программу этот самый wav файл? И что делать дальше?
Flipsss вне форума Ответить с цитированием
Старый 23.07.2013, 15:07   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
каким образом загнать в программу этот самый wav файл? И что делать дальше?
программа требует два параметра (вы, надеюсь, знаете, что такое параметры программы!):
первый - имя исходного WAV файла
второй параметер - имя результирующего (сконвертированного) файла.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.07.2013, 15:19   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

работа через командную строку, где первым параметром - абсолютный путь до исходного вава, вторым - абсолютный путь до результирующего вава: "convertor.exe c:\wav\1.wav c:\wav\reversed.wav". Если второй аргумент не указан, то к имени добавляется "_reversed" и результат пишется в каталог с екзешником.

Что важно:
1) нету никаких проверок на корректность формата файла, что это wav, а не какой-нить mp3.
2) предполагается, что вавка имеет стандартный заголовок длиной в 44 байта и что не используется никакого сжатия, т.е. данные лежат в "сыром" виде, чистый PCM
(что редко бывает не так, но достаточно часто, чтобы иметь в виду).

Сначала читается заголовок исходника, и пишется в приемник.
Потом высчитывается, сколько байтов приходится на один семпл, т.е. минимальный кусочек данных, в котором надо сохранить исходный порядок.
Начинается чтение блока "data" исходника с конца и последовательное дописывание прочитанных кусочков в файл-приемник.
Выход без предупреждений.

зы: желательно заменить getchar() на getch()

Последний раз редактировалось Smogg; 23.07.2013 в 15:22.
Smogg вне форума Ответить с цитированием
Старый 23.07.2013, 15:30   #6
Flipsss
 
Регистрация: 20.07.2013
Сообщений: 4
По умолчанию

В командной строке пишу "convertor.exe c:\wav\prov.wav c:\wav\rev.wav" командная строка пропадает, конечного файла rev.wav не появляется, программа пишет

"ProgrZv.exe": Загружено: "C:\Users\Никита\Documents\Visu al Studio 2010\Projects\ProgrZv\Debug\ProgrZv .exe", Символы загружены.
"ProgrZv.exe": Загружено: "C:\Windows\SysWOW64\ntdll.dll" , Невозможно найти или открыть файл PDB
"ProgrZv.exe": Загружено: "C:\Windows\SysWOW64\kernel32.d ll", Невозможно найти или открыть файл PDB
"ProgrZv.exe": Загружено: "C:\Windows\SysWOW64\KernelBase.dll ", Невозможно найти или открыть файл PDB
"ProgrZv.exe": Загружено: "C:\Windows\SysWOW64\msvcp100d.dll" , Символы загружены.
"ProgrZv.exe": Загружено: "C:\Windows\SysWOW64\msvcr100d.dll" , Символы загружены.
Программа "[5592] ProgrZv.exe: Машинный код" завершилась с кодом 0 (0x0).
Flipsss вне форума Ответить с цитированием
Старый 23.07.2013, 15:38   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Попробуйте запустить его вне среды из папки debug. CTRL+R => cmd=> cd Путь\К\Папке\Debug\ => Enter => convertor.exe c:\wav\prov.wav c:\wav\rev.wav

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 23.07.2013, 15:44   #8
Flipsss
 
Регистрация: 20.07.2013
Сообщений: 4
По умолчанию

Огромное спасибо! Разобрался, всё работает.
Flipsss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со звуком Cepreu^ Мультимедиа в Delphi 7 01.06.2013 20:55
Работа со звуком. Mago Общие вопросы C/C++ 18 03.02.2013 01:46
Работа со звуком qwertyk C++ Builder 3 01.02.2013 15:36
Работа со звуком ддимочка C++ Builder 0 09.12.2011 21:31
Работа со звуком Drulya C# (си шарп) 4 12.09.2011 11:58