Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
GBIT
13 / 13 / 5
Регистрация: 05.10.2011
Сообщений: 219
#1

Шумящие биты в WAV - Visual C++

23.10.2011, 17:40. Просмотров 2833. Ответов 15
Метки нет (Все метки)

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

программа должна спрашивать сообщение
далее его записывать в фаил формата WAV (подсовываем программе трек с песенкой допустим)
программа считывает из WAV файла сообщение и выводит его на экран


как вообще такое реализовать?? о.О
пробовал такое сделать с картинкой BMP - получилось. там все проще. а тут не могу даже понять как идет формат WAV и где у него "шумящие биты"..
http://www.cyberforum.ru/visual-cpp/thread40806.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2011, 17:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шумящие биты в WAV (Visual C++):

Скрыть rar в wav
В общем надо програму которая может скрыть rar в wav а потом так же извлечь...

Работа с Wav файлом
Пишу курсовую. Надо получить спект Wav файла. Прочитал достаточно статей и...

Как воспроизвести .wav файл
Если пишу просто PlaySound("Sound.wav",NULL,SND_FILENAME | SND_ASYNC);...

Программа для работы с wav данными
Нужна помощь, необходима программа для извлечения из wav файлов семплов...

Воспроизведение wav-файла из папки на диске D
Пытаюсь воспроизвести с помощью PlaySound(L"D\\Nick\\musick\\mp1.wav", NULL,...

15
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
24.10.2011, 15:28 #2
Что значит "программа считывает из WAV файла сообщение и выводит его на экран"?

Добавлено через 1 минуту
Или ты имеешь в виду, что текстовое сообщение нужно "закодировать" в wav файл? Если использовать wav без сжатия, то всё очень просто.
0
Humanoid
Почетный модератор
9922 / 3825 / 341
Регистрация: 12.06.2008
Сообщений: 11,321
24.10.2011, 16:12 #3
WAV-файл - это просто набор значений. Например, посмотрим файл \WINDOWS\Media\chimes.wav из WinXP... вначале там идут заголовки RIFF и WAVEfmt ... а следующий 16-ый байт - 0x10. Это и есть количество бит, которым закодировано каждое значение. Это означает, что начиная с блока "data" мы можем брать данные по 16 бит (по 2 байта) и представлять их в виде signed short. И попробуй для каждого такого значения нарисовать точку - ты увидишь что-то вроде синусоиды. Т.е. для нашего файла (у него частота дискретезации 22050 герц) каждое 16-битное значение - это значение звука за текущие 45 микросекунд (1/22050).

В случае с 16-битным файлом всё просто... мы можем относительно безнаказанно менять значение младших байтов. При этом искажение будет не более 1/128. Т.е. теоретически можно записывать свои данные в младший байт каждого 16-битного значения и при этом качество звука не должно сильно пострадать пострадать.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
24.10.2011, 16:28 #4
Цитата Сообщение от Humanoid Посмотреть сообщение
WAV-файл - это просто набор значений.
Увы, но нет. wav подразумевает некоторые режимы компрессии, вплоть до MPEG. Так что только в несжатых форматах просто редактировать.

Добавлено через 38 секунд
Цитата Сообщение от Humanoid Посмотреть сообщение
При этом искажение будет не более 1/128
Это для 8 битного.

Добавлено через 31 секунду
Цитата Сообщение от Humanoid Посмотреть сообщение
свои данные в младший байт каждого 16-битного значения
бит, а не байт
0
Humanoid
Почетный модератор
9922 / 3825 / 341
Регистрация: 12.06.2008
Сообщений: 11,321
24.10.2011, 17:22 #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Увы, но нет. wav подразумевает некоторые режимы компрессии, вплоть до MPEG. Так что только в несжатых форматах просто редактировать.
Я и имел ввиду именно несжатый. В сжатом там такие мелочи потеряются... ведь, сжатие обычно идёт с потерями. И пример привёл именно несжатого файла.

Цитата Сообщение от Deviaphan Посмотреть сообщение
Это для 8 битного.
Это когда в 16 битном меняется (а по сути дела портится) один байт.

Цитата Сообщение от Deviaphan Посмотреть сообщение
бит, а не байт
Именно байт. Данные сгруппированы по два байта. И мы младший байт просто меняем на свой. В результате значение изменится не сильно, а мы целый байт там спрятали.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
24.10.2011, 17:25 #6
Цитата Сообщение от Humanoid Посмотреть сообщение
Именно байт
Если заменить байт, то будет заметно. В том числе и с точки зрения анализа файла. И появится треск.
0
GBIT
13 / 13 / 5
Регистрация: 05.10.2011
Сообщений: 219
25.10.2011, 16:03  [ТС] #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Что значит "программа считывает из WAV файла сообщение и выводит его на экран"?
я имею в виду, что нужно взять файл WAV и запихать в него мое сообщение...
// пока что речь о длине сообщения и подобных тонкостях не веду. это все после
... притом качество звука пострадать не должно. Ну или в крайнем случае лишь чуть - чуть. Слышны изменения не должны быть.


Цитата Сообщение от Deviaphan Посмотреть сообщение
Увы, но нет. wav подразумевает некоторые режимы компрессии, вплоть до MPEG. Так что только в несжатых форматах просто редактировать.
а WAV это сжатый формат? пардон) пошел гуглить и просвещаться.


