| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Разбиение звукового файла на несколько частей |
| Автор: agealex 2.6.2009, 10:29 |
| Проект на С# 3.5 на мобильной платформе. Есть: 1. файл со звуком. в котором содержатся все звуки проекта 2. Файл с разбиением в байтах - с какого байта начинается какой участок звука Нужно: Проигрывать звук с определенного байта до определенного байта. Как это сделать? |
| Автор: agealex 3.6.2009, 02:29 | ||
| Пробывал различные варианты но при всех, если использовать SoundPlayer вылетает ошибка при вызове Play();:dash1 вот один из вариантов:
В общем проблема в том что он не может проиграть имеющийся буфер прочитанный из wav файла, буду рад любым вариантам |
| Автор: Экскалупатор 3.6.2009, 07:31 |
| 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(); } |
| Автор: Экскалупатор 3.6.2009, 09:04 |
| хотя это немного не то, при попытке изменить начало позиции для чтения выдает ошибку: The wave header is corrupt. почему не знаю. может кто нить знает? тоже интересует этот вопрос... |
| Автор: Partizan 3.6.2009, 11:16 |
| Экскалупатор, потому что в начале wav- файла должен быть соответствующий формату заголовок... |
| Автор: Экскалупатор 3.6.2009, 11:26 |
| Partizan, это я уже понял. вопрос как все таки сделать что бы можно было проигрывать из любого места. перезаписывать файл? это не выход... нужно наверное как то извлечь заголовок и запихать его в свой поток, но как? |
| Автор: agealex 3.6.2009, 11:43 |
| Да собственно оказалось просто - считываешь заголовок из файла, затем и пишешь его в нужный тебе буфер, затем дозаписываешь при надобности в него нужные тебе данные и меняешь поле отвечающее за размер файла. |
| Автор: agealex 3.6.2009, 12:00 |
| а как сделать плавный переход от одного буфера к другому что бы непрерывно играл? Если я использую 2 буфера? |
| Автор: Экскалупатор 3.6.2009, 12:54 |
| agealex, можно посмотреть что получилось(выложите код, плиз)? |
| Автор: agealex 3.6.2009, 16:35 |
| Там считываешь с начала массива 40 байт - это твой заголовок (весь заголовок занимает 44 байта учти при поправке на считывание,последние 4 байта длинна тела) - сохраняешь его в массив, затем при считывание буффера с нужного места дописываешь к заголовку сначала 4 байта длины будующего тела, а уж потом и само тело - и проигрываешь его, код вечером выложу. |
| Автор: agealex 4.6.2009, 00:44 | ||||
| В коде это выглядит вот так тут кусок класса аудио, осталось разобраться только с последывательным пройгрышем массивов, да всю эту штуку надо запускать либо в потоке либо самое простое - в таймере Если где предожите оптимизировать милости прошу
там оказалось 2 места в которых длина хранится вот кстати структура кому интересно заголовка wav файла (он на С++ - ну какой нашел просто так глянуть)
|
| Автор: Экскалупатор 4.6.2009, 11:02 |
| agealex, спасибо, интересная инфа, но по сути это почти перезапись файла, т.е. мы вырезаем то что нам надо и пере собираем все в новом потоке, но мне кажется должен быть способ попроще, ведь по сути поток байтов из файла не меняется, просто нужно его запускать из разных мест... |
| Автор: agealex 4.6.2009, 18:21 |
| Ну в принцепи можно попробывать, закачать один раз буфер целиком в SoundPlayer.Stream и меняя его позицию запускать в разных частях , и соответственно останавливать по достижению определеннойй позиции, так скорее даже будет быстрее, так как одни из существенных недостатков данного кода к сожалению выяснилось, что является временная задержка порядка 1 - 4х секунд . сегодня попробую потом выложу если получится удачнее. |
| Автор: agealex 4.6.2009, 20:33 | ||
Вот конечная версия, более упрощенная чем преведущие, вроде все лишнее из нее убрал, и исчезли проблемы с ожиданием запуска, размерами буфера и необходимость в пинпонге буферами. Если еще больше можно упростить не стесняйтесь пишите.
|
| Автор: agealex 8.6.2009, 09:41 | ||
| К сожалению при испытаниях выявилась странная закономерность - в независимости от места начала проигрыша , при повторном запуске воспроизводится начинало с начала. Вот окончательная доработанная и протестированная версия: Отличия - весь звуковой файл не записывается целиком в буфер а берутся толь ко нужные куски, как ни странно это исправило проблему неправильного места старта звукового файла, избавило от проблем с работой с большими звуковыми файлами(нехватка памяти) Да и тут еще появился программный регулятор громкости - для комплекта
|
| Автор: agealex 23.6.2009, 00:55 | ||
Честное слово замучила совесть - там не хватает еще функции высвобождения памяти без нее происходит постепенное переполнение памяти
Вызывать при остановке плеера и перед начало нового воспроизведения Да и эта версия имеет ограничения по размеру отрезка воспроизводимого - (все свободное меcто / 2) И данный класс разбиению и пинпонгу буферами не поддается - (Майкрасофт подарило нам секундную задержку перед запуском плеера, и невозможность отследить состояния проигрываемого отрезка). |