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

Склеить два wav-файла

11.09.2012, 20:07. Просмотров 2081. Ответов 3
Метки нет (Все метки)

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
/* Написать программу, формирующую из двух WAV файлов третий путем
    конкатенации файлов. */
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <Windows.h>
 
typedef struct
{
    BYTE    riff[4];        // тут должны бфть буквы RIFF
    DWORD    riffsize;       // размер файла
    char    wavefmt[8];            // тут должны быть буквы "WAVEfmt "
    DWORD    fmtsize;            // размер подзаголовка FORMAT
    WORD    wFormatTag;            // формат файла , нас интересует
    WORD    nChannels;            // число каналов
    DWORD    nSamplesPerSec;        // число отсчетов в секунду
    DWORD    nAvgBytesPerSec;    // число байт в секунду. 
    WORD    nBlockAlign;        // выравнивание блока данных
    SHORT    wBitsPerSample;        // число бит на отсчет
    BYTE    data[4];            // тут должны быть буквы "data"
    DWORD    datasize;            // размер данных в байтах 
} WAVE_HEADER_1;
 
typedef struct
{
    BYTE    riff[4];        // тут должны бфть буквы RIFF
    DWORD    riffsize;       // размер файла
    char    wavefmt[8];            // тут должны быть буквы "WAVEfmt "
    DWORD    fmtsize;            // размер подзаголовка FORMAT
    WORD    wFormatTag;            // формат файла , нас интересует
    WORD    nChannels;            // число каналов
    DWORD    nSamplesPerSec;        // число отсчетов в секунду
    DWORD    nAvgBytesPerSec;    // число байт в секунду. 
    WORD    nBlockAlign;        // выравнивание блока данных
    SHORT    wBitsPerSample;        // число бит на отсчет
    BYTE    data[4];            // тут должны быть буквы "data"
    DWORD    datasize;            // размер данных в байтах 
} WAVE_HEADER_2;
 
typedef struct
{
    BYTE    data[4];
    DWORD    datasize;
} DATA_CHUNK_1;
 
typedef struct
{
    BYTE    data[4];
    DWORD    datasize;
} DATA_CHUNK_2;
 
void main ()
{
    FILE *f1, *f2, *f3;
    WAVE_HEADER_1 wHdr1;
    WAVE_HEADER_2 wHdr2;
    BYTE samples;
    f1=fopen("1.wav", "r+b");
    f2=fopen("2.wav", "r+b");
    f3=fopen("3.wav", "w+b");
    fread(&wHdr1, sizeof(wHdr1), 1, f1);
    fread(&wHdr2, sizeof(wHdr2), 1, f2);
    wHdr1.nChannels=1;
    wHdr1.nAvgBytesPerSec=(wHdr1.nChannels*wHdr1.nSamplesPerSec*wHdr1.wBitsPerSample)/8;
    wHdr1.nBlockAlign=(wHdr1.nChannels*wHdr1.wBitsPerSample)/8;
    wHdr1.datasize=wHdr1.datasize+wHdr2.datasize;
    fwrite(&wHdr1, sizeof(wHdr1), 1, f3);
 
    for(DWORD i=0;i<=wHdr1.datasize;i++)
    {
        fread(&samples, sizeof(samples), 1, f1);
        fwrite(&samples, sizeof(samples), 1, f3);
    }
    for(DWORD i=0;i<=wHdr2.datasize;i++)
    {
        fread(&samples, sizeof(samples), 1, f2);
        fwrite(&samples, sizeof(samples), 1, f3);
    }
    fcloseall();
}
Собственно, не могу найти ошибку: размер выходного файла больше чем размер 2ух входных (вроде должен быть чуть меньше: 1 хедер + 2 датасайза) и воспроизводится только 1 файл, 2ой - тишина, хотя по длине ( в сек) получается 1 + 2 файл

Ткните меня носом, где я накосячил

Добавлено через 54 минуты
исходные 2 wav файла одинаковые *

