Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15

Перезапись из одного wav файла в другой

21.04.2019, 03:19. Показов 1778. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется такой код:
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#include <tchar.h>
#include "wave.h"
#include <windows.h>
#define N 2048
 
struct WAVEHEADER {
    char chunkId[4];//символы RIFF
    unsigned long chunkSize;//оставшийся размер цепочки
    char format[4];//символы WAVE
    char subchunk1Id[4];//символы fmt
    unsigned long subchunk1Size;//оставшийся размер подцепочки
    unsigned short audioFormat;//аудио-формат
    unsigned short numChannels;//количество каналов
    unsigned long sampleRate;//частота дискретизации
    unsigned long byteRate;//sampleRate * numChannels * bitsPerSample/8
    unsigned short blockAlign;//количество байт для одного сэмпла (numChannels * bitsPerSample/8)
    unsigned short bitsPerSample;//точность звучания
 
    //data
    char subchunk2Id[4];//содержит символы data
    unsigned long subchunk2Size;//количество байт в области данных (numSamples * numChannels * bitsPerSample/8)
 
    //далее следуют непосредственно wav данные
};
 
int main() {
    setlocale(LC_ALL, "Russian");
 
    FILE *file = fopen("Slipknot_1.wav", "rb");
    FILE *txt = fopen("txt.txt", "w");
    WAVEHEADER head;
    short *data;
    short buf[N];
    data = (short *)malloc(N * sizeof(short));
    
    fread_s(&head, sizeof(WAVEHEADER), sizeof(WAVEHEADER), 1, file);
 
    fprintf(txt, "---Считывание заголовка wav файла---\n\n");
    fprintf(txt, "Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    fprintf(txt, "Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    fprintf(txt, "Информация о сжатии: %ld\n", head.audioFormat);
    fprintf(txt, "Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    fprintf(txt, "Размер: %ld байт\n", head.chunkSize);
    fprintf(txt, "Частота: %d\n", head.sampleRate);
    fprintf(txt, "Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        fprintf(txt, " (Стерео)\n");
    else
        fprintf(txt, " (Моно)\n");
    fprintf(txt, "Байт в секунду: %ld\n", head.byteRate);
    fprintf(txt, "Размер сэмпла: %d бит\n", head.bitsPerSample);
    fprintf(txt, "Размер области данных: %ld байт\n", head.subchunk2Size);
    fprintf(txt, "\n\n\n");
    
    
    for (int i = 0; i < N; i++) {
        fread(&buf, sizeof(short), i+1, file);
        fprintf(txt, "%i\n", buf[i]);
    }
    
 
    printf("---Считывание заголовка wav файла---\n\n");
    printf("Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    printf("Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    printf("Информация о сжатии: %ld\n", head.audioFormat);
    printf("Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    printf("Размер: %ld байт\n", head.chunkSize);
    printf("Частота: %d\n", head.sampleRate);
    printf("Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        printf(" (Стерео)\n");
    else
        printf(" (Моно)\n");
    printf("Байт в секунду: %ld\n", head.byteRate);
    printf("Размер сэмпла: %d бит\n", head.bitsPerSample);
    printf("Размер области данных: %ld байт\n", head.subchunk2Size);
 
    FILE *wave = fopen("new.wav", "wb");
    fwrite(&head, sizeof(WAVEHEADER), 1, wave);
    for(int i = 0; i < N; i++)
        fwrite(buf, sizeof(short), sizeof(buf), wave);
 
    
    fclose(file);
    fclose(txt);
    fclose(wave);
 
    _getch();
    return 0;
}
Нужно взять заголовок и данные из одного файла и записать их в новый файл, созданный так же в коде (new.wav). Это не конечная цель, но мне важно понять как правильно записать файл. Я хотела перезаписать первые 4 Кб, но проигрыватель отказывается воспроизводить файл. Пишет, что «decoder was not found for this format» (Декодер не найден для этого формата). В чём моя ошибка? С функцией fwrite работаю впервые и я мог в ней напортачить...

В txt я просто записываю данные о файле (Заголовок и данные).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2019, 03:19
Ответы с готовыми решениями:

Создание файла. Перезапись информации с одного файла в другой. Ошибки
Здравствуйте! Помогите пожалуйста. Поставлена задача: создать файл из 55 целых чисел, используя генератор рандомных чисел. Переписать все...

перезапись из файла в другой
Здравствуйте, вопрос такой: есть txt файл в котором находятся данные, нужно все строки из файла вывести на страницу сайта и после каждой...

Из одного файла переместить текст в другой файл с заменой текста на другой
Помогите нужно сделать вот такую вещь заготовка есть но не могу осмыслит как сделать вот это: Надо из одного файла переместить текст в...

22
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.04.2019, 14:57
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
define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#include <tchar.h>
#include "wave.h"
#include <windows.h>
#define N 2048
 
#pragma pack(push,1)
struct WAVEHEADER 
{
    char chunkId[4];//символы RIFF
    unsigned long chunkSize;//оставшийся размер цепочки
    char format[4];//символы WAVE
    char subchunk1Id[4];//символы fmt
    unsigned long subchunk1Size;//оставшийся размер подцепочки
    unsigned short audioFormat;//аудио-формат
    unsigned short numChannels;//количество каналов
    unsigned long sampleRate;//частота дискретизации
    unsigned long byteRate;//sampleRate * numChannels * bitsPerSample/8
    unsigned short blockAlign;//количество байт для одного сэмпла (numChannels * bitsPerSample/8)
    unsigned short bitsPerSample;//точность звучания
 
    //data
    char subchunk2Id[4];//содержит символы data
    unsigned long subchunk2Size;//количество байт в области данных (numSamples * numChannels * bitsPerSample/8)
 
    //далее следуют непосредственно wav данные
};
#pragma pack(pop)
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    FILE *file = fopen("Slipknot_1.wav", "rb");
    FILE *txt = fopen("txt.txt", "w");
    WAVEHEADER head;
    short *data;
    short buf[N];
    data = (short *)malloc(N * sizeof(short));
    
    fread_s(&head, sizeof(WAVEHEADER), sizeof(WAVEHEADER), 1, file);
 
    fprintf(txt, "---Считывание заголовка wav файла---\n\n");
    fprintf(txt, "Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    fprintf(txt, "Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    fprintf(txt, "Информация о сжатии: %ld\n", head.audioFormat);
    fprintf(txt, "Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    fprintf(txt, "Размер: %ld байт\n", head.chunkSize);
    fprintf(txt, "Частота: %d\n", head.sampleRate);
    fprintf(txt, "Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        fprintf(txt, " (Стерео)\n");
    else
        fprintf(txt, " (Моно)\n");
    fprintf(txt, "Байт в секунду: %ld\n", head.byteRate);
    fprintf(txt, "Размер сэмпла: %d бит\n", head.bitsPerSample);
    fprintf(txt, "Размер области данных: %ld байт\n", head.subchunk2Size);
    fprintf(txt, "\n\n\n");
    
    
    /*for (int i = 0; i < N; i++) {
        fread(&buf, sizeof(short), i+1, file);
        fprintf(txt, "%i\n", buf[i]);
    }*/
    
 
    printf("---Считывание заголовка wav файла---\n\n");
    printf("Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    printf("Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    printf("Информация о сжатии: %ld\n", head.audioFormat);
    printf("Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    printf("Размер: %ld байт\n", head.chunkSize);
    printf("Частота: %d\n", head.sampleRate);
    printf("Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        printf(" (Стерео)\n");
    else
        printf(" (Моно)\n");
    printf("Байт в секунду: %ld\n", head.byteRate);
    printf("Размер сэмпла: %d бит\n", head.bitsPerSample);
    printf("Размер области данных: %ld байт\n", head.subchunk2Size);
 
    FILE *wave = fopen("new.wav", "wb");
    fwrite(&head, sizeof(WAVEHEADER), 1, wave);
 
    char* p = (char *)malloc(head.subchunk2Size * sizeof(char));
    
    fread(p, sizeof(char), head.subchunk2Size, file);
    fwrite(p, sizeof(char), head.subchunk2Size, wave);
    
    fclose(file);
    fclose(txt);
    fclose(wave);
 
   _getch();
    return 0;
}
0
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15
22.04.2019, 08:49  [ТС]
Та же проблема. Ничего не изменилось. Только размер файла стал равен 1 Кб
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.04.2019, 14:39
Цитата Сообщение от Konor Argent Посмотреть сообщение
Та же проблема. Ничего не изменилось. Только размер файла стал равен 1 Кб
Как так, если у меня всё работает? И код показывай, который пробуешь.
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
22.04.2019, 17:03
Структура WAV-файла, на самом деле, несколько сложней. Ваш заголовок может быть использован для записи. Но для чтения, в общем случае, нужно парсить все чанки до нахождения 'data', так как разные программы при создании WAV-файла могут помещать в него дополнительные информационные блоки. При наличии дополнительных информационных блоков ubchunk2Id[4] будет содержать символы отличные от 'data', а subchunk2Size - размер дополнительного блока, а не размер данных. Можно посмотреть повнимательнее общее устройство структуры RIFF-файлов.
1
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15
22.04.2019, 22:06  [ТС]
Вот код:
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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#include <tchar.h>
//#include "wave.h"
#include <windows.h>
#define N 2048
 
#pragma pack(push,1)
struct WAVEHEADER
{
    char chunkId[4];//символы RIFF
    unsigned long chunkSize;//оставшийся размер цепочки
    char format[4];//символы WAVE
    char subchunk1Id[4];//символы fmt
    unsigned long subchunk1Size;//оставшийся размер подцепочки
    unsigned short audioFormat;//аудио-формат
    unsigned short numChannels;//количество каналов
    unsigned long sampleRate;//частота дискретизации
    unsigned long byteRate;//sampleRate * numChannels * bitsPerSample/8
    unsigned short blockAlign;//количество байт для одного сэмпла (numChannels * bitsPerSample/8)
    unsigned short bitsPerSample;//точность звучания
 
    //data
    char subchunk2Id[4];//содержит символы data
    unsigned long subchunk2Size;//количество байт в области данных (numSamples * numChannels * bitsPerSample/8)
 
    //далее следуют непосредственно wav данные
};
#pragma pack(pop)
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    FILE *file = fopen("Slipknot_1.wav", "rb");
    FILE *txt = fopen("txt.txt", "w");
    WAVEHEADER head;
    short *data;
    short buf[N];
    data = (short *)malloc(N * sizeof(short));
 
    fread_s(&head, sizeof(WAVEHEADER), sizeof(WAVEHEADER), 1, file);
 
    fprintf(txt, "---Считывание заголовка wav файла---\n\n");
    fprintf(txt, "Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    fprintf(txt, "Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    fprintf(txt, "Информация о сжатии: %ld\n", head.audioFormat);
    fprintf(txt, "Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    fprintf(txt, "Размер: %ld байт\n", head.chunkSize);
    fprintf(txt, "Частота: %d\n", head.sampleRate);
    fprintf(txt, "Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        fprintf(txt, " (Стерео)\n");
    else
        fprintf(txt, " (Моно)\n");
    fprintf(txt, "Байт в секунду: %ld\n", head.byteRate);
    fprintf(txt, "Размер сэмпла: %d бит\n", head.bitsPerSample);
    fprintf(txt, "Размер области данных: %ld байт\n", head.subchunk2Size);
    fprintf(txt, "\n\n\n");
 
 
    /*for (int i = 0; i < N; i++) {
        fread(&buf, sizeof(short), i+1, file);
        fprintf(txt, "%i\n", buf[i]);
    }*/
 
 
    printf("---Считывание заголовка wav файла---\n\n");
    printf("Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    printf("Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    printf("Информация о сжатии: %ld\n", head.audioFormat);
    printf("Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    printf("Размер: %ld байт\n", head.chunkSize);
    printf("Частота: %d\n", head.sampleRate);
    printf("Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        printf(" (Стерео)\n");
    else
        printf(" (Моно)\n");
    printf("Байт в секунду: %ld\n", head.byteRate);
    printf("Размер сэмпла: %d бит\n", head.bitsPerSample);
    printf("Размер области данных: %ld байт\n", head.subchunk2Size);
 
    FILE *wave = fopen("new.wav", "wb");
    fwrite(&head, sizeof(WAVEHEADER), 1, wave);
 
    char* p = (char *)malloc(head.subchunk2Size * sizeof(char));
 
    fread(p, sizeof(char), head.subchunk2Size, file);
    fwrite(p, sizeof(char), head.subchunk2Size, wave);
 
    fclose(file);
    fclose(txt);
    fclose(wave);
 
    _getch();
    return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от Ygg Посмотреть сообщение
нужно парсить все чанки
А как это на практике реализовать?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
22.04.2019, 22:30
Исходный .wav, в архиве, выложи.
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
23.04.2019, 00:05
Цитата Сообщение от Konor Argent Посмотреть сообщение
А как это на практике реализовать?
Всё просто в теории. RIFF-файлы имеют древовидную структуру. Читаете FCC чанка и его размер. Смотрите FCC, если он вам не нужен, то пропускаете тело чанка в соответствии с размером и читаете следующий. Если FCC равен 'fmt', то это чанк формата. Если FCC равен 'data', то это чанк данных.
Миниатюры
Перезапись из одного wav файла в другой  
0
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15
23.04.2019, 12:36  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Исходный .wav, в архиве, выложи.
Не отправляется, хотя zip архив занимает 23,8 Мб...

Добавлено через 24 минуты
Цитата Сообщение от Ygg Посмотреть сообщение
Читаете FCC
Наверное, тупой вопрос, но что такое FCC? Google выдаёт федеральную комиссию по связи

Добавлено через 1 минуту
Ygg, через 25 % сбрасывает соединение
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
23.04.2019, 13:21
Цитата Сообщение от Konor Argent Посмотреть сообщение
что такое FCC?
FourCC - идентификатор чанка.

Resource Interchange File Format Services
RIFF-файл состоит из блоков, которые называются чанками.
Каждый блок состоит из трёх частей: идентификатор, размер данных и данные.
Назначение и структура данных каждого блока определяется его идентификатором и местом расположения.
Так для WAV-файлов блок с идентификатором 'fmt' содержит описание формата звука, а блок с идентификатором 'data' содержит звуковые семплы.
Самый первый блок файла должен иметь идентификатор 'RIFF'. Назначение и формат данных этого блока и блока 'LIST' аналогичны, это контейнеры для хранения внутри себя списка дополнительных чанков. Первые четыре байта данных определяют дополнительный идентификатор. В остальных байтах последовательно размещаются чанки. Читаем идентификатор и размер первого вложенного чанка, смотрим идентификатор, если он нам не интересен, то пропускаем блок. Если размер данных контейнера (RIFF или LIST) больше первого вложенного чанка, то значит там лежит ещё один чанк. Читаем следующий чанк. И так далее. Глобально, весь файл так же является списком чанков и после RIFF могут ещё лежать чанки.
Во вложении ещё несколько реальных примеров структуры WAV-файлов.
Миниатюры
Перезапись из одного wav файла в другой  
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.04.2019, 13:28
Цитата Сообщение от Konor Argent Посмотреть сообщение
Не отправляется, хотя zip архив занимает 23,8 Мб...
Выложи где-нибудь, тут - ссылку.
0
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15
23.04.2019, 22:14  [ТС]
nd2, https://yadi.sk/d/vyB57ynODBHmnQ

Добавлено через 37 секунд
Ygg, спасибо
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
23.04.2019, 23:01
Если только для того, чтобы правильно скопировать:
Кликните здесь для просмотра всего текста
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
    FILE *file = fopen("Slipknot_1.wav", "rb");
    FILE *txt = fopen("txt.txt", "w");
    WAVEHEADER head;
    short *data;
    short buf[N];
    data = (short *)malloc(N * sizeof(short));
 
    fread_s(&head, sizeof(WAVEHEADER), sizeof(WAVEHEADER), 1, file);
 
    fprintf(txt, "---Считывание заголовка wav файла---\n\n");
    fprintf(txt, "Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    fprintf(txt, "Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    fprintf(txt, "Информация о сжатии: %ld\n", head.audioFormat);
    fprintf(txt, "Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    fprintf(txt, "Размер: %ld байт\n", head.chunkSize);
    fprintf(txt, "Частота: %d\n", head.sampleRate);
    fprintf(txt, "Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        fprintf(txt, " (Стерео)\n");
    else
        fprintf(txt, " (Моно)\n");
    fprintf(txt, "Байт в секунду: %ld\n", head.byteRate);
    fprintf(txt, "Размер сэмпла: %d бит\n", head.bitsPerSample);
    fprintf(txt, "Размер области данных: %ld байт\n", head.subchunk2Size);
    fprintf(txt, "\n\n\n");
 
    printf("---Считывание заголовка wav файла---\n\n");
    printf("Информация о формате: %c%c%c%c\n", head.chunkId[0], head.chunkId[1], head.chunkId[2], head.chunkId[3]);
    printf("Формат данных: %c%c%c%c\n", head.format[0], head.format[1], head.format[2], head.format[3]);
    printf("Информация о сжатии: %ld\n", head.audioFormat);
    printf("Параметры wav-файла: %c%c%c%c\n", head.subchunk1Id[0], head.subchunk1Id[1], head.subchunk1Id[2], head.subchunk1Id[3]);
    printf("Размер: %ld байт\n", head.chunkSize);
    printf("Частота: %d\n", head.sampleRate);
    printf("Количество каналов: %d", head.numChannels);
    if (head.numChannels == 2)
        printf(" (Стерео)\n");
    else
        printf(" (Моно)\n");
    printf("Байт в секунду: %ld\n", head.byteRate);
    printf("Размер сэмпла: %d бит\n", head.bitsPerSample);
    printf("Размер области данных: %ld байт\n", head.subchunk2Size);
 
    FILE *wave = fopen("new.wav", "wb");
    fwrite(&head, sizeof(WAVEHEADER), 1, wave);
    
    size_t n = head.chunkSize + 8 - 44; 
    char* p = (char *)malloc(n * sizeof(char));
    
    fread(p, sizeof(char), n, file);
    fwrite(p, sizeof(char), n, wave);
 
    fclose(file);
    fclose(txt);
    fclose(wave);


Добавлено через 12 минут
Если просто скопировать (без извлечения информации), то это проще делается:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    FILE *file = fopen("Slipknot_1.wav", "rb");
    fseek(file, 0, SEEK_END);
    long n = ftell(file);
    fseek(file, 0, SEEK_SET);
 
    FILE *wave = fopen("new.wav", "wb");
   
    char* p = (char *)malloc(n * sizeof(char));
    
    fread(p, sizeof(char), n, file);
    fwrite(p, sizeof(char), n, wave);
 
    free(p);
 
    fclose(file);
    fclose(wave);
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
23.04.2019, 23:12
Структура вашего файла.
Миниатюры
Перезапись из одного wav файла в другой  
0
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15
24.04.2019, 11:48  [ТС]
nd2, спасибо. Вообще это нужно для цифрового фильтра. Какие-то преобразования провести, но и это не конечная цель. Нужно вытащить данные, что-то с ними сделать, а потом новые данные записать в новый файл. Ещё раз спасибо

Добавлено через 42 секунды
Ygg, спасибо. А что за программа?

Добавлено через 55 минут
Цитата Сообщение от nd2 Посмотреть сообщение
Если только для того, чтобы правильно скопировать
nd2, Я хочу от тебя детей. Работает!!! А в чём была моя ошибка?
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
24.04.2019, 12:03
Цитата Сообщение от Konor Argent Посмотреть сообщение
А что за программа?
Это закрытый софт. С его помощью нельзя читать данные, он больше нужен для понимания внутреннего устройства файлов. Из открытого софта есть аналоги, например, RiffPad.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.04.2019, 16:02
Цитата Сообщение от Konor Argent Посмотреть сообщение
Работает!!!
Но только не для этого:
Цитата Сообщение от Konor Argent Посмотреть сообщение
Нужно вытащить данные, что-то с ними сделать, а потом новые данные записать в новый файл.
Мой код данные не вытаскивает, а просто тупо копирует файл.
0
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15
24.04.2019, 23:25  [ТС]
nd2, А как тогда данные вытащить? И потом записать их в файл?
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
25.04.2019, 12:25
Цитата Сообщение от Konor Argent Посмотреть сообщение
А как тогда данные вытащить? И потом записать их в файл?
Уже озвученой выше информации достаточно, что бы разобраться и сделать.
Кликните здесь для просмотра всего текста
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#include <tchar.h>
//#include "wave.h"
#include <windows.h>
 
FILE* OpenWave(const char* pFileName, unsigned long* pFormatOffset, unsigned long* pFormatSize, unsigned long* pDataOffset, unsigned long* pDataSize);
void SaveWave(const char* pFileName, const WAVEFORMATEX* pFormat, const void* pData, unsigned long uDataSize);
 
int main() {
    setlocale(LC_ALL, "Russian");
 
    // открытие файла, проверка его структуры и поиск нужных данных
    unsigned long formatOffset, formatSize, dataOffset, dataSize;
    FILE *file = OpenWave("Slipknot_1.wav", &formatOffset, &formatSize, &dataOffset, &dataSize);
    if (!file)
        return 1;
 
    // читаем формат
    // формат может быть разный: WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX и более сложные варианты
    // но все форматы имеют общие начальные поля и для некомпрессированного PCM звука базовых полей более чем достаточно
    WAVEFORMATEX format;
    memset(&format, 0, sizeof(format));
    fseek(file, formatOffset, FILE_BEGIN);
    if (formatSize <= sizeof(format))
        fread(&format, 1, formatSize, file);
    else
        fread(&format, 1, sizeof(format), file);
 
    // читаем данные
    char* data = (char*)malloc(dataSize);
    fseek(file, dataOffset, FILE_BEGIN);
    fread(data, 1, dataSize, file);
 
    printf("---Считывание заголовка wav файла---\n\n");
    printf("Информация о сжатии: %d\n", format.wFormatTag);
    printf("Частота: %ld\n", format.nSamplesPerSec);
    printf("Количество каналов: %d (%s)\n", format.nChannels, (format.nChannels == 2) ? "Стерео" : (format.nChannels == 1) ? "Моно" : "?");
    printf("Байт в секунду: %ld\n", format.nAvgBytesPerSec);
    printf("Размер сэмпла: %d бит\n", format.wBitsPerSample);
    printf("Размер области данных: %ld байт\n", dataSize);
 
    unsigned uSamples = dataSize / format.nBlockAlign;
    unsigned uSeconds = uSamples / format.nSamplesPerSec;
    printf("Длительность: %02d:%02d\n", uSeconds / 60, uSeconds % 60);
 
    // запишем половину исходных данных в новый файл
    if (uSamples >= 2)
        SaveWave("new.wav", &format, data, (uSamples / 2) * format.nBlockAlign);
 
    fclose(file);
    free(data);
 
    _getch();
    return 0;
}
 
FILE* OpenWave(const char* pFileName, unsigned long* pFormatOffset, unsigned long* pFormatSize, unsigned long* pDataOffset, unsigned long* pDataSize)
{
    *pFormatOffset = *pFormatSize = *pDataOffset = *pDataSize = 0;
 
    FILE* file = fopen(pFileName, "rb");
    if (!file)
        return 0;
 
    char chRiffId[4];
    if ((fread(chRiffId, 1, 4, file) != 4) || (memcmp(chRiffId, "RIFF", 4) != 0))
    {
        // это не RIFF-файл
        fclose(file);
        return 0;
    }
 
    unsigned uRiffSize;
    if (fread(&uRiffSize, 1, 4, file) != 4)
    {
        fclose(file);
        return 0;
    }
 
    char chRiffType[4];
    if ((fread(chRiffType, 1, 4, file) != 4) || (memcmp(chRiffType, "WAVE", 4) != 0))
    {
        // это не WAV-файл
        fclose(file);
        return 0;
    }
 
    // добавляем к размеру данных размеры полей chRiffId и uRiffSize
    uRiffSize += 8;
 
    // проходим по чанкам внутри RIFF
    unsigned uFileOffset = 12;
    while (uFileOffset + 8 <= uRiffSize)
    {
        char chChunkID[4];
        uFileOffset += 4;
        if (fread(chChunkID, 1, 4, file) != 4)
        {
            // ошибочный формат файла
            fclose(file);
            return 0;
        }
 
        unsigned uDataSize;
        uFileOffset += 4;
        if ((fread(&uDataSize, 1, 4, file) != 4) || (uFileOffset + uDataSize > uRiffSize))
        {
            // ошибочный формат файла
            fclose(file);
            return 0;
        }
 
        if (memcmp(chChunkID, "fmt ", 4) == 0) // формат звука
        {
            *pFormatOffset = uFileOffset;
            *pFormatSize = uDataSize;
        }
        else if (memcmp(chChunkID, "data", 4) == 0) // семплы звука
        {
            *pDataOffset = uFileOffset;
            *pDataSize = uDataSize;
        }
 
        uFileOffset += uDataSize;
        // выравнивание чанков по 2 байта
        if (uFileOffset & 1)
            uFileOffset++;
 
        // переходим к следующему чанку
        fseek(file, uFileOffset, FILE_BEGIN);
    }
 
    if ((*pFormatSize == 0) || (*pDataSize == 0))
    {
        // нужные чанки не найдены
        fclose(file);
        return 0;
    }
 
    return file;
}
 
void SaveWave(const char* pFileName, const WAVEFORMATEX* pFormat, const void* pData, unsigned long uDataSize)
{
    FILE* file = fopen(pFileName, "wb");
    if (file)
    {
        fwrite("RIFF", 1, 4, file);
        unsigned long uRiffSize = 4 + (8 + sizeof(*pFormat)) + (8 + uDataSize);
        fwrite(&uRiffSize, 1, 4, file);
        fwrite("WAVE", 1, 4, file);
 
        fwrite("fmt ", 1, 4, file);
        unsigned long uFormatSize = sizeof(*pFormat);
        fwrite(&uFormatSize, 1, 4, file);
        fwrite(pFormat, 1, uFormatSize, file);
 
        fwrite("data", 1, 4, file);
        fwrite(&uDataSize, 1, 4, file);
        fwrite(pData, 1, uDataSize, file);
 
        fclose(file);
    }
}
0
0 / 0 / 0
Регистрация: 01.12.2018
Сообщений: 15
26.04.2019, 01:50  [ТС]
Ygg, спасибо за готовый код! Дальше постараюсь сам разобраться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2019, 01:50
Помогаю со студенческими работами здесь

Как скопировать текст от одной заданной метки до другой из одного текстового файла в другой?
нужно скопировать всё что находится в txt файле ОТ &lt;dekl&gt; ДО &lt;/dekl&gt; подскажите пожалуйста, сам найти так и не смог =(

Перезапись данных из одно fit файла в другой fit файл
Помогите пожалуйста составить программу, которая брала бы имеющийся файл in.fit и переписовала бы из этого файла все данные в новый файл...

Организовать перенос из одного файла в другой с помощью нетипизированого файла.
Организовать перенос из одного файла в другой с помощью нетипизированого файла.

Написать программу записи содержимого из одного файла в другой : Тип файла текстовый
#include &quot;StdAfx.h&quot; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main () { FILE...

из одного файла в другой
подскажите пожалуйста, как скопировать полностью бит в бит из одного exe в другой exe? Чтото не получается :) int main() { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
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