но в целом. если честно у меня даже нет идеи как реализовать. подскажите пожалуйста
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
25.10.2011, 16:11 #8
Цитата Сообщение от GBIT Посмотреть сообщение
а WAV это сжатый формат?
Может быть не сжатый, может быть сжатый.
Compression Code Code Description
0 (0x0000) Unknown
1 (0x0001) PCM/uncompressed
2 (0x0002) Microsoft ADPCM
6 (0x0006) ITU G.711 a-law
7 (0x0007) ITU G.711 µ-law
17 (0x0011) IMA ADPCM
20 (0x0016) ITU G.723 ADPCM (Yamaha)
49 (0x0031) GSM 6.10
64 (0x0040) ITU G.721 ADPCM
80 (0x0050) MPEG
65,536 (0xFFFF) Experimental
Т.е. при использовании PCM/uncompressed реализация тривиальна. Прочие лучше не использовать, там и сложнее и к потере информации они приводят.

Добавлено через 3 минуты
Реализацию описал Humanoid.
А можно вообще добавить собственный блок и в любом виде в нём сообщение записать.) Тогда пусть хоть в каком формате аудио хранится.)
0
GBIT
13 / 13 / 5
Регистрация: 05.10.2011
Сообщений: 219
25.10.2011, 16:16  [ТС] #9
тривиальна? тут речь точно не про меня)))
Цитата Сообщение от Deviaphan Посмотреть сообщение
1 (0x0001) PCM/uncompressed
это я так понимаю метод при котором отсутствует сжатие. возникает вопрос: как отличить мои WAV файлы, кто по какому методу реализован?

и если честно я не понимаю в упор какие биты программа должна менять и вообще на что менять?
мне нужно будет мое сообщение переводить в 2ю систему и записывать бит за битом?
вообще в этом формате PCM/uncompressed данные хранятся в 2й системе или как?
вопросы возможно не корректны. но это все просто от незнания как располагаются данные в файле WAV.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
25.10.2011, 16:26 #10
Вот формат: http://www.sonicspot.com/guide/wavefiles.html
В блоке "fmt" тебя заинтересует поле "Significant bits per sample", оно указывает разрядность выборки (8,16,24,32 бита на отсчёт). Т.е. тебе нужно будет считывать каждый сэмпл и заменять младший бит на один бит из твоего сообщения. Т.е. на один символ необходимо 8 сэмплов. Таким образом, зная длину сообщения, ты можешь заранее вычислить минимальную длину аудиофайла. Рекомендую в самом начале кодировать длину сообщения, тогда длина аудио может превышать длину сообщения.
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 10:51 #11
Цитата Сообщение от GBIT Посмотреть сообщение
программа должна спрашивать сообщение
далее его записывать в фаил формата WAV (подсовываем программе трек с песенкой допустим)
-

GBIT, подобные задачи решаются двумя путями
1-й путь - запихиваем нужные нам wav-файлы в ресурсы проекта и когда проигрываем нужный файл, здесь приводил код как проигравать wav из ресурсов http://www.cyberforum.ru/visual-cpp/thread347843.html#post1960124

2-м путём является путь который как я понял вы сами выбрали - т.е директ проигрывание волны через DirectSoundBuffer. Что ж данный метод довольно интересен в плане возможностей, мы сами можем насыпать в буфер битов, и выбрать нужный нам формат и дискретность волны
Здесь wav-плеер реализующий именно полный разбор wav-файла на хедер, данные волны и установку буффера в нужный режим согласно хедера
http://www.cyberforum.ru/cpp-beginners/thread348516.html#post1963606

Не по теме:

Проект играет файлы без компрессии, до неё руки не дошли тогда, да и вобще проект писал пытаясь создать свой клавиатурный синтезатор, он кстати получился, но как оказалось потом моя музыка оказалось явно похуже чем у Тиесто или Армина, так что лучше пусть они на синтезаторах играют

1
GBIT
13 / 13 / 5
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 17:41  [ТС] #12
-=ЮрА=-, вообще основная идея была в том чтобы запихать свое текстовое сообщение в файл wav, притом чтобы у него размер не поменялся и при прослушивании файла не было никаких ощутимых изменений.

