Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
#1

Преобразование Raw-данных в AIFF - C++

05.09.2015, 16:37. Просмотров 251. Ответов 1
Метки нет (Все метки)

Пытаюсь считать Raw дату, и сформировать из него AIFF файл с заголовком и датой. Тоже самое делал с WAV, получилось. Методы по сути брал оттуда, так что скорее всего проблема в структуре заголовка
aiff.h
Кликните здесь для просмотра всего текста
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
#ifndef AIFF_H
#define AIFF_H
#include <fstream>
#include <vector>
class AIFF
{
protected:
    //Form chunk
    char chunkId[4];
    unsigned long chunkSize;
    char formType[4];
    //COMM chunk
    char chunk2Id[4];
    unsigned long chunk2Size;
    unsigned short numChannels;
    unsigned long numSampleFrames;
    unsigned short sampleSize;
    unsigned char sampleRate[10];
 
    //SSND chunk
    char chunk3ID[4];
    unsigned long chunk3Size;
    unsigned long offset;
    unsigned long blockSize;
    //soundData
    std::vector <long> data;
 
public:
    AIFF();
    void add_by(FILE *file_in);
    void out(FILE *file_out);
    void cutoff(FILE *file_out);
};
 
#endif // AIFF_H

aiff.cpp
Кликните здесь для просмотра всего текста
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
#include "aiff.h"
void ConvertDoubleToLongDouble(double value, unsigned char result[10])  //convert 64-bit to 80-bit
{
    __asm {
        fld value;
        mov ebx, result;
        fstp tbyte ptr[ebx];
    }
}
AIFF::AIFF()
{
 
    chunkId[0] = 'F'; chunkId[1] = 'O'; chunkId[2] = 'R'; chunkId[3] = 'M';
    chunkSize = 46;
    formType[0] = 'A'; formType[1] = 'I'; formType[2] = 'F'; formType[3] = 'F';
    chunk2Id[0] = 'C'; chunk2Id[1] = 'O'; chunk2Id[2] = 'M'; chunk2Id[3] = 'M';
    chunk2Size = 18;
    numChannels = 2;
    numSampleFrames = 88200;
    sampleSize = 16;
    //convert 64-bit to 80-bit
    double value = 44100;
    ConvertDoubleToLongDouble(value, sampleRate); //sampleRate1 = 44100
    //
    chunk3ID[0] = 'S'; chunk3ID[1] = 'S'; chunk3ID[2] = 'N'; chunk3ID[3] = 'D';
    chunk3Size = 8;
    offset = 0;
    blockSize = 0;
}
 
void AIFF::add_by(FILE *file_in)//метод считывает по попарно 2 переменные по 2 байта(16-бит) и формирует из него элемент массива data(4 байта)
{
    unsigned short o_byte, s_byte;
    fread(&s_byte, sizeof(s_byte), 1, file_in);
    fread(&o_byte, sizeof(o_byte), 1, file_in);
    unsigned long var = (o_byte);
    var = (s_byte) | (var << 16);
    data.insert(data.end(), var);
    chunkSize += 4;
    chunk3Size += 4;
    return;
}
 
void AIFF::out(FILE *file_out)//метод выводит получившийся вконце AIFF в файл
{
    fwrite(&chunkId, sizeof(char) * 4, 1, file_out);
    fwrite(&chunkSize, sizeof(chunkSize), 1, file_out);
    fwrite(&formType, sizeof(char) * 4, 1, file_out);
    //
    fwrite(&chunk2Id, sizeof(char) * 4, 1, file_out);
    fwrite(&chunk2Size, sizeof(chunk2Size), 1, file_out);
    fwrite(&numChannels, sizeof(numChannels), 1, file_out);
    fwrite(&numSampleFrames, sizeof(numSampleFrames), 1, file_out);
    fwrite(&sampleSize, sizeof(sampleSize), 1, file_out);
    fwrite(&sampleRate, sizeof(char) * 10, 1, file_out);
    //
 
    fwrite(&chunk3ID, sizeof(char) * 4, 1, file_out);
    fwrite(&chunk3Size, sizeof(chunk3Size), 1, file_out);
    fwrite(&offset, sizeof(offset), 1, file_out);
    fwrite(&blockSize, sizeof(blockSize), 1, file_out);
    for (int i = 0; i < data.size(); i++)
        fwrite(&data[i], sizeof(long), 1, file_out);
    return;
}

main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "aiff.h"
using namespace std;
 
int main()
{
    FILE *file_in, *file_out;
    fopen_s(&file_out, "E:\\coutAiff1.aiff", "wb");
    fopen_s(&file_in, "E:\\sin.raw", "rb");
    AIFF myAiff;
    for (int i = 0; i<400000; i++)
    {
        myAiff.add_by(file_in);
        
    }
 
    myAiff.out(file_out);
    system("PAUSE");
    fclose(file_out);
    return 0;
}

Файл который по итогу получается не читается.
P.S. ещё хотелось бы узнать с помощью каких программ можно просматривать структуру медиа файлов. Hex редактор нормально отображает буквы но вместо цифр у него точки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2015, 16:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование Raw-данных в AIFF (C++):

RAW сокет - C++
нужен рабочий пример создания сырого сокета З.ы под windows Добавлено через 20 минут нашел такой код, под хрюшей работает збс, но...

Форматное преобразование данных - C++ Builder
В программе есть кнопка сохранить изменения.в ней этот код так после нажатия на эту кнопку,мы наживаем кнопку загрузить данные и он...

преобразование данных DBGrid в SringGrig - C++ Builder
Подскажите пожалуйста как после выборки в DBGrid данные занести в StringGrig?

Преобразование данных из строки в отрицательное число - C++ Builder
Здравствуйте! Имеется ряд строк типа -498.67469 нужно преобразовать в число для дальнейшей работы. может есть функция типа...

Преобразование визуальных данных из формата RGB в YUV (4:2:0) - C++ Builder
Помогите, пожалуйста, добрые люди. При создании программы преобразовании визуальных данных из формата RGB в YUV наткнулся на проблему в...

Открытие бинарного файла и преобразование данных в dec - C++ Builder
Доброго времени суток! Подскажите каким образом можно открыть бинарный файл вида &quot;*.txt&quot; и перевести данные в десятичную систему...

1
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
07.09.2015, 18:04  [ТС] #2
ап!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2015, 18:04
Привет! Вот еще темы с ответами:

C++ Builder 6.0 - преобразование hex данных с компорта в вещественное число двойной точности - C++ Builder
Доброго всем времени суток. Данные с компорта записываю во временный буфер queue &lt;unsigned char&gt; TmpBuffer;По логике в переменную типа...

Raw socket подмена ip адреса отправителя - C++ Builder
Задача такая надо отправить пакет с другим ip адресом отправителя. Подскажите как это сделать? Слышал что можно это сделать через Raw...

Визуализация 16 битного raw файла: Нужен совет - C++ Builder
Всем привет! Нужен совет, кто как решал бы такую задачу: На входе есть монохромное изображение в виде raw файла - матрица из 2-х...

Ошибка данных CRC, попутно RAW - Жесткие диски
Добрый день, есть жесткий WDC WD5000BPVT-00HXZT1. В один прекрасный момент комп перестал его открывать, висит просто как диск F, при...


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

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

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