Форум программистов, компьютерный форум CyberForum.ru

C++

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

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

05.09.2015, 16:37. Просмотров 234. Ответов 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 редактор нормально отображает буквы но вместо цифр у него точки
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2015, 16:37     Преобразование Raw-данных в AIFF
Посмотрите здесь:

Преобразование данных в с++ - Visual C++
после работы на с# решил перейти на с++. Вроде язык похожий, но отличия в синтаксисе есть... Вот и столкнулся с проблемой преобразования...

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

Преобразование типов данных - C++
Доброго времени суток, решаю задачу из Лафоре, в этом куске кода мне надо получить значение double, очевидно, что оно будет не целым,...

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

Преобразование типов данных - C++
Здравствуйте, програмеры! :) Возникла такая потребность: преобразовать тип данных с вводных (string, или char) в созданные при помощи enum....

Преобразование типов данных - C++
Как преобразовать тип данных который берется с ячейки Excel в строчный тип, чтобы потом это вывести в label? у меня такой код ...

Преобразование типов данных - C++
Подскажите как преобразовать double 0.00000000000023 в char 2.3E-13 и обратно? Спасибо!

Преобразование типов данных в классах - C++
если например есть такой код: class TIME { int a; } TIME object; object = 10;

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

Явное преобразование типов данных(объясните разницу)! - C++
В чём разница между этим: cout &lt;&lt; &quot;float(int_value15) / int_value2 = &quot; &lt;&lt; float(int_value15) / int_value2 &lt;&lt; endl &lt;&lt; &quot;15 /...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
emmure
2 / 2 / 0
Регистрация: 15.12.2012
Сообщений: 93
07.09.2015, 18:04  [ТС]     Преобразование Raw-данных в AIFF #2
ап!
Ответ Создать тему
Опции темы

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