ты же, как я понял подсказываешь мне как сделать проект для воспроизведения wav.
это можно и на любом плеере сделать.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Здесь wav-плеер реализующий именно полный разбор wav-файла на хедер, данные волны и установку буффера в нужный режим согласно хедера
посмотрел плеер. Он конечно хорош, дело в том что я НЕ понимаю, пока что даже в теории, КУДА там записывать свое сообщение?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
разбор wav-файла на хедер
это вообще что такое?
0
Humanoid
Почетный модератор
9922 / 3825 / 341
Регистрация: 12.06.2008
Сообщений: 11,321
26.10.2011, 20:48 #13
Вот сейчас сварганил такой говнокод на скорую руку... просто что бы показать, в каком направлении можно копать. Допустим, вначале мы прочитали содержимое текстового файла в массив buf... в переменной len хранится общий размер файла. Будем считать, что файл 16-битный.
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
    int start; // сюда мы запишем позицию, где начинаются сами данные
    for(int i=4;i<len;i++) // ищем в файле первое упоминание "data"
    {
        if ((buf[i]=='d') && (buf[i+1]=='a') && (buf[i+2]=='t') && (buf[i+3]=='a'))
        {
            start = i+8; // т.к. после data ещё 4 символа являются длинной данных, то эти 4 байта тоже пропускаем
            break;
        }
    }
    short data = (short*)(&buf+start); // указатель на начало самих данных... сразу работаем с ними как с short (по 16 бит)
    int datalen = (len-start) / 2; // рассчитываем количество 16-битных записей, что бы не вылезти за их предел
// какой-то текст, который будем записывать
    const char *str = "This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! This is my text! ";
    unsigned short txtlen = strlen(str); // размер текста
// размер текста для простоты будем записывать только 2 байта (до 65535 байт самого текста)
    data[0] = (data[0] & 0xfff0) | ((txtlen >> 12) & 0x0f); // старшая тетрада старшего байта
    data[1] = (data[1] & 0xfff0) | ((txtlen >> 8) & 0x0f); // младшая тетрада старшего байта
    data[2] = (data[2] & 0xfff0) | ((txtlen >> 4) & 0x0f); // старшая тетрада младшего байта
    data[3] = (data[3] & 0xfff0) | (txtlen & 0x0f); // младшая тетрада младшего байта
    for(int i=0, j=4;i<txtlen,j<datalen;i++,j+=2) // записываем сам текст
    {
        data[j] =   (data[j]   & 0xfff0) | (str[i] & 0x0f); // младшая тетрада байта
        data[j+1] = (data[j+1] & 0xff0f) | ((str[i] >> 4) & 0x0f); // старшая тетрада байта
    }
Теперь массив buf просто записываем обратно в файл. Каждый байт текста разложился на две части и испортил значения wav-файла не более чем на 16 единиц (из 65536 возможных). К сообщению прикладываю два файла: orig.wav - это оригинальный файл из WinXP, а text.wav - файл с записанным текстом. Т.к. каждый байт разбит на две тетрады, то искажения звука не большие и текст незаметен даже при просмотре через текстовый редактор. На слух файл с текстом немного шипит. Но если текст записывать не по тетраде, а по одному биту, то искажения станут ещё меньше.
2
Вложения
Тип файла: rar wavs.rar (66.2 Кб, 52 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
27.10.2011, 16:21 #14
Humanoid, не в службу, можно попросить небольшой пример работы со сжатым wav - файлом или хотя бы ссылку как проводить пересемплирование lpWaveData для сжатых wav???
0
Humanoid
Почетный модератор
9922 / 3825 / 341
Регистрация: 12.06.2008
Сообщений: 11,321
27.10.2011, 16:33 #15
-=ЮрА=-, со сжатыми не умею работать. Надо либо с алгоритмами сжатия разбираться, либо как-то через кодеки раскодировать.
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.10.2011, 16:47 #16
Я сам в своё время рыл рыл и тоже остановился на uncompressed wav, ок если сам найду что то поцеплю сюда в топикПросто тема мне напомнила за времена паяния своего синтезатора и о не решённых тогда проблеммах...
0
27.10.2011, 16:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2011, 16:47
Привет! Вот еще темы с решениями:

Деление Wav-файла на два канала
Реализовать функцию разделяющую входной wav файл на каналы (на два выходных...

Наложение звукового эффекта на wav файл
Надо на звуковой файл в формате waw, наложить звуковой эффект, может кто...

MFC+Winapi: воспроизведение аудио (кроме wav)
А ещё что-то можно воспроизводить кроме wav? Тот же mp3, или виндовский wmf там?

Как написать простой конвертер из wav в mp3
Здравствуйте! Ребят, я в С++ прохо эрудирован, но мне нужено написать...


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

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

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