![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 09.12.2010
Сообщений: 26
|
![]()
нужно изменить биты вав файла таким образом чтоб он после этого проигрывался. Конечно проигрывалась аброкодабра , но проигрывалась.
Вот маленький код. [Pascal]begin ZeroMemory(@WAVOFStruct, SizeOf(WAVOFStruct)); hWav := OpenFile(PansiChar(Path), WAVOFStruct, OF_READWRITE); if hWav = HFILE_ERROR then RaiseLastWin32Error; try WavSize := GetFileSize(hWav, nil); SetLength(WAVFile, WavSize); ReadFile(hWav, WAVFile[0], WavSize, BytesRead, nil); for X := 46 to 50 do WavFilE[46] := WavFilE[x+1]; hMod := CreateFile(NewPath, GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0); if hMod = INVALID_HANDLE_VALUE then RaiseLastWin32Error; try WriteFile(hMod, WAVFile[0], WavSize, BytesWrite, nil); finally CloseHandle(hMod); end; finally _lclose(hWav); end; end; end.[/Pascal] Я изменяю сдесь 4 бита, после 46 и он после этого не проигрывается. В чём дело? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
код рабочий (с той оговоркой, что он меняет не 4 бита, а переносит 51-ый байт в 46-ой).
WavFilE как объявлена?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 14.01.2011 в 13:38. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 09.12.2010
Сообщений: 26
|
![]()
прошу прощения ха опечатку, да, если изменить 1 байт то звук проирывается, а вот если несколько (больше 4 то не проишрывется) почему?
и кк делать так чтоб проигрывался? for X := 46 to 50 do WavFilE[x] := WavFilE[x+1] вот сместил на у байт в право, и уже не пашет ![]() |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
хз, покажите новый код (там, где больше 4 байт) будем посмотреть
важно не залазить на заголовок (первые 44 байта) и не вылазить за конец файла бывают, конечно, многоблочные вав файлы, там надо парсить RIFF структуру, но это достаточно редко встречается в природе бывают ещё не PCM файлы, их, конечно, нельзя так курочить
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 09.12.2010
Сообщений: 26
|
![]()
Методом научного тыка обнаружил, что будет проигрыватся если начинать изменять с 58 бита(кто-то обьяснить почему?, ну да ладно это не настолько важно, хотя вобщето важно) ну я изменил так
b:= wAVFILE[58]; for X := 58 to BytesRead-1 do WavFilE[x] := WavFilE[x+1]; Всё норм, проигрывается такое себе шипение. Ну я решил сразу вернут обратно b:= wAVFILE[58]; for X := 58 to BytesRead-1 do WavFilE[x] := WavFilE[x+1]; Wavfile[58]:= b; for X := 59 to BytesRead do WavFilE[x] := WavFilE[x-1]; И после этого проигрывается пустота. В чём дело? Может ошибка логик алгоритма? но куда уж проще этого алгоритма? |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
а самом подумать, как такой код будет работать?
Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 09.12.2010
Сообщений: 26
|
![]()
Да, моя ошибка алгоритма, стыднодо покраснения. Пойду повторю школьный курс теории алгоритмов. К слову, переделал, действует превосходно, огромное спасибо за помощь. Да ноостаётся непонятным почему можно изменять только с 58 бита? во всех источниках информации о вав фыйлах пишется что с 44...
|
![]() |
![]() |
![]() |
#8 |
Подтвердите свой е-майл
Регистрация: 19.12.2010
Сообщений: 808
|
![]()
В каких это "во всех" ??? Читаем :
http://dssp.petrsu.ru/files/tutorial...202/Index3.htm Получается - с 53-го байта идет собственно звук... З.Ы. А если учесть вот это : Код:
З.Ы.Ы. Может, вам и это будет интересно : http://www.delphisources.ru/pages/fa...pile_wave.html Последний раз редактировалось asmodey1; 14.01.2011 в 16:17. |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
Скорей всего, там просто расширенный заголовок. Он может быть расширен за счёт дополнительных данных, которые описывают, что именно и в каком формате хранится в файле. Только заголовок для PCM данных обычно вмещается в 44 байта.
Сдвигаться на 44 байта — это ламерский способ перейти сразу к PCM данным. Прокатывает примерно в 80% случаях. Вот неплохая ссылка, тут уже пробегала, расписывающая формат RIFF в применении к вав файлам.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#10 | |||
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]() Цитата:
Но этот дополнительный кусок RIFF, под названием fact, присутствует обычно только в компрессированных файлах. Цитата:
sizeof(TWaveHeader) = 44 Цитата:
Если файл не PCM, или создатели файла решили приколоться, там данные вобще где угодно могут начинаться, надо внимательно парсить RIFF.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 14.01.2011 в 16:40. Причина: по-поводу fact немного налажал |
|||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с .wav | dampirik | Общие вопросы .NET | 8 | 17.12.2010 00:07 |
Работа с Ethernet на канальном уровне - какую библиотеку использовать? | alex8 | Win Api | 0 | 22.11.2010 22:51 |
МАЛЕНЬКАЯ ПРОБЛЕМКА С ГРАФИКОЙ НА НИЗКОМ УРОВНЕ | Костик++ | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 6 | 17.11.2010 21:00 |
Работа с файлами на низком уровне | JamS007 | Общие вопросы C/C++ | 15 | 26.05.2009 21:17 |
Работа на низком уровне | Prowler | Работа с сетью в Delphi | 2 | 26.12.2006 06:29 |