![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Ivankult |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
Как склеить 2 wav файла в один?
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
представляешь файлы как массив байтов и с склеиваешь два массива между собой. тут есть запара в том что в wav файле должен быть заголовок. вот тут есть похожая тема.
|
|||
|
||||
Ivankult |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
А стандартных функций в студии разве нет?
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
я стандартных функция для этого не знаю. не работал с этим. но тут ничего сложного, по примерам из той темы можно сделать очень просто, там вроде все объясняется и примеры есть. |
|||
|
||||
Ivankult |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
Денис, если опустить громкость звука и всякую лабуду, нам надо только этот кусок кода:
Теперь вопрос: зачем нам 2 буфера? Тогда порядок действий для склеивания n файлов? Читаем первый, добавляем в очередь заголовок, добавляем к размеру нового файла размер текущего файла. Читаем следующий. потом получившийся массив читаем. Так? Тааак. А теперь вопрос, куда в буфер плеера вставлять заголовки файлов?? Или этого не надо делать? Т.е. можно для заголовка использовать какую-то рандомную строку, а в буфер добавлять содержание файлов и соответсвенно увеличивать длину файла? Это сообщение отредактировал(а) Ivankult - 14.12.2009, 19:15 --------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
|||
|
||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Здравствуйте.
Ivankult Собственно зачем вам их склеивать? Я же вам кинул пример(возможно не самый лучший но всётаки) того как это надо делать. Это сообщение отредактировал(а) KuMa1104 - 14.12.2009, 19:41 -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Ivankult |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
В том то и дело, что не самый лучший. Если склеить буквы слова и воспроизвести файл, то задержки и "тормоза" программы будут в местах пробелов и не будут заметны.+ мне нужна функция записи прочитанного в файл.
Денис, вот я накарябал код, но сомневаюсь что будет работать. Проверять страшно))) А если честно то это е работает. Где ошибки и "косяки"?
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
|||
|
||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Вот поясните это, я не совсем вас понял. Почему вы решили что задержки и тормоза программы будут в местах пробелов и не будут заметны? -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Ivankult |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
Смотрите. Я побуквенно записываю в буфер звуки, потом воспроизвожу и собираю следующее слово, опять воспроизвожу, и т.д. Тогда все осн. команды и соответсвенно издержки, будут в местах пробелов, и пользователь это не заметит(какя разница-пробел будет длится 0,2 сек или 0.,4?)
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
|||
|
||||
KuMa1104 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Я так понял что Вы имеете в виду не буфер звуковой карты, а просто буфер в памяти( т.е. грубо говоря масив баитов)в него вы кидаете данные отдельных слов Слово "Мама" Буфер = М+а+м+а В вашем буфере 4 буквы после вы их воспроизводите. Знаете если вы будете непосредственно подкидывать каждую букву то это даст на мои взгляд большую чуствительность и удобность в управлении.
Хм На сколько я понимаю ваш алгоритм.
Лучше если когда вы програмируете под звуковую карту чтобы она работала в непрерывном режиме. У вас будет работать несколько потоков. 1. В обязанность одного будет входить только подкидывание новых буферов для воспроизведения. 2. В обязанности другого извлекать данные для этих буферов и создовать очередь которая будет воспроизводится первым потоком. Я бы посоветовал вас сделать анологично с алфавитом и пустые буферы для запятои точки пробела, разной длины и тогда просто подкидывать их в звуковую карту. -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
||||
|
|||||
Экскалупатор |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
честно не знаю. может у человека там что то планировалось.
в общем похоже. в результате должно получиться так: заголовок(36 байт) + 4 байта (длина = сумма длин n файлов которые нужно клеить - 40*n байт заголовков из каждого файла) + остальное тело, т.е. содержимое всех файлов(исключая заголовки).
если я ничего не путаю то заголовок плееру не нужен, т.е. заголовок в плеер вставлять не нужно, заголовок нужен треку. т.е. сначала нужно склеить трек, а потом весь его передать в плеер. заголовок можно вырезать например у любого из файлов один раз и больше его не трогать. менять только размер тела и собственно само тело. по поводу пробелов и прочего, я так понимаю что у тебя должен быть трек отвечающий за паузу, т.е. тут надо не вешать приложение на определенное время а просто вставлять нужную паузу в трек. т.е. фактически должен получиться один большой трек, в котором будет находиться все что нужно читать. если планируется читать что то большое("Война и Мир" например) то наверное придется разбивать на куски какого более менее большого размера(пару метров, к примеру) и работать с ними. Добавлено @ 23:27 мне кажется что тут бы все ускорилось, если бы у тебя трек для каждой буквы был одного размера(в байтах) тогда можно было бы сразу подсчитать размер итогового буфера, и потом просто записать в него все что нужно, иначе придется менять размер при добавлении каждой новой буквы, а это чревато большими проблемами. Это сообщение отредактировал(а) Экскалупатор - 14.12.2009, 23:28 |
||||||
|
|||||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
В точку! ![]() Только незабудьте убедиться что у вас в чанках прописана одно итоже, иначе склеите треки с разнои частотой дискретизации, и вместо пауз и пробелов можете получить страшный вопль. Я когдато давно, так случаино сделал, а на калонках была большая громкость.... Всех родных среди ночи перепугал ![]() -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
да это правильно. в идеале, я считаю, надо вообще подготовить треки так что бы они во всем были одинаковы, ну кроме конечно содержания. и надо бы еще учитывать всякие варианты, при которых некоторые буквы не читаются. или читаются не так как пишется. например "йод" как будет читаться? или как читаться будет твердый/мягкий знак? сам знак не читается никогда, но меняет стоящую перед ним букву. потом отдельный вопрос с ударением. я например не знаю как реализовать этот момент. т.е. как программа прочитает слова зАмок и замОк? скорее всего прочитается замок, без ударения вообще, короче нюансов в этой проге намного больше чем можно представить с первого взгляда. тут кстати можно попробовать не по буквам читать а по целым словам. а не "известные" для проги слова читать по буквам. ![]() |
|||
|
||||
Ivankult |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
Я не хотел в эту тему выкладывать свои сооброжения на тему говорилки(для этого есть своя тема) но ладно. Что я делаю:
1. Храню в БД или ресурс файле оцифрованные звуки(размер в байтах и массив байтов) 2.Читаю какую-то часть текста ("("Война и Мир" например) то наверное придется разбивать на куски какого более менее большого размера(пару метров, к примеру) и работать с ними.") и начинаю обрабатывать 3. Читаю в новую строку слово до первого пробела. 4. Обрабатываю слово(собираю трек), если есть такие вещи как мягкий знак или е,ё,я,ю то это обрабатывается тут же. 5.Запускаю трек и на опр. время усыпляю поток(вместо пробела, точки, запятой, двоеточия и т.д.) 6.Очищаю строку слова(то что делал в п.3) 7. Повторяю с п3 до п7. "Только незабудьте убедиться что у вас в чанках прописана одно итоже, иначе склеите треки с разнои частотой дискретизации, и вместо пауз и пробелов можете получить страшный вопль." Не понял о чем речьhttp://forum.vingrad.ru/html/emoticons/pack/dash1.gif Теперь вопрос Денису. "в общем похоже. в результате должно получиться так: заголовок(36 байт) + 4 байта (длина = сумма длин n файлов которые нужно клеить - 40*n байт заголовков из каждого файла) + остальное тело, т.е. содержимое всех файлов(исключая заголовки)." вообще-то, заголовок трека это 40 байт, + 4 байта длина файла(сумма длительности коротких треков),+само тело. Про заголовок спасибо что пояснил. Посмотрите пожалуйста, что я наваял, может где-то что-то можно исправить или оптимизировать --------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
|||
|
||||
Ivankult |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
Вот что я наваял:
класс AudioWAV
а вот код основного тела программы(не ругайтесь на ифы, так читабельнее, а потом ифы заменю на case)
Этот вариант полностью работает, все ошибки устранил Это сообщение отредактировал(а) Ivankult - 15.12.2009, 22:02 --------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
||||
|
|||||
Экскалупатор |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
Ivankult, привет
согласен. немного запутался вчера... по поводу ошибок. в первой говорит что заголовок неверный. перепроверь что ты там создаешь. ниже структура заголовка.
второй говорит что файл занят. т.е. ты открыл поток, прочитал файл, но поток остался открыт, или сборщик мусора его не успел собрать. попробуй обернуть это место в using
теперь самое прикольно. по поводу основного тела(хорошо что потом заменишь на CASE) но я не понял зачем тебе два раза проверять одни и теже буквы? я имею ввиду "а" и "А", это одинаковые буквы только в разном регистре. если сделать перевод всех букв в один регистр например методом String.ToLower, то у тебя сразу отпадет половина блоков if. и еще для меня осталось загадкой зачем проверять по два раза? один раз в методе
а второй в обработчике кнопки. на мой взгляд достаточно и одного раза. хотя это наверняка должен делать класс который клеит звук. но в любом случае не форма которая является интерфейсом пользователя. |
||||||||
|
|||||||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Я бы вам очень советовал пересмотреть ваш алгоритм пока вы ещё не написали много кода. Потом будет очень сложно всё менять. Добавлено через 11 минут и 57 секунд Здравствуй Экскалупатор! Ухс помню я его в ручную заполнял, не весело было. Я код особо не смотрел. А как Ivankult подаёт буферы в звуковую карту. там много кода в том все не читал, видимо
Так вот я так понемаю что SoundPlayer оперирует сразу только одним буфером. Т.е. если в него что то закинули то он это воспроизведёт, потом закидываем что то новое. А можно закидывать прям во время воспроизведения чтоб оно выполнялось без задержек на Player.Stream.Write? -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
GC шайтан-сундук! успеет или нет непонятно, но вот "зоопарк" точно не успеет. Предлагаю все файлы предварительно загрузить в MemoryStream-ы и уже из них читать/переводить позицию на начало. |
|||
|
||||
Экскалупатор |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
Heinzz, а что такое "зоопарк"?
загрузить сразу все конечно можно, но если их там штук 50? да и держать постоянно все это тоже как то не очень. хотя если учесть что там по одной букве...
вроде нельзя. он по идее только один трек воспроизводит. так что надо собирать а потом воспроизводить. |
||||
|
|||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Это плохо. Тогда если автор нехочит мучиться, то возможно деиствительно не стоит стремится к совершенству. Нарезать куски по 1 мин. и после того как кусок проигран тут же подкидывать следующий. Эти минутные треки естественно компоновать в другом потоке и все это синхронизировать. Я думаю что если раз в минуту слушатель будет иметь пол секунды задержки то это не смертельно. -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
||||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
Heinzz, аааа, понятно.))))) да "зоопарк" наверное не успеет. это ты хорошо заметил.
меня больше интересует процесс обработки знаков препинания. особенно те которые меняют интонации. как например будут отличаться вопросительные предложения от повествовательных? если читать по одному слову, а вместо знаков ставить поток в паузу, то это как то странно. |
|||
|
||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Вопрос конечно интересный, как вариант необходимо как то осуществить что то вроде эквалаизера. ИМХО. Там ведь фактически просто происходит усиление отдельнои полосы частот. После этого сделать несколько регулярных выражений для анализа структуры предложений. И в соответствии с этим уже использовать ф-ии эквалаизера. Но думаю что это можно сделать как то попроще. -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 5 Всего: 9 |
"У Вас на улице перевернулся камаз с пряниками?" Вопросительное выражение может иметь ударение на разные слова и смысл вопроса будет меняться. Это уже от контекста зависит. Спрашивающий может уточнять : перевернулся ли именно камаз, с пряниками ли или просто место где перевернулся на улице или в ограде. |
|||
|
||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Класс! Образно и при этом очень наглядно
![]() Это прямо какои то тест Тьюринга получается. Человек из контекста может впринципе легко понять как нужно правильно читать а машина нет (или с большим трудом?). -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
KuMa1104, наверное все такие "нет" ничерта эта машина не поймет, потому что компьютер делает только то что ему скажут и обучат, так что сам он не будет. а как научить? я например даже не представляю, а все что видел из читалок, это в основном тупое чтение отдельных букв(в лучшем случае целых слов).
|
|||
|
||||
KuMa1104 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 541 Регистрация: 16.4.2009 Где: Ростов-на-Дону Репутация: нет Всего: 3 |
Ну наше мышление основано тоже на неких принципах, поэтому часто говорят что наш образ мышления и например японцев отличаеться.
Кроме того сушествуют же самообучаюшиеся программы.Я сейчас запямятовал. помоему неиросеть или как то так называеться я про это гдето краем глаза читал. Суть в том что впринципе автор топика может написать такое приложение которое будет обучатся и когданибудь заговорит настоящим человеческим голосом. После этого автор продаст его и заработае миллионы!!! А после я надеюсь он вспомнит тех скромных форумчан которые стояли у истоков его проекта, и старались помочь кто чем может ![]() -------------------- Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце. Время - штука относительная... а время обеда - ещё более относительная |
|||
|
||||
Ivankult |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 181 Регистрация: 8.9.2008 Репутация: нет Всего: нет |
я все подправил уже давно ,код на первой странице. а про case забыл, извините))
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |