Форум: "Media";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
ВнизКак затормозить MediaPleer? Найти похожие ветки
← →
Доцент (2006-12-15 01:20) [0]Нужно, чтобы программа проговаривала числа. Звуковые файлы есть, алгоритм сопоставления тоже есть.
Программа прочитав, например, число 1234 должна проиграть 4 звуковых файла.
НО!!! После чтения первого файла и передачи его звуковой карте немедленно читается и передается второй и так далее. Звуковая карта не успевает произнести предыдущий, как получает команду на следующий. В результате слышно только последний: "ЧЕТЫРЕ".
Применение OnTimer очень сложно и заморочисто.
Посоветуйте, как быть???
Наверняка кто-то сталкивался...
Пишите лучше на artigor68@mail.ru, я здесь новенький
← →
Rial © (2006-12-15 01:46) [1]Предложу гадкий способ, но он в данным случае поможет.
Думаю, звук у тебя хранится в WAV формате.
Размет звука каждой цифры наверняка тоже невелик.
Поэтому стоит получить сначала имена файлов,
а затем обеъдинить весь звук в 1 файл формата WAV.
Несжатый звук имеет просто формат, найти
его описание не составит труда.
Затем проигрываем этот 1 файл.
Также для ускорения можно попробовать использовать
звуковые библиотеки типа OpenAL или Bass.
← →
Доцент (2006-12-15 01:57) [2]Совет понял.
Не умею объединять WAV файлы, хотя мысль замечательная.
Мой друг делает это в Visual Basic с помощью какой-то надстройки, которая тормозит программу пока не проиграется первый файл и т.д.,
а предложенный способ мне кажется эффективнее.
Только подскажи, как файлы объединять
← →
Rial © (2006-12-15 03:59) [3]Вот кусок кода, который отвечает за загрузку
звука в формате WAV для использования в OpenAL.
Компилироваться, наверняка, не будет,
но принцип основной понять можно.
Также отсюда можно понять, как устроен WAV файл.
В результате в Data размещаются звуковые данные.
Тебе необходимо вынуть эти данные из всех
звуков по-отдельности и склеить их.
Не забудь подкорректировать заголовок.
Короче говоря, при желании разобраться
этой информации должно хватить.Type
TALSizeI = Cardinal;
TALuByte = Char;
TALuInt = Cardinal;
TALuShort = Word;
TALEnum = Integer;
TALVoid = Pointer;
// Заголовок WAV файла
TWAVFileHdr_Struct = packed record
Id : Array[0..3]of TALuByte;
Size : TALsizei;
Type_ : Array[0..3]of TALuByte;
end;
// Заголовок WAV формата
TWAVFmtHdr_Struct = packed record
Format : TALuShort;
Channels : TALuShort;
SamplesPerSec : TALuInt;
BytesPerSec : TALuInt;
BlockAlign : TALuShort;
BitsPerSample : TALuShort;
end;
// Расширенный заголовок WAV формата
TWAVFmtExHdr_Struct = packed record
Size : TALuShort;
SamplesPerBlock : TALuShort;
end;
// Зацикленность
TLoop = packed record
Identifier : TALuint;
Type_ : TALuInt;
Start : TALuInt;
End_ : TALuInt;
Fraction : TALuInt;
Count : TALuint;
end;
// Заголовок WAV семпла
TWAVSmplHdr_Struct = packed record
Manufacturer : TALuInt;
Product : TALuInt;
SamplePeriod : TALuInt;
Note : TALuInt;
FineTune : TALuInt;
SMPTEFormat : TALuInt;
SMPTEOffest : TALuInt;
Loops : TALuInt;
SamplerData : TALuInt;
Loop : TLoop;
end;
// Заголовок WAV чанка
TWAVChunkHdr_Struct = packed record
Id : Array[0..3] of TALuByte;
Size : TALuInt;
end;
procedure ralLoadWAVMemory(const Stream: TMemoryStream; var Format: TALEnum; var Data: TALvoid;
var Size: TALSizeI; var Freq: TALSizeI; var Loop: TALInt);
var ChunkHdr: TWAVChunkHdr_Struct;
FmtExHdr: TWAVFmtExHdr_Struct;
FileHdr: TWAVFileHdr_Struct;
SmplHdr: TWAVSmplHdr_Struct;
FmtHdr: TWAVFmtHdr_Struct;
begin
Format := AL_FORMAT_MONO16;
Data := nil;
Size := 0;
Freq := 22050;
Loop := AL_FALSE;
if (Stream.Size > 0) then begin
try
if (Stream <> nil) then begin
Stream.Read(FileHdr, SizeOf(TWAVFileHdr_Struct));
FileHdr.Size := ((FileHdr.Size + 1) xor 1) - 4;
while ((FileHdr.Size <> 0) and (Stream.Read(ChunkHdr, SizeOf(TWAVChunkHdr_Struct)) <> 0)) do begin
if (CompareMem(@ChunkHdr.Id, PChar("fmt "), 4)) then begin
Stream.Read(FmtHdr, SizeOf(TWAVFmtHdr_Struct));
if (FmtHdr.Format = $0001) then begin
if (FmtHdr.Channels = 1) then begin
if (FmtHdr.BitsPerSample = 8) then Format := AL_FORMAT_MONO8
else Format := AL_FORMAT_MONO16;
end else
if (FmtHdr.BitsPerSample = 8) then Format := AL_FORMAT_STEREO8
else Format := AL_FORMAT_STEREO16;
Freq := FmtHdr.SamplesPerSec;
Stream.Seek(ChunkHdr.Size - SizeOf(TWAVFmtHdr_Struct), soFromCurrent);
end else begin
Stream.Read(FmtExHdr, SizeOf(TWAVFmtExHdr_Struct));
Stream.Seek(ChunkHdr.Size - SizeOf(TWAVFmtHdr_Struct) - SizeOf(TWAVFmtExHdr_Struct), soFromCurrent);
end;
end else
if (CompareMem(@ChunkHdr.Id, PChar("data"), 4)) then begin
if (FmtHdr.Format = $0001) then begin
Size := ChunkHdr.Size;
Data := rmGetMem(Size + $20);
if (Data <> nil) then
Stream.Read(data^, Round(ChunkHdr.Size {/ FmtHdr.BlockAlign}));
FillChar(PByteArray(data)[ChunkHdr.Size], $20, 0);
end else
if (FmtHdr.Format = $0011) then begin //IMA ADPCM
end else
if (FmtHdr.Format = $0055) then begin //MP3 WAVE
end;
end else
if (CompareMem(@ChunkHdr.Id, PChar("smpl"), 4)) then begin
Stream.Read(SmplHdr, sizeof(TWAVSmplHdr_Struct));
if (SmplHdr.Loops <> 0) then Loop := AL_TRUE
else Loop := AL_FALSE;
Stream.Seek(ChunkHdr.Size - sizeof(TWAVSmplHdr_Struct), soFromCurrent);
end else
Stream.Seek(ChunkHdr.Size, soFromCurrent);
Stream.Seek(ChunkHdr.Size and 1, soFromCurrent);
FileHdr.Size := FileHdr.Size - (((ChunkHdr.Size + 1) and not 1) + 8);
end;
end;
except
Exit;
end;
end;
end;
← →
Думкин © (2006-12-15 06:56) [4]PlaySound SND_SYNC
← →
Сергей М. © (2006-12-15 15:45) [5]
> Нужно, чтобы программа проговаривала числа
> Посоветуйте, как быть?
Не изобретать велосипед с wav-файлами, а воспользоваться готовым ПО, например, Microsoft Speech Engine
← →
Rial © (2006-12-15 17:35) [6]> [5] Сергей М. © (15.12.06 15:45)
> Не изобретать велосипед с wav-файлами, а воспользоваться
> готовым ПО, например, Microsoft Speech Engine
Ну, а что плохого в том, чтобы самому изобрести велосипед ?
Ведь есть же, хоть и очень небольшая, вероятность, что его
велосипед будет по каким то параметрам лучше.
Как же еще научные открытия делают ? :)
Тем более, опыт, полученный в результате работы
даже над безнадежным проектом все равно может оказаться
бесценным.
Это, конечно, если на все это есть время и возможность.
А, скорее, желание. :)
А жить на всем готовеньком просто не интересно !!
← →
Доцент (2006-12-15 23:43) [7]Согласен с mr.Rial. Спасибо за участие, начну копаться, результат покажу
← →
Думкин © (2006-12-17 19:36) [8]> Сергей М. © (15.12.06 15:45) [5]
Оно хорошо, но с самими энжинами на русском и бесплатно - напряг. По крайней мере, я хорошего не видел.
========
А числа говорить не беда - наговори файлов и используй мое. Только просто наговорить отдельно - эффект не тот. У меня до ноналионов говорит так - лет 7 как писал назад.
← →
Думкин © (2006-12-17 19:38) [9]А если уж очень хочется Медиаплеер - смотри его Нотифай.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c