![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Проект на С# 3.5 на мобильной платформе.
Есть: 1. файл со звуком. в котором содержатся все звуки проекта 2. Файл с разбиением в байтах - с какого байта начинается какой участок звука Нужно: Проигрывать звук с определенного байта до определенного байта. Как это сделать? |
|||
|
||||
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Пробывал различные варианты но при всех, если использовать SoundPlayer вылетает ошибка при вызове Play();:dash1
вот один из вариантов:
В общем проблема в том что он не может проиграть имеющийся буфер прочитанный из wav файла, буду рад любым вариантам |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
using (FileStream fs = new FileStream(@"C:\WINDOWS\Media\tada.wav", FileMode.Open))
{ byte[] b = new byte[fs.Length]; fs.Read(b, 0, 30000); MemoryStream ms = new MemoryStream(b); System.Media.SoundPlayer sound = new System.Media.SoundPlayer(ms); sound.Play(); } |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
хотя это немного не то, при попытке изменить начало позиции для чтения выдает ошибку: The wave header is corrupt. почему не знаю. может кто нить знает? тоже интересует этот вопрос...
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Экскалупатор, потому что в начале wav- файла должен быть соответствующий формату заголовок...
-------------------- СУВ, Partizan. |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
Partizan, это я уже понял.
вопрос как все таки сделать что бы можно было проигрывать из любого места. перезаписывать файл? это не выход... нужно наверное как то извлечь заголовок и запихать его в свой поток, но как? |
|||
|
||||
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Да собственно оказалось просто - считываешь заголовок из файла, затем и пишешь его в нужный тебе буфер, затем дозаписываешь при надобности в него нужные тебе данные и меняешь поле отвечающее за размер файла.
|
|||
|
||||
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
а как сделать плавный переход от одного буфера к другому что бы непрерывно играл? Если я использую 2 буфера?
|
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
agealex, можно посмотреть что получилось(выложите код, плиз)?
|
|||
|
||||
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Там считываешь с начала массива 40 байт - это твой заголовок (весь заголовок занимает 44 байта учти при поправке на считывание,последние 4 байта длинна тела) - сохраняешь его в массив, затем при считывание буффера с нужного места дописываешь к заголовку сначала 4 байта длины будующего тела, а уж потом и само тело - и проигрываешь его, код вечером выложу.
Это сообщение отредактировал(а) agealex - 3.6.2009, 16:38 |
|||
|
||||
| agealex |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
В коде это выглядит вот так тут кусок класса аудио, осталось разобраться только с последывательным пройгрышем массивов, да всю эту штуку надо запускать либо в потоке либо самое простое - в таймере
Если где предожите оптимизировать милости прошу
там оказалось 2 места в которых длина хранится вот кстати структура кому интересно заголовка wav файла (он на С++ - ну какой нашел просто так глянуть)
Это сообщение отредактировал(а) agealex - 4.6.2009, 01:18 |
||||
|
|||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
agealex, спасибо, интересная инфа, но по сути это почти перезапись файла, т.е. мы вырезаем то что нам надо и пере собираем все в новом потоке, но мне кажется должен быть способ попроще, ведь по сути поток байтов из файла не меняется, просто нужно его запускать из разных мест...
|
|||
|
||||
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Ну в принцепи можно попробывать, закачать один раз буфер целиком в SoundPlayer.Stream и меняя его позицию запускать в разных частях , и соответственно останавливать по достижению определеннойй позиции, так скорее даже будет быстрее, так как одни из существенных недостатков данного кода к сожалению выяснилось, что является временная задержка порядка 1 - 4х секунд . сегодня попробую потом выложу если получится удачнее.
|
|||
|
||||
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
Вот конечная версия, более упрощенная чем преведущие, вроде все лишнее из нее убрал, и исчезли проблемы с ожиданием запуска, размерами буфера и необходимость в пинпонге буферами. Если еще больше можно упростить не стесняйтесь пишите.
Это сообщение отредактировал(а) agealex - 4.6.2009, 20:35 |
|||
|
||||
| agealex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 2.9.2007 Репутация: нет Всего: нет |
К сожалению при испытаниях выявилась странная закономерность - в независимости от места начала проигрыша , при повторном запуске воспроизводится начинало с начала.
Вот окончательная доработанная и протестированная версия: Отличия - весь звуковой файл не записывается целиком в буфер а берутся толь ко нужные куски, как ни странно это исправило проблему неправильного места старта звукового файла, избавило от проблем с работой с большими звуковыми файлами(нехватка памяти) Да и тут еще появился программный регулятор громкости - для комплекта
Это сообщение отредактировал(а) agealex - 8.6.2009, 09:43 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |