VBNet.Su - Visual Basic .NET. ASP .NET. Framework .NET.
Список форумов
Общий форум

Воспроизведение mp3 из данных в памяти

Быстрый переход:
Общий форум / Visual Basic .NET (Framework x.x) (ссылка)15 декабря 2008 / 08:32
Ігор
Наш человек
ку 47.181654625+

вопросов: 8
советов: 9
ответов: 14
комментариев: 45


Как воспроизвести mp3 из данных в памяти точно так, как и обычные wav-файлы? Знает кто нибудь?

Кратко опишу процесс работы с wave-файлами, добавленными ресурсами в приложение.

Добавляем в каталог проекта файл, например, "sound.png".

Кликаем правой кнопкой мышки по значку проекта к примеру "WindowsApplication1" в "Solution Explorer" ... и добавляем в проект при помощи комманды "Add Existing Item".

А в окне свойств "Properties Window" изменяем свойство "Build Action" этого файла с "Content" на "Embedded Resource".

В vs2005-8 нечто подобное можно проделать при помощи редактора ресурсов.

В vb2002-3 воспроизвести звук встроенного wave-ресурса можно лишь пользуясь WIN32API функцией sndPlaySound

[c]<Flags()> Private Enum PlaySoundFlags
Sync = &H0 ' Синхронное воспроизведение (управление не передается до завершения)
NoDefault = &H2 ' Воспроизведение нестандартного звука
Memory = &H4 ' Воспроизведение звука в памяти
[Loop] = &H8 ' Зацикленное воспроизведение (до следующего вызова функции)
NoStop = &H10 ' Не останавливать звук, если уже воспроизводится
End Enum

' Фукция воспроизведения wave-файлов
Private Declare Auto Function sndPlaySound Lib "winmm.dll" _
(ByVal lpszSoundName As String, ByVal UFlags As Int32) As Int32

Private sound As String ' звук

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim stm As IO.Stream = Me.GetType().Assembly.GetManifestResourceStream(Me.GetType(), "sound.wav")
Dim stmreader As New IO.StreamReader(stm, System.Text.Encoding.Unicode)
sound = stmreader.ReadToEnd()
Call stmreader.Close()
Call sndPlaySound(sound, PlaySoundFlags.NoDefault Or PlaySoundFlags.Sync Or PlaySoundFlags.Memory)
End Sub[/c]

То, что звук в памяти воспроизводится лишь вызовом синхронного воспроизведения можно обойти, воспроизводя звук в отдельном потоке.

В vs2005-2008 звук в памяти можно также воспроизвести при помощи My.Computer.Audio.Play, при этом предусмотрено асинхронное воспроизведение звука в памяти. Однако воспроизводится не строка а байтовый массив.

  1. Private sound() As Byte ' звук
  2.  
  3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4.    Dim stm As IO.Stream = Me.GetType().Assembly.GetManifestResourceStream(Me.GetType(), "sound.wav")
  5.    ReDim sound(stm.Length - 1)
  6.    Call stm.Read(sound, 0, sound.Length)
  7.    Call stm.Close()
  8.    Call My.Computer.Audio.Play(sound, AudioPlayMode.Background)
  9. End Sub


Однако мы ж понимаем прекрасно, - mp3 хоть и не такой качественный звук, зато это экономно.

Может знает кнто нибудь, как вот примерно таким способом воспроизвести mp3.
..и было сказано:
Зачёт: Алексей Немиро
Комментарий #1 (ссылка)15 декабря 2008 / 10:30
Алексей Немиро
Администратор
ку 65.2275660625+

вопросов: 8
советов: 13
ответов: 27
комментариев: 80


Еще можно вот так проиграть wav-ы в VS 2005/2008:
  1. Imports System.IO
  2. Imports System.Media
  3.  
  4. '-----------------------------------------
  5. 'Проиграть wav-файл с диска
  6. Dim objPlayer As New SoundPlayer
  7. objPlayer.SoundLocation = "C:\Alert.wav"
  8. objPlayer.Play()
  9.  
  10. '-----------------------------------------
  11. 'Проиграть wav-файл из ресурсов
  12. Dim objPlayer As New SoundPlayer
  13. objPlayer.Stream = My.Resources.Alert ' Alert - имя ресурса
  14. objPlayer.Play()
Все сказанное админом – истина и обсуждению не подлежит, даже если истина таковой не является.
Кнопки VBNet.Su  ·  Утилиты  ·  Home Page  ·  Kbyte.Ru
--
Не забываем ставить фастаны (быстрые ответы) ;-)

..и было сказано:
Спасибо: Ігор
Комментарий #2 (ссылка)15 декабря 2008 / 10:57
Алексей Немиро
Администратор
ку 65.2275660625+

вопросов: 8
советов: 13
ответов: 27
комментариев: 80


  1. 'проиграть MP3 из файла с использованием Microsoft.DirectX.AudioVideoPlayback (меню Project -> Add Reference..)
  2. Dim mp3 As New Microsoft.DirectX.AudioVideoPlayback.Audio("D:\Auf die Liebe.mp3")
  3. mp3.Play()

Еще один оригинальный способ проиграть MP3, правда не везде работает корректно smile :
  1. Dim MyProcess As New Process
  2. MyProcess.StartInfo.FileName = "D:\Auf die Liebe.mp3"
  3. MyProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
  4. MyProcess.Start()

Еще можно подключить к проекту MediaPlayer: меню Project -> Add Reference -> Browse -> C:\Windows\System32\wmp.dll
  1. Dim wmp As New WMPLib.WindowsMediaPlayerClass()
  2. wmp.currentMedia = wmp.newMedia("D:\Auf die Liebe.mp3")
  3. wmp.controls.play()
Все сказанное админом – истина и обсуждению не подлежит, даже если истина таковой не является.
Кнопки VBNet.Su  ·  Утилиты  ·  Home Page  ·  Kbyte.Ru
--
Не забываем ставить фастаны (быстрые ответы) ;-)

..и было сказано:
Спасибо: Ігор
Комментарий #3 (ссылка)15 декабря 2008 / 13:00
5acredphoenix
Пользователь
ку 2.708994375+

вопросов: 1
советов: 1
ответов: 9
комментариев: 24


Еще один оригинальный способ проиграть MP3, правда не везде работает корректно smile :
  1. Dim MyProcess As New Process
  2. MyProcess.StartInfo.FileName = "D:\Auf die Liebe.mp3"
  3. MyProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
  4. MyProcess.Start()

Из серии «как делать не надо» :)
..и было сказано:
Спасибо: Ігор
Поддерживаю: Алексей Немиро
Комментарий #4 (ссылка)15 декабря 2008 / 13:12
Алексей Немиро
Администратор
ку 65.2275660625+

вопросов: 8
советов: 13
ответов: 27
комментариев: 80


5acredphoenix пишет:
Из серии «как делать не надо» :)

индусы правят миром smile
Все сказанное админом – истина и обсуждению не подлежит, даже если истина таковой не является.
Кнопки VBNet.Su  ·  Утилиты  ·  Home Page  ·  Kbyte.Ru
--
Не забываем ставить фастаны (быстрые ответы) ;-)

..и было сказано:
Спасибо: Ігор
Комментарий #5 (ссылка)16 декабря 2008 / 01:15
Ігор
Наш человек
ку 47.181654625+

вопросов: 8
советов: 9
ответов: 14
комментариев: 45


Ну и все таки. Чтоб прямо в памяти проиграть. Это ж думаю нужны функции для декодирования MP3 в wave. И имея указатель на данные можно получить байтовый массив для воспроизведения.

То размышления вслух. xaxa
Комментарий #6 (ссылка)16 декабря 2008 / 01:29
Ігор
Наш человек
ку 47.181654625+

вопросов: 8
советов: 9
ответов: 14
комментариев: 45


http://www.codeproject.com/KB/audio-video/MP3Compressor.aspx

Нашел пищу для размышления. Использует lame_enc.dll. Кажется в каждой Windows есть.
..и было сказано:
Спасибо: andrey_z5z, Алексей Немиро
Комментарий #7 (ссылка)16 декабря 2008 / 10:45
Rus-Skipper
Пользователь
ку 1.6611328125+

вопросов: 0
советов: 0
ответов: 0
комментариев: 3


http://rus-skipper.narod.ru/raznoe/Stream_MP3.zip
Если кого интересует исходник прогаммы на VB6 для проигрывания МР3 из файла ресурсов.
..и было сказано:
Спасибо: Ігор, Алексей Немиро
Комментарий #8 (ссылка)17 декабря 2008 / 01:31
Ігор
Наш человек
ку 47.181654625+

вопросов: 8
советов: 9
ответов: 14
комментариев: 45


Однако ж, ориентировано дело на "DirectX8 for Visual Basic type library". У меня в Vist'е таковой не оказалось зарегистрировано. ireful
Комментарий #9 (ссылка)17 декабря 2008 / 14:25
Rus-Skipper
Пользователь
ку 1.6611328125+

вопросов: 0
советов: 0
ответов: 0
комментариев: 3


Ігор незнаю зачем такие изыски, может просто извлечь, проиграть и грохнуть если не надо? Типа вот этого?
Кинь на проект две кнопки и добавь файл ресурсов со своим МР3,
  1. Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
  2. Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
  3.  Dim strFile As String
  4. Private Function GetShortName(lName As String) As String 'получаем имя DOS
  5. Dim DosName As String
  6. Dim LenOfDosName As Long
  7.  DosName = Space(256)
  8.          LenOfDosName = GetShortPathName(lName, DosName, 256)
  9.  GetShortName = Left$(DosName, LenOfDosName)
  10. End Function
  11. Private Sub Command1_Click()
  12.     Dim strFileData As String
  13.     strFileData = StrConv(LoadResData(101, "CUSTOM"), vbUnicode)
  14.     strFile = App.Path & "c.mp3"
  15.     Open strFile For Output As #1
  16.     Print #1, strFileData
  17.     Close #1
  18.  mciSendString "Play " & GetShortName(strFile), "", 0, 0 '& " from 0 to 62744"'звук от сих до сих
  19. End Sub
  20. Private Sub Command2_Click()
  21. mciSendString "Stop " & GetShortName(strFile), "", 0, 0
  22. End Sub
  23.  
  24. Private Sub Form_Load()
  25. Command1.Caption = "Извлеките mp3 * из resouce файла, и  запустите  для воспроизведения"
  26. Command2.Caption = "Стоп"
  27. End Sub

..и было сказано:
Спасибо: Ігор
Комментарий #10 (ссылка)17 декабря 2008 / 14:30
Rus-Skipper
Пользователь
ку 1.6611328125+

вопросов: 0
советов: 0
ответов: 0
комментариев: 3


Копировал с блокнота, и вот тут почемуто ошибка нужно так strFile = App.Path & "\1.mp3"
..и было сказано:
Спасибо: Ігор
Комментарий #11 (ссылка)17 декабря 2008 / 15:25
Алексей Немиро
Администратор
ку 65.2275660625+

вопросов: 8
советов: 13
ответов: 27
комментариев: 80


Rus-Skipper пишет:
Ігор незнаю зачем такие изыски, может просто извлечь, проиграть и грохнуть если не надо? Типа вот этого?

это самое простое, что можно сделать в данном случае smile, но из потока интересней, правда похоже придется либо писать много кода, либо использовать левые dll-ки, хотя в случае с mp3 в любом случае придется использовать dll-ки.
Кстати, помню в молодости, еще на VB 6.0, я засовывал wav-ы в ресурсы, сначала обычные wav-ы, а потом делал непростые в Sound Forge, сжимал их разными кодеками, но они все равно оставались wav-ами, и нормально работали. Правда, при отсутствии кодеков, не проигрывались.
Я тогда использовал апишки:
  1.   Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlagMinuts As Integer) As Integer
  2.   Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal hpvDest As Object, ByVal hpvSource As Object, ByVal cbCopy As Integer)


