Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 7
1

Запись аудиофайла в формате wav

06.09.2016, 10:51. Показов 1555. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Написал в программе запись аудио по (Запись звука с микрофона и сохранение в wav) с NAudio. В принципе при поиске много на каких форумах находил схожий код. Вроде бы все работает, вот только неправильно записывает программа заголовок wav файла. Стал смотреть его как в (https://gist.github.com/alexey-detr/1664073) и тут же озадачился, что время указывается не то. Вроде бы и в свойствах файла все так. И запускается проигрывателем. А определяет длительность в сотнях секунд для записи в 3 секунды. Подскажите, кто знает, в чем может быть косяк?

Добавлено через 7 минут
Чтобы было чуть понятнее вставлю код, которым осуществлялась запись файла
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
using NAudio;
using NAudio.Wave;
 
WaveIn waveIn;
WaveFileWriter writer;
string outputFilename = "D:/demo.wav";
 
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
    writer.WriteData(e.Buffer, 0, e.BytesRecorded);
}
 
void waveIn_RecordingStopped(object sender, EventArgs e)
{
    waveIn.Dispose();
    waveIn = null;
    writer.Close();
    writer = null;
}
 
private void button1_Click(object sender, EventArgs e)
{
    waveIn = new WaveIn();
    waveIn.DeviceNumber = 0;
    waveIn.DataAvailable += waveIn_DataAvailable;
    waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);
    waveIn.WaveFormat = new WaveFormat(44100, 2);
    writer = new WaveFileWriter(outputFilename, waveIn.WaveFormat);
    waveIn.StartRecording();
}
 
private void button2_Click(object sender, EventArgs e)
{
    waveIn.StopRecording();
}
и которым получал значения заголовка 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
109
110
using System;
using System.IO;
using System.Runtime.InteropServices;
 
namespace WavFormatCSharp
{
    [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 данные.
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var header = new WavHeader();
            // Размер заголовка
            var headerSize = Marshal.SizeOf(header);
 
            var fileStream = new FileStream("Slipknot - Three Nil.wav", FileMode.Open, FileAccess.Read);
            var buffer = new byte[headerSize];
            fileStream.Read(buffer, 0, headerSize);
            
            // Чтобы не считывать каждое значение заголовка по отдельности,
            // воспользуемся выделением unmanaged блока памяти
            var headerPtr = Marshal.AllocHGlobal(headerSize);
            // Копируем считанные байты из файла в выделенный блок памяти
            Marshal.Copy(buffer, 0, headerPtr, headerSize);
            // Преобразовываем указатель на блок памяти к нашей структуре
            Marshal.PtrToStructure(headerPtr, header);
 
            // Выводим полученные данные
            Console.WriteLine("Sample rate: {0}", header.SampleRate);
            Console.WriteLine("Channels: {0}", header.NumChannels);
            Console.WriteLine("Bits per sample: {0}", header.BitsPerSample);
 
            // Посчитаем длительность воспроизведения в секундах
            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);
            Console.WriteLine("Duration: {0:00}:{1:00}", durationMinutes, durationSeconds);
 
            Console.ReadKey();
            
            // Освобождаем выделенный блок памяти
            Marshal.FreeHGlobal(headerPtr);
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2016, 10:51
Ответы с готовыми решениями:

Считывание и запись Wav
Здравствуйте, подскажите, почему с таким кодом файл не остается таким же, а уменьшается размером и...

Bass.net.dll Запись в wav
Привет еще раз) создаю уже вторую тему по поводу этой библиотеки (мучаюсь уже второй день). В...

Запись звука с микрофона и сохранение в wav
Добрый день, как записать wav файл с микрофона? Частота дискретизации = 122кб/с моно. Спасибо.

Как средствами C++ склеить 2 аудиофайла и более, например wav?
Здравствуйте, не могли бы вы подсказать, как средствами C++, склеить 2 аудиофайла и более, например...

0
06.09.2016, 10:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2016, 10:51
Помогаю со студенческими работами здесь

Запись аудиофайла в массив байтов
привет!) подскажите пожалуйста, как записать аудио файл в массив байтов??? заранее спасибо

Почему треки на SoundClouds в формате wav?
Почему не mp3?

Как создать звук в формате WAV (RIFF)?
Здравствуйте, уважаемые форумчане! Очень необходимо создать системный звук в формате WAV (RIFF), но...

Распознавание речи, записанной на диктофон в формате wav
Мне необходимо перевести в текстовый формат аудиозапись разговора, записанного на диктофон в...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru