Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121

Открыть и прочитать данные wave файла

21.02.2014, 11:47. Показов 4075. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть wave файл. Надо его открыть и или в текстовом формате, или в массиве получить последовательность амплитуд.

Исходя из большинства тем получается, что последовательность действий
1. надо сперва считать файл в бинарном виде
2. отделить заголовок
3. разбить данные по семплам в зависимости от разрядности

этап 1
если для чтения текстового файла работает такая связка
C#
1
2
string data_import = "";
StreamReader sr = new StreamReader(openFileDialog_wave.FileName, Encoding.Default); data_import = sr.ReadToEnd(); sr.Close();
то для бинарного как?
C#
1
BinaryReader br = new BinaryReader(new FileStream(openFileDialog_wave.FileName, FileMode.Open)); data_import = ?  // запонение данными текстбокс из файла

этап 2
Есть ли универсальная функция для отдления заголовка и вытаскивая основных параметро?

этап 3
Все делать вручную? или есть стандартная функция?

Тут приведен пример с потоковой обработкой (с которой не работал)
http://stackoverflow.com/quest... -wave-form
C#
1
2
3
4
5
6
7
8
9
10
11
public float[] FloatArrayFromStream(System.IO.MemoryStream stream)
        {
            return FloatArrayFromByteArray(stream.GetBuffer());
        }
 
        public float[] FloatArrayFromByteArray(byte[] input)
        {
            float[] output = new float[input.Length / 4];
            Buffer.BlockCopy(input, 0, output, 0, input.Length);
            return output;
        }
Можно ли это переделать под полный массив или переменную данных (например string)?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.02.2014, 11:47
Ответы с готовыми решениями:

Прочитать данные из файла
Есть файл, созданный в программе PRO100. в котором хранится описание 3D модели мебельного изделия (корпусная мебель). Подскажите как мне...

Прочитать данные из xml файла
Дано: xml документ такого содержания: <?xml version="1.0" encoding="utf-8"?> <ServerList> <Server> ...

Прочитать float данные из файла
Учу System.IO! Есть файл в который я с помощью C# записал float данные и разделил их | вот таким знаком. В файле 25000 float данных без |...

2
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
21.02.2014, 13:40
Цитата Сообщение от romanrex Посмотреть сообщение
Есть ли универсальная функция для отдления заголовка и вытаскивая основных параметро?
Есть freeware library Naudio.dll, там есть класс WaveFileReader, и еще куча всяких плюшек.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121
06.03.2014, 22:53  [ТС]
Задачу почти удалось решить, но осталась проблема с открытием 24-битного файла и подмножеством 32-х битных.

Добавлена структура файла
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
 
 
[StructLayout(LayoutKind.Sequential)]
    // Структура, описывающая заголовок WAV файла.
    internal class WavHeader
    {
        // WAV-формат начинается с RIFF-заголовка:
 
        // Содержит символы "RIFF" в ASCII кодировке
        // (0x52494646 в big-endian представлении)
        public UInt32 ChunkId;
 
        // 36 + subchunk2Size, или более точно:
        // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
        // Это оставшийся размер цепочки, начиная с этой позиции.
        // Иначе говоря, это размер файла - 8, то есть,
        // исключены поля chunkId и chunkSize.
        public UInt32 ChunkSize;
 
        // Содержит символы "WAVE"
        // (0x57415645 в big-endian представлении)
        public UInt32 Format;
 
        // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
        // Подцепочка "fmt " описывает формат звуковых данных:
 
        // Содержит символы "fmt "
        // (0x666d7420 в big-endian представлении)
        public UInt32 Subchunk1Id;
 
        // 16 для формата PCM.
        // Это оставшийся размер подцепочки, начиная с этой позиции.
        public UInt32 Subchunk1Size;
 
        // Аудио формат, полный список можно получить здесь [url]http://audiocoding.ru/wav_formats.txt[/url]
        // Для PCM = 1 (то есть, Линейное квантование).
        // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
        public UInt16 AudioFormat;
 
        // Количество каналов. Моно = 1, Стерео = 2 и т.д.
        public UInt16 NumChannels;
 
        // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
        public UInt32 SampleRate;
 
        // sampleRate * numChannels * bitsPerSample/8
        public UInt32 ByteRate;
 
        // numChannels * bitsPerSample/8
        // Количество байт для одного сэмпла, включая все каналы.
        public UInt16 BlockAlign;
 
        // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
        public UInt16 BitsPerSample;
 
        // Подцепочка "data" содержит аудио-данные и их размер.
 
        // Содержит символы "data"
        // (0x64617461 в big-endian представлении)
        public UInt32 Subchunk2Id;
 
        // numSamples * numChannels * bitsPerSample/8
        // Количество байт в области данных.
        public UInt32 Subchunk2Size;
 
        // Далее следуют непосредственно Wav данные.
 
    }
Сама функция открытия в виде реакции на кнопку и вывода значений в textbox

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
    private void button197_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
 
 
            openFileDialog_wave.FileName = path_otladka(textBox55.Text, comboBox25.Text);//формирование пути к файлу                    
           
            var header = new WavHeader();
            // Размер заголовка
            var headerSize = Marshal.SizeOf(header);
            var fileStream = new FileStream(openFileDialog_wave.FileName, FileMode.Open, FileAccess.Read);
            var buffer = new byte[headerSize];
 
            fileStream.Read(buffer, 0, headerSize);
            var headerPtr = Marshal.AllocHGlobal(headerSize);// Чтобы не считывать каждое значение заголовка по отдельности, воспользуемся выделением unmanaged блока памяти
            Marshal.Copy(buffer, 0, headerPtr, headerSize); // Копируем считанные байты из файла в выделенный блок памяти
            Marshal.PtrToStructure(headerPtr, header);  // Преобразовываем указатель на блок памяти к нашей структуре
 
            // Посчитаем длительность воспроизведения в секундах
            var durationSeconds = 1.0 * header.Subchunk2Size / (header.BitsPerSample / 8.0) / header.NumChannels / header.SampleRate;
            var durationMinutes = (int)Math.Floor(durationSeconds / 60);
            durationSeconds = durationSeconds - (durationMinutes * 60);
 
            // Выводим полученные данные            
            if (comboBox27.SelectedIndex == 0)
            {
                textBox_info_main.Text += Environment.NewLine;
                textBox_info_main.Text += "Sample rate:" + header.SampleRate + Environment.NewLine;//     Console.WriteLine("Sample rate: {0}", header.SampleRate);
                textBox_info_main.Text += "Channels:" + header.NumChannels + Environment.NewLine;//     Console.WriteLine("Channels: {0}", header.NumChannels);
                textBox_info_main.Text += "Bits per sample:" + header.BitsPerSample + Environment.NewLine;//     Console.WriteLine("Bits per sample: {0}", header.BitsPerSample);                
                textBox_info_main.Text += "Duration: " + durationMinutes + ":" + durationSeconds + Environment.NewLine;     // Console.WriteLine("Duration: {0:0000}:{1:0000}", durationMinutes, durationSeconds);  
            }
            // вытаскиваем данные wave
            // Чтение данных
            // Звуковая волна WAVE файла
            int[,] data; // данные файла [номер канала, значение]
 
            data = new int[header.NumChannels, header.Subchunk2Size / header.BlockAlign];
            buffer = new byte[header.Subchunk2Size];
            fileStream.Read(buffer, 0, (int)header.Subchunk2Size);
    
            for (int i = 0; i < header.Subchunk2Size / header.BlockAlign; i++) // по количеству блоков - должно быть по семплам
            {
                switch (header.BlockAlign / header.NumChannels) // определяем битность - длина блока на количество каналов
                {
                    case 1: // 8 бит
                        for (int y = 0; y < header.NumChannels; y++)
                        {
                            data[y, i] = buffer[i];                         
                        }
                        break;
                    case 2: // 16 бит
                        for (int y = 0; y < header.NumChannels; y++)
                        {
                            data[y, i] = BitConverter.ToInt16(buffer, header.BlockAlign  * i);                        
                        }
                        break;
                    case 3: // 24 бит
                        for (int y = 0; y < header.NumChannels; y++)
                        {
                            data[y, i] = BitConverter.ToInt32(buffer, header.BlockAlign  *i);                         
                        }
                        break;
                    case 4: // 32 бит
                        for (int y = 0; y < header.NumChannels; y++)
                        {
                            data[y, i] = BitConverter.ToInt32(buffer, header.BlockAlign * i);                                           
                        }
                        break;
                }           
            }
            fileStream.Close();
 
 
                textBox_info_main.Text += Environment.NewLine;
          
 
                for (int y = 0; y < header.NumChannels; y++)
                {
 
                    for (int i = 0; i < header.Subchunk2Size / header.BlockAlign; i++) // по количеству блоков - должно быть по семплам
                    {                 
                        sb.Append("Данные из файла (канал, значение): \t" + y + "\t" + i + "\t" + data[y, i] + Environment.NewLine);
                    }            
            
                textBox_info_main.Text += sb.ToString() +Environment.NewLine;
            }
Вопрос, как правильно реализовать этот момент,т.к. в текущем виде данные совершенно некорректные, а BitConverter.ToInt24 не существует.

C#
1
2
3
4
5
6
 case 3: // 24 бит
                        for (int y = 0; y < header.NumChannels; y++)
                        {
                            data[y, i] = BitConverter.ToInt32(buffer, header.BlockAlign  *i);                         
                        }
                        break;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2014, 22:53
Помогаю со студенческими работами здесь

Как прочитать из файла данные в List<double>
Как прочитать из файла данные в List&lt;double&gt;, чтобы это список был доступен в другом классе?

Прочитать входные данные из одного файла, а результат решения вывести в другой
переделать программу таким образом, чтобы входные данные считывались из одного файла, а результат решения выводился в другой. using...

Воспроизведение Wave файла с помощью NAudio
Доброго время суток. Помогите пожалуйста. Файл прикреплён. Не могу понять как исправить данную ошибку. в строке ...

Представить сигнал из Wave-файла в виде осциллограммы
Представить сигнал записан в wav файле без использования звукового редактора в виде осциллограммы (зависимость амплитуды отсчетов от...

Как прочитать многострочные данные из файла с указанного фрагмента до указанного фрагмента?
Всех с наступающим! Есть файл с содержанием: Database: vip_stroitel Table: material +-----------+-------------+ | Column ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru