Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.045 c
15-1188321073
ArtemESC
2007-08-28 21:11
2007.09.23
А где сейчас горячие точки?


2-1188472359
kudatsky
2007-08-30 15:12
2007.09.23
Можно-ли ввести данные в TStringGrid в Design Time ?


15-1188136425
Бакук
2007-08-26 17:53
2007.09.23
ODAC 6.10.1.10


15-1187946133
@!!ex
2007-08-24 13:02
2007.09.23
Бумажная библиотека.


1-1184321703
=BuckLr=
2007-07-13 14:15
2007.09.23
Определение граббинга и грабберов экрана





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский