Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
#1

Записать данные в звуковой файл - C++ Qt

15.10.2015, 15:54. Просмотров 802. Ответов 17
Метки нет (Все метки)

как правильно записать заголовок в звуковой файл?? есть для этого какие то библиотеки??

Добавлено через 1 час 16 минут
а как посмотреть заголовок wav файла в какой программе его нужно открыть чтобы посмотреть??
http://www.cyberforum.ru/qt/thread1231417.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2015, 15:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Записать данные в звуковой файл (C++ Qt):

Не удается записать данные в поток
Доброго времени суток. Создал клиент/сервер, после соединения клиент может...

Как записать в переменную данные из QDateTimeEdit?
Помогите, пожалуйста,есть QDateTimeEdit, пользователь ввёл в него время и дату,...

Как записать данные из QListWidget и обратно ?
Подскажите как можно загрузить все строчки из QListWidget в файл, а потом...

Записать данные в ячейку таблица при клике на нее
Народ такой вопрос есть таблица 5 на 5 теперь надо сделать так что бы когда я...

Как записать структуру в файл
Как на Qt записать структуру в файл??

17
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
16.10.2015, 14:01 #2
Цитата Сообщение от yura91 Посмотреть сообщение
а как посмотреть заголовок wav файла в какой программе его нужно открыть чтобы посмотреть??
Да в HEX-редакторе жеж...
0
Миниатюры
Записать данные в звуковой файл  
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
17.10.2015, 14:01  [ТС] #3
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct  WAV_HEADER{
        char                RIFF[4];        // RIFF Header      Magic header
        unsigned long       ChunkSize;      // RIFF Chunk Size
        char                WAVE[4];        // WAVE Header
        char                fmt[4];         // FMT header
        unsigned long       Subchunk1Size;  // Size of the fmt chunk
        unsigned short      AudioFormat;    // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
        unsigned short      NumOfChan;      // Number of channels 1=Mono 2=Sterio
        unsigned long       SamplesPerSec;  // Sampling Frequency in Hz
        unsigned long       bytesPerSec;    // bytes per second
        unsigned short      blockAlign;     // 2=16-bit mono, 4=16-bit stereo
        unsigned short      bitsPerSample;  // Number of bits per sample
        char                Subchunk2ID[4]; // "data"  string
        unsigned long       Subchunk2Size;  // Sampled data length
 
    }wav_hdr;
насколько я понял структура заголовка wav файла выглядит так?? То есть если у меня эти данные есть(все поля структуры известны) я могу этот заголовок писать через write() в wav файл, а потом также через write записать сами данные правильно я понимаю??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
18.10.2015, 09:32 #4
Ну наверное, что мешает попробовать? Боишься wav испортить?

Туда нада еще длинну файла вписывать, когда файл будет готов:

RIFF Chunk Size - длинна файла почему-то без 8 байт.
Sampled data length - длинна данных = длинна файла - 44 байта (заголовок)
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
21.10.2015, 18:38  [ТС] #5
C++ (Qt)
1
2
3
4
5
6
7
8
QAudioFormat format;
 
            format.setSampleSize(16);
            format.setSampleRate(44100);
            format.setChannelCount(2);
            format.setCodec("audio/pcm");
            format.setByteOrder(QAudioFormat::LittleEndian);
            format.setSampleType(QAudioFormat::UnSignedInt);
А как в формат дописать:
char RIFF[4];
unsigned long ChunkSize;
char WAVE[4];
char fmt[4];

Как эти данные дописать?? Если это дописать то это и будет сформированный заголовок??

Добавлено через 1 минуту
просто в инете нашел такие варианты а QAudioFormat format; - это и есть сам заголовок?? Или каким классом представляется заголовок wav файла в qt ??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
22.10.2015, 08:36 #6
Да смотришь наверху скан заголовка, и делаешь так же:

char RIFF[4] {0x52, 0x49, 0x46, 0x46};
char WAVE[4] {0x57, 0x41, 0x56, 0x45};
char fmt[4] {0x66, 0x6d, 0x74, 0x20};

в ChunkSize длина твоего файла wav минус 8 байт. На скане заголовка длина файла 392052 байт, в ChunkSize 0x0005FB6C = 392044 байта.

в bytesPerSec длина одной секунды звука (я так понял). Для стерео это 0x0002B110 = 176400

char data[4] {0x64, 0x61, 0x74, 0x61};

Subchunk2Size - длина данных без заголовка, т.е. длина файла минус 44 байт: 0x0005FB48 = 392008.

И остальные поля структуры можно так же посмотреть и понять что они и для чего они. И как их заполнять. Вроде не так сложно расшифровать?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
22.10.2015, 14:12  [ТС] #7
А в 3gpp как записать тоже заголовок надо сначала писать??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
22.10.2015, 16:53 #8
Что такое 3gpp?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
22.10.2015, 16:59  [ТС] #9
а если мне нужно передать wav файл с андроид клиента на tcp сервер qt то мне нужно все данные заголовка тоже передать размер, частота, бит на сепл, аудио формат, число каналов и так далее правильно я понимаю??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
22.10.2015, 18:05 #10
Цитата Сообщение от yura91 Посмотреть сообщение
если мне нужно передать wav файл с андроид клиента на tcp сервер qt то мне нужно все данные заголовка тоже передать
Как это понять? Вы его частями что-ли передаёте, отдельно заголовок, отдельно данные? Зачем?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
22.10.2015, 21:13  [ТС] #11
C++ (Qt)
1
2
3
4
5
6
format.setSampleSize(16);
            format.setSampleRate(44100);
            format.setChannelCount(2);
            format.setCodec("audio/pcm");
            format.setByteOrder(QAudioFormat::LittleEndian);
            format.setSampleType(QAudioFormat::UnSignedInt);
На сколько я понимаю эти данные тоже являются частью заголовка?? Я не ошибаюсь??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
22.10.2015, 22:14 #12
Ну да, а какая разница? Заголовок 44 байта, туда всё помещается, и текст и данные. Всё строго на своих местах. Дальше сразу идут звуковые данные, и их обычно гораздо больше - мегабайты и десятки мегабайт. Вы чего хотите то? Съэкономить на передаче заголовка и передать только необходимые цифры?

Я не пойму, почему не передать с клиента на сервер целый wav файл?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
22.10.2015, 22:26  [ТС] #13
Ситуация следующая у меня на андроид TCP клиенте есть wav файл. Я его хочу передать на TCP сервер Windows Qt. Так вот там в андроиде, раз у меня есть рабочий wav файл, есть заголовок и сами данные, но дело в том, что по TCP идет передача потока байт и целиком файл как по FTP не передашь, в любом случае передавать по байтам. Вот я и думаю либо передать сами данные с клиента андроид на сервер Qt и заголовок сформировать на сервере Qt?? Или лучше и заголовок и данные передать с клиента а на сервере Qt просто создать wav файл и весь этот буфер который пришел с клиента целиком записать в wav файл так можно, все норм будет??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
22.10.2015, 23:04 #14
Цитата Сообщение от yura91 Посмотреть сообщение
но дело в том, что по TCP идет передача потока байт и целиком файл как по FTP не передашь, в любом случае передавать по байтам.
Ну вот и договорились до... ЛЮБОЙ файл состоит только из байт, и НИЧЕГО КРОМЕ БАЙТ В НЕМ НЕТУ. Заголовок ничем не отличается от остального файла - это всего лишь заполненные особым образом первые 44 байта, а за ними идут точно такие же байты музыкальных данных. И передаваться они будут по байтам, и в приёмнике получится точно такой же файл, какой был отправлен передатчиком.

Или может я чего не знаю, и "с клиента андроид на сервер Qt" данные передаются как-то по другому?
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
23.10.2015, 11:12  [ТС] #15
Просто у меня ситуация в чем. Я получаю в андроиде этот звук с микрофона и сами байты звука, через класс в андроиде AudioRecorder,у меня попадают сразу в буфер приложения. Ну а заголовок тем не менее приходится формировать самому, чтобы записать этот буфер в wav файл. Так вот в чем дело в принципе мне звуковой wav файл на андроиде особо не нужен. У меня есть буфер звуковых данных в андроид, которые мне и нужно передать на сервер Qt, но на счет заголовка меня смутил один момент: вот вы говорите
в ChunkSize длина твоего файла wav минус 8 байт
. Но в примере, который я нашел ( там делает запись звука в wav файл, в андроиде) устанавливается первоначально длина wav файла в 0( так как данные берутся с микрофона и первоначально размер wav файла неизвестен) и соответственно ChunkSize первоначально тоже устанавливается в 0. Так вот вопрос а можно ли так делать(не ошибочно) если не знаешь сколько будет занимать wav файл ставить его размер в заголовке 0 ?? Точный размер все равно потом определится когда все данные будут с микрофона записаны в файл или как??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
23.10.2015, 14:23 #16
1. Что мешает сделать заголовок после заполнения буфера данными, когда его длина уже известна? А потом сперва скинуть в файл заголовок со всеми нужными цифрами, и следом буфер?

2. Если по какой-то причине это затруднительно, есть СИ-шные операторы чтения/записи в файл fread и fwrite, они позволяют записывать инфу в произвольное место файла, т.е. в заголовке уже имеющегося файла заменить нули на нужные вам цифры. Может и средства Qt так могут, я об этом не знаю.

Если оставить wav с нулями вместо размера, с ним могут неправильно работать (или вообще не будут работать) другие программы.
0
yura91
1 / 25 / 2
Регистрация: 23.10.2013
Сообщений: 2,317
23.10.2015, 16:35  [ТС] #17
Всмысли какие другие программы вы имеете ввиду?? Звуковые проигрыватели чтоли?? Почему тогда в андроиде все работает нормально?? И еще такой вопрос : Я хочу в JSONе c андроид клиента на Qt сервер передать изображение, звук там размеры данных. И у меня возникает такой вопрос : Вот я перекодирую свое изображение в формат Base64 запихну в JSON, но размер изображение может быть большим(несколько мегабайт например) если я бы передавал его по байтам, его пришлось бы передавать порциями, так как несколько мегабайт за один раз без потерь не передашь. Но если я запихну это изображение в JSON, то у меня не будет проблем с передачей(потеря данных там) ?? Или если в JSON то это не важно сколько занимает изображение?? Можно спокойно запихивать и передавать??

Добавлено через 2 часа 1 минуту
На счет размера понял. А как правильно записать структуру в файл в Qt то есть если я заполнил эту структуру заголовка
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct  WAV_HEADER{
        char                RIFF[4];        // RIFF Header      Magic header
        unsigned long       ChunkSize;      // RIFF Chunk Size
        char                WAVE[4];        // WAVE Header
        char                fmt[4];         // FMT header
        unsigned long       Subchunk1Size;  // Size of the fmt chunk
        unsigned short      AudioFormat;    // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
        unsigned short      NumOfChan;      // Number of channels 1=Mono 2=Sterio
        unsigned long       SamplesPerSec;  // Sampling Frequency in Hz
        unsigned long       bytesPerSec;    // bytes per second
        unsigned short      blockAlign;     // 2=16-bit mono, 4=16-bit stereo
        unsigned short      bitsPerSample;  // Number of bits per sample
        char                Subchunk2ID[4]; // "data"  string
        unsigned long       Subchunk2Size;  // Sampled data length
 
    }wav_hdr;
Как потом эту структуру записать в wav файл. Какая команда Qt для этого есть??
0
alexu_007
142 / 153 / 34
Регистрация: 29.05.2015
Сообщений: 1,094
26.10.2015, 09:27 #18
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
       typedef struct  WAV_HEADER{
        char                RIFF[4];
        unsigned long       ChunkSize;
        ...
        // и так далее...
 
    }wav_hdr;
 
 
 FILE *fp;
 
 if((fp=fopen("test", "wb"))==NULL) {
// действия если файл не открылся
 }
 
 fwrite(&wav_hdr, sizeof (wav_hdr), 1, fp);
 
 fclose (fp);
Такой вариант чем вас не устраивает? Либо забить на структуру, и записывать заголовок побайтово:

C++ (Qt)
1
2
3
4
5
6
7
QByteArray header;
 
header << 0x52 << 0x49 << 0x46 << 0x46 << 0 << 0... 
// и так далее все 44 байта.
 
// записываем с помощью <QFile>:
outf.write(header);
Ну сколько можно мучить этот несчастный wav? Уже запишите его как нибудь...
0
26.10.2015, 09:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2015, 09:27
Привет! Вот еще темы с решениями:

Есть ли возможность в Qt записать телефонный разговор в файл?
Собственно задача стоит в проблеме записи телефонного разговора. Возможно ли...

Как записать даные из QStreamList в текстовий файл?
Создал текстовый документ и поток: QFile file(&quot;D://text.txt&quot;); ...

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

Записать в новый файл первую и последнюю строки
Ребят, всем привет, есть текстовый файл, созданный потоком outstream, в нем...


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

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

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