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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
#1

Как взять громкость звукового файла в определенный момент времени? - C++

03.05.2016, 22:47. Просмотров 504. Ответов 22
Метки нет (Все метки)

Хочу сделать простую программку которая будет выводить 2 значения. 1 - громкость, 2 - тик
пример^
0.56 00000
0.47 00001
0.32 00002
0.39 00003
...
0.96 04324
0.88 04325

К сожалению я даже не новичок, а начинающий в с++, более менее умею только плагины на SourcePawn писать для CS.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2016, 22:47     Как взять громкость звукового файла в определенный момент времени?
Посмотрите здесь:

Создание таймер с остановкой в определенный период времени C++
Получение информации о частоте и длительности из звукового файла. C++
как изменить системную громкость ? C++
C++ Работа со звуком (как звуковые спектры определённого звукового файла записать цифрами в массив)
Как из FB2 файла взять картинку C++
C++ Как взять данные из файла и сохранить в файл?
C++ Как создать калькулятор, и взять из внешнего файла значения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
04.05.2016, 07:10     Как взять громкость звукового файла в определенный момент времени? #2
Что ты называешь громкостью? Там только амплитуда есть.
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
04.05.2016, 15:08  [ТС]     Как взять громкость звукового файла в определенный момент времени? #3
Громкостью называю величину отклонения волны от нуля, в модуле.

Добавлено через 20 минут
Значения громкости нужны для плагина визуализации звука (цветомузыка) на сервере c Sourcemod.
В самом SourceMod я не нашел как можно взять звуковые спектры из звукового файла.
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
04.05.2016, 15:48     Как взять громкость звукового файла в определенный момент времени? #4
Формат файла какой? Читай описание формата.
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
04.05.2016, 15:51  [ТС]     Как взять громкость звукового файла в определенный момент времени? #5
*.mp3 41000 hz mono
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
04.05.2016, 15:56     Как взять громкость звукового файла в определенный момент времени? #6
Тогда какую-то библиотеку надо, которая раскодирует mp3. Что за Sourcemod? Как это связано с C++? Может там свои средства?
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
04.05.2016, 16:13  [ТС]     Как взять громкость звукового файла в определенный момент времени? #7
Про СМ http://hlmod.ru/threads/vvedenie-v-s...mirovanie.257/

Пока что пробую подключить библиотеку bass.h (и с этим у меня небольшие проблемы )
Потом хочу сделать так :
C++
1
2
    float fft[512]; // fft data buffer
    BASS_ChannelGetData(channel,fft,BASS_DATA_FFT1024);
Добавлено через 12 минут
http://www.un4seen.com/doc/#bass/BAS...elGetData.html

Если использовать BASS_ChannelGetData то нужно как-то взять DWORD handle, т.е. это поток как я понял
void *buffer это fft[512]
DWORD length это sizeof(fft)
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
04.05.2016, 18:35     Как взять громкость звукового файла в определенный момент времени? #8
И как ты хочешь прикручивать это к Sourcemod? Там не C++.
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
04.05.2016, 20:48  [ТС]     Как взять громкость звукового файла в определенный момент времени? #9
На первое время буду для каждого трека сохранять txt файл рядом со звуком, в момент проигрывания данные с txt файла будут записываться в массив и во время воспроизведения каждый tick будут меняться значения яркости, размеров и скорости ентити объектов (свет, спрайты).

А вообще можно писать расширения *.ext на c++, но этого я пока что не умею.
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
04.05.2016, 22:25     Как взять громкость звукового файла в определенный момент времени? #10
Сомнительно, что удастся добиться синхронизации.
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
04.05.2016, 23:18  [ТС]     Как взять громкость звукового файла в определенный момент времени? #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include "bass.h"
 
 
int main()
{
    HSTREAM channel;
    channel = BASS_StreamCreateFile(false,"banana.mp3", 0, 0, 0);
    if (channel != NULL) {
        float fft[512];                         // fft data buffer
        BASS_ChannelGetData(channel,fft,BASS_DATA_FFT1024);
        for (int i=0; i<sizeof(fft); i++)
            printf("%.2f \n",fft[i]);
    } else printf("channel = 0 \n");
 
 
    system("pause");
    return 0;
}
Пишет всегда "channel = 0"

