Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/26: Рейтинг темы: голосов - 26, средняя оценка - 4.58
 Аватар для GBIT
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223

Шумящие биты в WAV

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

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

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


как вообще такое реализовать?? о.О
пробовал такое сделать с картинкой BMP - получилось. там все проще. а тут не могу даже понять как идет формат WAV и где у него "шумящие биты"..
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2011, 17:40
Ответы с готовыми решениями:

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

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат.

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ...
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая получает 1)случайное целое типа int,...

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

Добавлено через 1 минуту
Или ты имеешь в виду, что текстовое сообщение нужно "закодировать" в wav файл? Если использовать wav без сжатия, то всё очень просто.
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
24.10.2011, 16:12
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
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
24.10.2011, 16:28
Цитата Сообщение от Humanoid Посмотреть сообщение
WAV-файл - это просто набор значений.
Увы, но нет. wav подразумевает некоторые режимы компрессии, вплоть до MPEG. Так что только в несжатых форматах просто редактировать.

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

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

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

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


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


но в целом. если честно у меня даже нет идеи как реализовать. подскажите пожалуйста
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
25.10.2011, 16:11
Цитата Сообщение от 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
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
25.10.2011, 16:16  [ТС]
тривиальна? тут речь точно не про меня)))
Цитата Сообщение от Deviaphan Посмотреть сообщение
1 (0x0001) PCM/uncompressed
это я так понимаю метод при котором отсутствует сжатие. возникает вопрос: как отличить мои WAV файлы, кто по какому методу реализован?

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

GBIT, подобные задачи решаются двумя путями
1-й путь - запихиваем нужные нам wav-файлы в ресурсы проекта и когда проигрываем нужный файл, здесь приводил код как проигравать wav из ресурсов Ошибка AfxGetResourceHandle

2-м путём является путь который как я понял вы сами выбрали - т.е директ проигрывание волны через DirectSoundBuffer. Что ж данный метод довольно интересен в плане возможностей, мы сами можем насыпать в буфер битов, и выбрать нужный нам формат и дискретность волны
Здесь wav-плеер реализующий именно полный разбор wav-файла на хедер, данные волны и установку буффера в нужный режим согласно хедера
txt to wav

Не по теме:

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

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

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

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
разбор wav-файла на хедер
это вообще что такое?
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
26.10.2011, 20:48
Вот сейчас сварганил такой говнокод на скорую руку... просто что бы показать, в каком направлении можно копать. Допустим, вначале мы прочитали содержимое текстового файла в массив 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 - файл с записанным текстом. Т.к. каждый байт разбит на две тетрады, то искажения звука не большие и текст незаметен даже при просмотре через текстовый редактор. На слух файл с текстом немного шипит. Но если текст записывать не по тетраде, а по одному биту, то искажения станут ещё меньше.
Вложения
Тип файла: rar wavs.rar (66.2 Кб, 56 просмотров)
2
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.10.2011, 16:21
Humanoid, не в службу, можно попросить небольшой пример работы со сжатым wav - файлом или хотя бы ссылку как проводить пересемплирование lpWaveData для сжатых wav???
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
27.10.2011, 16:33
-=ЮрА=-, со сжатыми не умею работать. Надо либо с алгоритмами сжатия разбираться, либо как-то через кодеки раскодировать.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.10.2011, 16:47
Я сам в своё время рыл рыл и тоже остановился на uncompressed wav, ок если сам найду что то поцеплю сюда в топикПросто тема мне напомнила за времена паяния своего синтезатора и о не решённых тогда проблеммах...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2011, 16:47
Помогаю со студенческими работами здесь

В каждом байте числа обнулить 0-ой и 7-ой биты и сделать единичными 3-ий и 4-ый биты
Надо: Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа обнулить нулевой и седьмой биты и сделать...

Написать программу, формирующую по исходному WAV файлу новый WAV файл
Написать программу, формирующую по исходному WAV файлу новый WAV файл, со сглаженным вершинами перегруженных (клипированных) фрагментов....

Преобразование числа в биты, а затем биты в числа (hex)
Преобразование числа в биты, а затем биты в числа (hex). Заранее спасибо!

Конвертация аудиофайлов WAV -> WAV
Здравствуйте! Подскажите, пожалуйста, библиотечку (утилитку коммандной строки, как вариант), для конвертации из &quot;тяжёлого&quot; wav в...

Поменять 1, 4 и 7 биты регистра DH на 5, 4 и 1 биты регистра CL соответственно
Ребята! Понимаю, что может быть пишу ерунду! Только вышла из декретного отпуска, и по правде говоря хреноватенько что-то помню! Нужно...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru