PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Проиграть звуковой файл из памяти.


Проиграть звуковой файл из памяти.

Сообщений 1 страница 16 из 16

1

Не мог бы кто подсказать, плиз, идею (или даже код), как сыграть, например, mp3 файл из памяти?

0

2

Нужен именно mp3 или другие форматы тоже подойдут?
Для проигрывания wav, flac и др. можно использовать стандартные функции Sound, загружая звук из памяти функцией CatchSound.

0

3

MP3 предпочтительнее, однако, спасибо за подсказку, поизучаю этот аспект.

0

4

забросил призыв о помощи в папу-форум, может, там помогут. Нужно играть именно сжатый файл, WAV файлы получаются огромными (
зато проблемы с ними нет:

Код:
InitSound()
NameFile$= "Recording.wav"
LengthFile.q =FileSize(NameFile$)
*mem=AllocateMemory( SizeOf(Byte)*LengthFile)
 ReadFile(0, NameFile$): ReadData(0, *mem, SizeOf(Byte)*LengthFile):CloseFile(0)
 
 CatchSound(1, *mem) :PlaySound(1)  
; или 
;PlaySound_(*mem, #Null, #SND_MEMORY|#SND_NODEFAULT|#SND_SYNC) ; тоже играется на ура

 
StartTime.l = ElapsedMilliseconds()
Repeat
Delay(1)
Until ElapsedMilliseconds() > StartTime + 8000 ; просто ограничение по времени
FreeMemory(*mem)

0

5

Goga написал(а):

WAV файлы получаются огромными (
зато проблемы с ними нет:

Вам же подсказал Пётр использовать библиотеку Sound. Там есть UseOGGSoundDecoder() Включает поддержку Звука в формате OGG (OGG Vorbis) для CatchSound() иLoadSound().
OGG сжимает не хуже MP3, а может иногда и лучше + формат полностью открытый, можно перекодировать в него любые звуки и музыку бесплатно,  например Audacity и разные другие кодировщики.

0

6

Петр очень сжато подсказал, мне не хватило инфы для понимания смысла. Однако, спасибо, что добавили информацию, поработаю с ней снова.

0

7

Goga написал(а):

Петр очень сжато подсказал

Я написал про функцию загружающую музыку из памяти - CatchSound
В документации на нее есть упоминание на форматы flac и ogg.

0

8

я без претензий )  Я просто не внимательно почитал справку. Кстати, на папе форуме тоже отослали к ogg формату. К счастью, мне не критично рабоать только с mp3.

кстати, если вдруг кому-то будет интересно, то с ogg-файлом моя задачка решается так:

Код:
InitSound()
UseOGGSoundDecoder()
NameFile$= "Recording.ogg"
LengthFile.q =FileSize(NameFile$)
*mem=AllocateMemory( SizeOf(Byte)*LengthFile)
 ReadFile(0, NameFile$)
 Res = ReadData(0, *mem, SizeOf(Byte)*LengthFile) ; загрузили файл в память
 CloseFile(0)
  #SOUND_FILE = 1
   CatchSound(#SOUND_FILE, *mem, LengthFile ,#PB_Sound_Streaming) ; связываем файл с памятью
 PlaySound(#SOUND_FILE)
 
StartTime.l = ElapsedMilliseconds()
Repeat
Delay(1)
Until ElapsedMilliseconds() > StartTime + 8000
FreeMemory(*mem)
End

Всем спасибо, вы мне очень помогли.

Отредактировано Goga (08.07.2021 17:03:12)

0

9

Goga написал(а):

моя задачка решается так:

Интересно. а почему именно так длинно, а не это? Тут звуковой файл Recording.ogg не нужен после компиляции:

Код:
InitSound()
UseOGGSoundDecoder()
#SOUND_FILE = 1
CatchSound(#SOUND_FILE, ?Music,?MusicEnd-?Music)
PlaySound(#SOUND_FILE)

DataSection
    Music: 
    IncludeBinary "Recording.ogg"
    MusicEnd:
  EndDataSection
  

И у вас формально играется из памяти, но в память попадает из файла:
ReadFile(0, NameFile$),  при выполнении программы!

Ваш этот способ фактически не отличается от

LoadSound(#SOUND_FILE, SoundFileName$)
PlaySound(#SOUND_FILE)
нужно всегда держать рядом с exe звуковой файл Recording.ogg

Отредактировано ВиниПур (08.07.2021 23:29:40)

0

10

ВиниПур, это лишь часть программы, поэтому тут исскусственные исходные условия

Отредактировано Goga (11.07.2021 14:28:45)

0

11

Новая порция проблем )) 
Все стало почти хорошо,  ogg файлы замечательно из памяти играются, но как узнать "длину" звукого файла и получить текущее положение ползунка проигрывания? Заодно,  уметь управлять местоположением этого ползунка ? Вопрос относится только к работе из памяти.

0

12

Goga написал(а):

Новая порция проблем ))

Не зная Вашего замысла и ваших " искусственных исходных условий" пока создаётся впечатление, что вы источник своих проблем.
К примеру #PB_Sound_Streaming. Для чего он вам в программе?

Goga написал(а):

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

Уберите #PB_Sound_Streaming и библиотека "Sound" обеспечивает простой способ узнать длину указанного Звука в миллисекундах, а так же текущую позицию воспроизведения в указанном Звуке.
SoundLength, GetSoundPosition

+1

13

ВиниПур, не будьте ко мне строги )  В памяти я хочу раскрывать шифрованные звуковые файлы. Я понимаю, что их можно скопировать из памяти уже декодированными или даже записать тупо на микрофон, но это все же лучше, чем их держать в открытом состоянии, тем более, я собираюсь упаковать в один кодированный файл сразу несколько файлов разных форматов и, возможно, попробовать, вообще не держать локально такой файл.
Вам огромное спасибо за эти подсказки, обучающих примеров использования по PB не густо, поэтому любая помощь для меня очень ценна.

0

14

Пример проигрывания mp3 файла из памяти используя FMOD Ex

Код:
#FMOD_INIT_NORMAL = $00000000 
#FMOD_HARDWARE = $00000020 
#FMOD_OPENMEMORY  = $00000800
#FMOD_LOOP_OFF = $00000001 
#FMOD_CHANNEL_FREE  = -1 
#FMOD_CREATECOMPRESSEDSAMPLE = $00000200
#FMOD_TIMEUNIT_MS = $1      ; Milliseconds.

Structure FMOD_CREATESOUNDEXINFO
  cbsize.i       ; Size of this structure
  length.i       ; Size in bytes of file to load
  params.i[32]   ; Other 32 Parameters
EndStructure

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  Global fmodLib = OpenLibrary(#PB_Any, "fmodex.dll")
CompilerElse
  Global fmodLib = OpenLibrary(#PB_Any, "fmodex64.dll")
CompilerEndIf

If fmodLib
  Prototype.l FMOD_System_Create_Prototype(*system)
  Global FMOD_System_Create.FMOD_System_Create_Prototype = GetFunction(fmodLib, "FMOD_System_Create")
  Prototype.l FMOD_System_CreateSound_Prototype(*system, name_or_data, mode, *exinfo, *sound)
  Global FMOD_System_CreateSound.FMOD_System_CreateSound_Prototype = GetFunction(fmodLib, "FMOD_System_CreateSound")
  Prototype.l FMOD_System_Init_Prototype (system.l, Maxchannels.l, flags.l, Extradriverdata.l)
  Global FMOD_System_Init.FMOD_System_Init_Prototype = GetFunction(fmodLib, "FMOD_System_Init")
  Prototype.l FMOD_System_PlaySound_Prototype (system.l, channelid.l, sound.l, paused.l, *channel)
  Global FMOD_System_PlaySound.FMOD_System_PlaySound_Prototype = GetFunction(fmodLib, "FMOD_System_PlaySound")
  Prototype.l FMOD_Sound_Release_Prototype (sound.l)
  Global FMOD_Sound_Release.FMOD_Sound_Release_Prototype = GetFunction(fmodLib, "FMOD_Sound_Release")
  Prototype.l FMOD_System_Close_Prototype (system.l)
  Global FMOD_System_Close.FMOD_System_Close_Prototype = GetFunction(fmodLib, "FMOD_System_Close")
  Prototype.l FMOD_Sound_GetLength_Prototype (sound.l, *Length, Lengthtype.l)
  Global FMOD_Sound_GetLength.FMOD_Sound_GetLength_Prototype = GetFunction(fmodLib, "FMOD_Sound_GetLength")
  Prototype.l FMOD_Channel_GetPosition_Prototype (channel.l, *Position, Postype.l)
  Global FMOD_Channel_GetPosition.FMOD_Channel_GetPosition_Prototype = GetFunction(fmodLib, "FMOD_Channel_GetPosition")
  Prototype.l FMOD_Channel_SetPosition_Prototype (channel.l, Position.l, Postype.l)
  Global FMOD_Channel_SetPosition.FMOD_Channel_SetPosition_Prototype = GetFunction(fmodLib, "FMOD_Channel_SetPosition") 
Else
  Debug "Lib not loaded"
  End
EndIf

Global SoundLength, SoundPosition
exinfo.FMOD_CREATESOUNDEXINFO
exinfo\cbsize = SizeOf(FMOD_CREATESOUNDEXINFO)
exinfo\length = ?MusicFileDataEnd - ?MusicFileDataStart

FMOD_System_Create(@system)
FMOD_System_Init(system, 32, #FMOD_INIT_NORMAL, 0)
OpenWindow(0, 0, 0, 100, 100,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
ButtonGadget(1, 5, 10, 120, 30, "Play sound") 
FMOD_System_CreateSound(system, ?MusicFileDataStart, #FMOD_OPENMEMORY, @exinfo, @sound)
FMOD_Sound_GetLength(sound, @SoundLength, #FMOD_TIMEUNIT_MS)
TrackBar = TrackBarGadget(#PB_Any, 5, 50, 120, 25, 0, SoundLength)

Repeat 
  EventID = WaitWindowEvent(10) 
  If EventID = #PB_Event_Gadget And EventGadget() = 1 
    FMOD_System_PlaySound(system, #FMOD_CHANNEL_FREE, sound, 0, @channel) 
  EndIf
  
  FMOD_Channel_GetPosition(channel, @SoundPosition, #FMOD_TIMEUNIT_MS)
  SetGadgetState(TrackBar, SoundPosition)
Until EventID = #PB_Event_CloseWindow 

FMOD_Sound_Release(sound) 
FMOD_System_Close(system) 
CloseLibrary(fmodLib)

DataSection
  MusicFileDataStart:
  IncludeBinary "example.mp3"
  MusicFileDataEnd:
EndDataSection 

dll: https://www.upload.ee/files/13345793/FM … l.rar.html или https://zdoom.org/files/fmod/

Отредактировано Lin (27.07.2021 20:09:02)

0

15

Lin, круто, спасибо! Я, правда, все переделал у себя уже на ogg. Однако, это очень полезный материал.

0

16

Я тоже кину пример на api как с отпуска вернусь через неделю.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Проиграть звуковой файл из памяти.