А после выполнения программы выползает это:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
P.S. даже если и считаете это бесполезным, то просто помогите, мне сейчас главное разобраться, я только начал учить язык и любая работа будет на пользу.
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
07.05.2016, 22:14     Как взять громкость звукового файла в определенный момент времени? #12
Там с BASS_Init() надо вроде бы начинать. Тип проекта верно выбран? Версия VS какая?
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
08.05.2016, 21:27  [ТС]     Как взять громкость звукового файла в определенный момент времени? #13
Консольное приложение, VS2015

Добавлено через 22 часа 46 минут
nmcf,
BASS_Init() если я не ошибаюсь служит для взятия звука с девайса.
А мне нужно с файла.

Кто-нибудь пробовал компилировать мой код? Библиотеку брал отсюда
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
10.05.2016, 18:05  [ТС]     Как взять громкость звукового файла в определенный момент времени? #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include "bass.h"
 
 
int main()
{
    printf("BASS_Init %i \n",BASS_Init(-1,44100,0,0,0));
    HSTREAM channel = BASS_StreamCreateFile(false,"D:/banana.mp3",0,0,0);
    printf("channel == %i \n",channel);
    float fft[512];                         // fft data buffer
    printf("BASS_ChannelGetData %i \n",BASS_ChannelGetData(channel,fft,BASS_DATA_FFT2048));
    
    //for (int i=0; i<sizeof(fft); i++)
    //  printf("%.2f \n",fft[i]);
    printf("BASS_ErrorCode %i \n", BASS_ErrorGetCode());
    
    system("pause");
    return 0;
}
Вывод
Код
BASS_Init 1
channel == 1610612737
BASS_ChannelGetData -1
BASS_ErrorCode 24
Для продолжения нажмите любую клавишу . . .
После нажатия выходит
Код
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Добавлено через 2 часа 3 минуты
P.S. BASS_ErrorCode 24 это BASS_ERROR_NOPLAY
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
10.05.2016, 22:07     Как взять громкость звукового файла в определенный момент времени? #15
Буфер (fft) маленький. Сделай 1024.
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
10.05.2016, 22:57  [ТС]     Как взять громкость звукового файла в определенный момент времени? #16
Нашел готовый код http://hamelot.io/other/output-spect...-bass-library/

P.S. а у меня в итоге получилось так
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (BASS_Init(-1,44100,0,0,0)) {
    DWORD channel = BASS_StreamCreateFile(false,"D:/banana.mp3",0,0,0);         // BASS_STREAM_DECODE
    if (channel!=0) {
        cout << channel << endl;
        BASS_ChannelPlay(channel, true);
        float fft[512];
        BASS_ChannelGetData(channel,fft,BASS_DATA_FFT1024);
        for (int a=0; a<512; a++)
            printf("%d: %f\n",a,fft[a]);
        printf("BASS_ErrorCode %i \n", BASS_ErrorGetCode());
    } else printf("BASS_StreamCreateFile ERROR - BASS_ErrorCode %i \n",BASS_ErrorGetCode());
} else printf("Init ERROR - BASS_ErrorCode %i \n",BASS_ErrorGetCode());
почему-то массив заполнялся нулями.
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
10.05.2016, 23:03     Как взять громкость звукового файла в определенный момент времени? #17
Звук воспроизводится? Может, там указатель сдвигается как у файлов? Попробуй закомментировать пятую строку.
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
10.05.2016, 23:09  [ТС]     Как взять громкость звукового файла в определенный момент времени? #18
Звук играет, без неё тоже нулями заполняется и с флагом BASS_STREAM_DECODE тоже в BASS_StreamCreateFile.
В общем код по ссылке рабочий, записывает в файл все как надо.
Но за помощь и уделённое время большое спасибо.
nmcf
4749 / 4087 / 1364
Регистрация: 14.04.2014
Сообщений: 16,031
10.05.2016, 23:26     Как взять громкость звукового файла в определенный момент времени? #19
Так оно заработало?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2016, 23:27     Как взять громкость звукового файла в определенный момент времени?
Еще ссылки по теме:

Получить значение амплитуды аудио в заданный момент времени C++
C++ Определение времени подачи звукового сигнала
C++ Вычислить момент времени когда расстояние между лидирующим и замыкающим велосипедистами будет минимальным
C++ Определение скорости движения автомобиля по прямой в каждый момент времени
C++ Послать сообщение окну в указанный момент времени

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

Или воспользуйтесь поиском по форуму:
SHAREN
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 13
10.05.2016, 23:27  [ТС]     Как взять громкость звукового файла в определенный момент времени? #20
да, заработало
Yandex
Объявления
10.05.2016, 23:27     Как взять громкость звукового файла в определенный момент времени?
Ответ Создать тему
Опции темы

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