Rus-Skipper пишет:
Копировал с блокнота, и вот тут почемуто ошибка нужно так strFile = App.Path & "\1.mp3"

Опять чудо-магические кавычки в PHP, а я надеялся, что исправил этот глюк black-eye smiles smiles smiles будем лечить..
Все сказанное админом – истина и обсуждению не подлежит, даже если истина таковой не является.
Кнопки VBNet.Su  ·  Утилиты  ·  Home Page  ·  Kbyte.Ru
--
Не забываем ставить фастаны (быстрые ответы) ;-)

..и было сказано:
Спасибо: Ігор
Комментарий #12 (ссылка)18 декабря 2008 / 03:59
Ігор
Наш человек
ку 47.181654625+

вопросов: 8
советов: 9
ответов: 14
комментариев: 45


Rus-Skipper пишет:
Ігор незнаю зачем такие изыски, может просто извлечь, проиграть и грохнуть если не надо? Типа вот этого?
Кинь на проект две кнопки и добавь файл ресурсов со своим МР3,


Алексей Немиро пишет:
но из потока интересней, правда похоже придется либо писать много кода, либо использовать левые dll-ки, хотя в случае с mp3 в любом случае придется использовать dll-ки.


Да. Есть же полюбому в Windows "устойчивые" средства, что б воспроизвести mp3 в пямяти. Устойчивые - стабильней тоесть за "DirectX8 for Visual Basic".

А можно ещё сам DirectX8 добавить в проект ввиде ресурса, и распаковать. xaxa

Я кстати таким образом сейчас делаю программу, ориентированную на работу c "EZTW32.dll". Если нет в System32 - библиотека туда распаковывается при запуске программы. В сжатом виде 21 кб.
Комментарий #13 (ссылка)18 декабря 2008 / 04:55
Алексей Немиро
Администратор
ку 65.2275660625+

вопросов: 8
советов: 13
ответов: 27
комментариев: 80


Ігор пишет:
А можно ещё сам DirectX8 добавить в проект ввиде ресурса, и распаковать.

xaxa

Ігор пишет:
Да. Есть же полюбому в Windows "устойчивые" средства, что б воспроизвести mp3 в пямяти.

Честно говоря, не вижу практической пользы от воспроизведения mp3-шек из ресурсов. Звуковые эффекты можно и в wav хранить, размер конечно будет относительно большой, но это зависит от количества файлов. Фоновую музыку в ресурсы, думаю, пихать не стоит smile
Кстати, можно wav-ы хранить в сжатом виде в ресурсах, и разжимать их при необходимости smile Они довольно хорошо сжимаются. Можно даже это делать в памяти, правда может быть долговато, и память съест быстро smile
Все сказанное админом – истина и обсуждению не подлежит, даже если истина таковой не является.
Кнопки VBNet.Su  ·  Утилиты  ·  Home Page  ·  Kbyte.Ru
--
Не забываем ставить фастаны (быстрые ответы) ;-)

..и было сказано:
Спасибо: Ігор
Комментарий #14 (ссылка)18 декабря 2008 / 06:41
Ігор
Наш человек
ку 47.181654625+

вопросов: 8
советов: 9
ответов: 14
комментариев: 45


Алексей Немиро пишет:
Кстати, можно wav-ы хранить в сжатом виде в ресурсах, и разжимать их при необходимости Они довольно хорошо сжимаются. Можно даже это делать в памяти, правда может быть долговато, и память съест быстро


Кстати. Тоже идея. Нужно попробовать, как они будут сжиматься Deflate методом.
Страницы:    < назад    ·    вперед >
1
Зарегистрируйтесь, чтобы иметь возможность участвовать в жизни форума.