Добавлено через 1 минуту
не заметил, 64 строчку можно убрать

Добавлено через 30 минут
Ошибку нашел, неправильно циклами фор прошелс
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2012, 20:07
Ответы с готовыми решениями:

Как склеить два файла в один?
Вообщем проблема в том, что мне нужно записывать в начало файла. я создаю новый файл записываю в...

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

Как склеить два динамических массива
int *a = new int ; int *b = new int ; В конец массива а дописать b, не используя третьего...

Склеить два куска кода в один
Помогите склеить два кода в один ,чтобы вышла программа ,которая при выборе варианта 1-будет...

3
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 7
27.10.2012, 01:49 2
Жесть. А если файлы по надцать гиг ? Как это сделать на уровне фс ? Не перечитывая файлы ?
0
3300 / 2681 / 724
Регистрация: 25.03.2012
Сообщений: 9,683
Записей в блоге: 1
27.10.2012, 06:27 3
Цитата Сообщение от iTD Посмотреть сообщение
typedef struct
{
* * BYTE * *riff[4];* * * * // тут должны бфть буквы RIFF
* * DWORD * *riffsize;* * * *// размер файла
* * char * *wavefmt[8]; * * * * * *// тут должны быть буквы "WAVEfmt "
* * DWORD * *fmtsize; * * * * * *// размер подзаголовка FORMAT
* * WORD * *wFormatTag; * * * * * *// формат файла , нас интересует
* * WORD * *nChannels; * * * * * *// число каналов
* * DWORD * *nSamplesPerSec; * * * *// число отсчетов в секунду
* * DWORD * *nAvgBytesPerSec; * *// число байт в секунду.
* * WORD * *nBlockAlign; * * * *// выравнивание блока данных
* * SHORT * *wBitsPerSample; * * * *// число бит на отсчет
* * BYTE * *data[4]; * * * * * *// тут должны быть буквы "data"
* * DWORD * *datasize; * * * * * *// размер данных в байтах
} WAVE_HEADER_1;
typedef struct
{
* * BYTE * *riff[4];* * * * // тут должны бфть буквы RIFF
* * DWORD * *riffsize;* * * *// размер файла
* * char * *wavefmt[8]; * * * * * *// тут должны быть буквы "WAVEfmt "
* * DWORD * *fmtsize; * * * * * *// размер подзаголовка FORMAT
* * WORD * *wFormatTag; * * * * * *// формат файла , нас интересует
* * WORD * *nChannels; * * * * * *// число каналов
* * DWORD * *nSamplesPerSec; * * * *// число отсчетов в секунду
* * DWORD * *nAvgBytesPerSec; * *// число байт в секунду.
* * WORD * *nBlockAlign; * * * *// выравнивание блока данных
* * SHORT * *wBitsPerSample; * * * *// число бит на отсчет
* * BYTE * *data[4]; * * * * * *// тут должны быть буквы "data"
* * DWORD * *datasize; * * * * * *// размер данных в байтах
} WAVE_HEADER_2;
Всё не читал. Сразу скажу: ты не знаешь, что такое структуры в С++, иначе бы не стал объявлять две абсолютно идентичные структуры. (Очевидно, ты думал, что для двух экземпляров объектов нужно объявлять две структуры? Как бы не так!)
0
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 7
27.10.2012, 13:53 4
Так что там с дисковыми операциями ? Можно вписать блок в середину файла избежав перечитывания и перезаписи всего хвоста ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2012, 13:53

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

Как склеить два куска динамически выделенной памяти?
Есть такой код char *arr = (char *) malloc(1); char *plus = (char *) malloc(25); arr =...

Дано два текстовых фаила. "Склеить" эти фаилы
Дано два текстовых фаила. &quot;Склеить&quot; эти фаилы, т.е. сформировать единый фаил, последовательно...

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

Деление Wav-файла на два канала
Реализовать функцию разделяющую входной wav файл на каналы (на два выходных файла) с возможностью...


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

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

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