Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 14
1

Чтение и работа с данными из файла WAV

22.07.2017, 12:57. Показов 2325. Ответов 2
Метки нет (Все метки)

Передо мной стоит задача встроить скрытую информацию в WAV файл, с помощью определенных методов (НЗБ, фазовое кодирование, эхо-метод).
Я первый раз сталкиваюсь с данной темой и конечно же начала с самого элементарного - структура wav файла, в ней понятно все кроме того что из себя представляют данные которые хранятся в соответствующем чанке "data" и как с ними работать в программе, можете подсказать? И если возможно еще объяснить как к этим данным применять методы сокрытия информации упомянутые выше
Знаю, на форуме большое количество подобных тем и вопросов, но в них я так и на нашла подходящего мне ответа
Из кода в общем есть только чтение заголовка wav файла (код взят с сайта)


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
 #include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include<iostream>
 
using namespace std;
 
 
// Структура, описывающая заголовок WAV файла.
struct WAVHEADER
{
    // WAV-формат начинается с RIFF-заголовка:
 
    // Содержит символы "RIFF" в ASCII кодировке
    // (0x52494646 в big-endian представлении)
    char chunkId[4];
 
    // 36 + subchunk2Size, или более точно:
    // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
    // Это оставшийся размер цепочки, начиная с этой позиции.
    // Иначе говоря, это размер файла - 8, то есть,
    // исключены поля chunkId и chunkSize.
    unsigned long int chunkSize;
 
    // Содержит символы "WAVE"
    // (0x57415645 в big-endian представлении)
    char format[4];
 
    // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
    // Подцепочка "fmt " описывает формат звуковых данных:
 
    // Содержит символы "fmt "
    // (0x666d7420 в big-endian представлении)
    char subchunk1Id[4];
 
    // 16 для формата PCM.
    // Это оставшийся размер подцепочки, начиная с этой позиции.
    unsigned long subchunk1Size;
 
    // Аудио формат, полный список можно получить здесь [url]http://audiocoding.ru/wav_formats.txt[/url]
    // Для PCM = 1 (то есть, Линейное квантование).
    // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
    unsigned short audioFormat;
 
    // Количество каналов. Моно = 1, Стерео = 2 и т.д.
    unsigned short numChannels;
 
    // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
    unsigned long sampleRate;
 
    // sampleRate * numChannels * bitsPerSample/8
    unsigned long byteRate;
 
    // numChannels * bitsPerSample/8
    // Количество байт для одного сэмпла, включая все каналы.
    unsigned short blockAlign;
 
    // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
    unsigned short bitsPerSample;
 
    // Подцепочка "data" содержит аудио-данные и их размер.
 
    // Содержит символы "data"
    // (0x64617461 в big-endian представлении)
    char subchunk2Id[4];
 
    // numSamples * numChannels * bitsPerSample/8
    // Количество байт в области данных.
    unsigned long subchunk2Size;
 
    // Далее следуют непосредственно Wav данные.
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    FILE *file;
    errno_t err;
    err = fopen_s(&file, "Slipknot - Three Nil.wav", "rb");
    if (err)
    {
        printf_s("Failed open file, error %d", err);
        system("pause");
        return 0;
    }
 
    WAVHEADER header;
 
    fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);
    int sizerf = sizeof(WAVHEADER);
    cout << "sizeof(WAVHEADER)  " << sizerf << endl;
 
    // Выводим полученные данные
    printf_s("Sample rate: %d\n", header.sampleRate);
    printf_s("Channels: %d\n", header.numChannels);
    printf_s("Bits per sample: %d\n", header.bitsPerSample);
 
    // Посчитаем длительность воспроизведения в секундах
    float fDurationSeconds = 1.f * header.chunkSize / (header.bitsPerSample / 8) / header.numChannels / header.sampleRate;
    int iDurationMinutes = (int)floor(fDurationSeconds) / 60;
    fDurationSeconds = fDurationSeconds - (iDurationMinutes * 60);
    printf_s("Duration: %02d:%02.f\n", iDurationMinutes, fDurationSeconds);
 
    fclose(file);
 
    _getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2017, 12:57
Ответы с готовыми решениями:

Qt чтение Wav файла
Добрый вечер! :) Задача стоит так: считать область хедера и wav-данные (сэмплы) из существующего...

Чтение wav файла
Здравствуйте, задался я целью написания своей ритм игры. Ну и первым делом, решил написать алгоритм...

Чтение данных из файла Wav
Мне нужно прочитать значение данных в файле, который имеет один канал и 8 бит в сэмпле, данные...

Чтение заголовков wav файла
Внимание вопрос! Как прочитать заголовок вав файла и по этим данным построить спектр? Bass не...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
2
1457 / 1179 / 815
Регистрация: 29.02.2016
Сообщений: 3,577
22.07.2017, 16:32 2
https://stackoverflow.com/ques... a-wav-file
0
95 / 78 / 74
Регистрация: 11.05.2015
Сообщений: 189
22.07.2017, 17:18 3
Не очень хорошо знаком с представленными методами кодирования, но насколько я понял НЗБ заключается в замене последних бит в байтах данных wav файла на биты данных кодируемого текста.
Кликните здесь для просмотра всего текста

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
const unsigned int data_offset = 44;
 
void encode(unsigned char * wav, unsigned int wav_size, unsigned char * text, unsigned int text_size)
{
    unsigned char * wav_data = wav + data_offset;   // получаем указатель начала секции data
    for (unsigned i = 0; i < text_size && i * 8 + 8 + data_offset < wav_size; i++)
    {
        for (unsigned j = 0; j < 8; j++)
        {
            unsigned char c = text[i];
            c = (c >> j) & 0x1;         // определяем значение бита на j-ой позиции
            wav_data[i * 8 + j] |= c;       // заменяем младший бит в waw файле
        }
    }
}
 
void decode(unsigned char * wav, unsigned int wav_size, unsigned char * text, unsigned int text_size)
{
    unsigned char * wav_data = wav + 44;
    for (unsigned i = 0; i < text_size && i * 8 + 8 + data_offset < wav_size; i++)
    {
        unsigned char c = 0x0;
        for (unsigned j = 0; j < 8; j++)
        {
            c <<= 1;
            c |= (wav_data[i * 8 + (7 - j)] & 0x1);
        }
        text[i] = c;
    }
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2017, 17:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Чтение самплов из wav файла в массив
Всем привет!!! Ситуация такая: Заголовок успешно читаю. Хочу получить массив с самплами. ...

Открытие wav файла и чтение его заголовка
Надо открыть wav файл и прочитать заголовок его , компилиться но ничего не происходит #include...

Чтение звукового файла wav и построение графика сигнала
Чтение звукового файла формата .wav и построение графика сигнала

Работа с файлами(Запись,чтение,работа с данными)
Здравствуйте, никак не могу осилить файлы... Для начала вот само задание: В справочной автовокзала...


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

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

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