Не мог бы кто подсказать, плиз, идею (или даже код), как сыграть, например, mp3 файл из памяти?
Проиграть звуковой файл из памяти.
Сообщений 1 страница 16 из 16
Поделиться203.07.2021 17:05:01
Нужен именно mp3 или другие форматы тоже подойдут?
Для проигрывания wav, flac и др. можно использовать стандартные функции Sound, загружая звук из памяти функцией CatchSound.
Поделиться304.07.2021 11:19:15
MP3 предпочтительнее, однако, спасибо за подсказку, поизучаю этот аспект.
Поделиться407.07.2021 09:26:01
забросил призыв о помощи в папу-форум, может, там помогут. Нужно играть именно сжатый файл, 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)
Поделиться507.07.2021 11:30:38
WAV файлы получаются огромными (
зато проблемы с ними нет:
Вам же подсказал Пётр использовать библиотеку Sound. Там есть UseOGGSoundDecoder() Включает поддержку Звука в формате OGG (OGG Vorbis) для CatchSound() иLoadSound().
OGG сжимает не хуже MP3, а может иногда и лучше + формат полностью открытый, можно перекодировать в него любые звуки и музыку бесплатно, например Audacity и разные другие кодировщики.
Поделиться607.07.2021 13:53:30
Петр очень сжато подсказал, мне не хватило инфы для понимания смысла. Однако, спасибо, что добавили информацию, поработаю с ней снова.
Поделиться708.07.2021 12:33:48
Петр очень сжато подсказал
Я написал про функцию загружающую музыку из памяти - CatchSound
В документации на нее есть упоминание на форматы flac и ogg.
Поделиться808.07.2021 15:16:30
я без претензий ) Я просто не внимательно почитал справку. Кстати, на папе форуме тоже отослали к 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)
Поделиться908.07.2021 23:28:53
моя задачка решается так:
Интересно. а почему именно так длинно, а не это? Тут звуковой файл 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)
Поделиться1011.07.2021 06:48:13
ВиниПур, это лишь часть программы, поэтому тут исскусственные исходные условия
Отредактировано Goga (11.07.2021 14:28:45)
Поделиться1111.07.2021 14:29:06
Новая порция проблем ))
Все стало почти хорошо, ogg файлы замечательно из памяти играются, но как узнать "длину" звукого файла и получить текущее положение ползунка проигрывания? Заодно, уметь управлять местоположением этого ползунка ? Вопрос относится только к работе из памяти.
Поделиться1211.07.2021 17:22:15
Новая порция проблем ))
Не зная Вашего замысла и ваших " искусственных исходных условий" пока создаётся впечатление, что вы источник своих проблем.
К примеру #PB_Sound_Streaming. Для чего он вам в программе?
как узнать "длину" звукого файла и получить текущее положение ползунка проигрывания? Заодно, уметь управлять местоположением этого ползунка ? Вопрос относится только к работе из памяти.
Уберите #PB_Sound_Streaming и библиотека "Sound" обеспечивает простой способ узнать длину указанного Звука в миллисекундах, а так же текущую позицию воспроизведения в указанном Звуке.
SoundLength, GetSoundPosition
Поделиться1312.07.2021 06:08:16
ВиниПур, не будьте ко мне строги ) В памяти я хочу раскрывать шифрованные звуковые файлы. Я понимаю, что их можно скопировать из памяти уже декодированными или даже записать тупо на микрофон, но это все же лучше, чем их держать в открытом состоянии, тем более, я собираюсь упаковать в один кодированный файл сразу несколько файлов разных форматов и, возможно, попробовать, вообще не держать локально такой файл.
Вам огромное спасибо за эти подсказки, обучающих примеров использования по PB не густо, поэтому любая помощь для меня очень ценна.
Поделиться1427.07.2021 16:57:51
Пример проигрывания 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)
Поделиться1501.08.2021 15:40:34
Lin, круто, спасибо! Я, правда, все переделал у себя уже на ogg. Однако, это очень полезный материал.
Поделиться1602.08.2021 15:04:12
Я тоже кину пример на api как с отпуска вернусь через неделю.