Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2011, 13:06   #1
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию работа с wav на низком уровне

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

Вот маленький код.
[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 и он после этого не проигрывается. В чём дело?
vsrmis вне форума Ответить с цитированием
Старый 14.01.2011, 13:25   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

код рабочий (с той оговоркой, что он меняет не 4 бита, а переносит 51-ый байт в 46-ой).
WavFilE как объявлена?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 14.01.2011 в 13:38.
veniside вне форума Ответить с цитированием
Старый 14.01.2011, 14:13   #3
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

прошу прощения ха опечатку, да, если изменить 1 байт то звук проирывается, а вот если несколько (больше 4 то не проишрывется) почему?
и кк делать так чтоб проигрывался?
for X := 46 to 50 do WavFilE[x] := WavFilE[x+1]
вот сместил на у байт в право, и уже не пашет
vsrmis вне форума Ответить с цитированием
Старый 14.01.2011, 14:44   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хз, покажите новый код (там, где больше 4 байт) будем посмотреть
важно не залазить на заголовок (первые 44 байта) и не вылазить за конец файла
бывают, конечно, многоблочные вав файлы, там надо парсить RIFF структуру, но это достаточно редко встречается в природе

бывают ещё не PCM файлы, их, конечно, нельзя так курочить
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.01.2011, 15:19   #5
vsrmis
Пользователь
 
Регистрация: 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];
И после этого проигрывается пустота. В чём дело?
Может ошибка логик алгоритма? но куда уж проще этого алгоритма?
vsrmis вне форума Ответить с цитированием
Старый 14.01.2011, 15:25   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

а самом подумать, как такой код будет работать?

Код:
WavFilE[59] := WavFilE[58];
WavFilE[60] := WavFilE[59];
WavFilE[61] := WavFilE[60];
...
весь файл затирается 58-ый байтом.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.01.2011, 15:41   #7
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

Да, моя ошибка алгоритма, стыднодо покраснения. Пойду повторю школьный курс теории алгоритмов. К слову, переделал, действует превосходно, огромное спасибо за помощь. Да ноостаётся непонятным почему можно изменять только с 58 бита? во всех источниках информации о вав фыйлах пишется что с 44...
vsrmis вне форума Ответить с цитированием
Старый 14.01.2011, 16:10   #8
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от vsrmis Посмотреть сообщение
во всех источниках информации о вав фыйлах пишется что с 44...
В каких это "во всех" ??? Читаем :
http://dssp.petrsu.ru/files/tutorial...202/Index3.htm
Получается - с 53-го байта идет собственно звук...

З.Ы. А если учесть вот это :
Код:
TWaveHeader = record
Marker1:        Array[0..3] of Char;
BytesFollowing: LongInt;
Marker2:        Array[0..3] of Char;
Marker3:        Array[0..3] of Char;
Fixed1:         LongInt;
FormatTag:      Word;
Channels:       Word;
SampleRate:     LongInt;
BytesPerSecond: LongInt;
BytesPerSample: Word;
BitsPerSample:  Word;
Marker4:        Array[0..3] of Char;
DataBytes:      LongInt;
end;
то как раз 34+24=58 и получается. (http://www.cyberguru.ru/delphi-sourc...ave-fajla.html)

З.Ы.Ы. Может, вам и это будет интересно :
http://www.delphisources.ru/pages/fa...pile_wave.html

Последний раз редактировалось asmodey1; 14.01.2011 в 16:17.
asmodey1 вне форума Ответить с цитированием
Старый 14.01.2011, 16:11   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Скорей всего, там просто расширенный заголовок. Он может быть расширен за счёт дополнительных данных, которые описывают, что именно и в каком формате хранится в файле. Только заголовок для PCM данных обычно вмещается в 44 байта.

Сдвигаться на 44 байта — это ламерский способ перейти сразу к PCM данным. Прокатывает примерно в 80% случаях.

Вот неплохая ссылка, тут уже пробегала, расписывающая формат RIFF в применении к вав файлам.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.01.2011, 16:30   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от asmodey1 Посмотреть сообщение
http://dssp.petrsu.ru/files/tutorial...202/Index3.htm
Получается - с 53-го байта идет собственно звук...
По ссылке ошибка. После поля fact идёт 4 байта, которые типа означают, сколько реально байт в звуковых семплах. На практике там часто 0.

Но этот дополнительный кусок RIFF, под названием fact, присутствует обычно только в компрессированных файлах.

Цитата:
З.Ы. А если учесть вот это :
А вы померяйте:
sizeof(TWaveHeader) = 44

Цитата:
то как раз 34+24=58 и получается
Неа, все верно, для обычных PCM файлов, коих примерно 80%, семплы начинаются именно с 44 байта.

Если файл не PCM, или создатели файла решили приколоться, там данные вобще где угодно могут начинаться, надо внимательно парсить RIFF.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 14.01.2011 в 16:40. Причина: по-поводу fact немного налажал
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с .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