Эффект выделения текста и / или изображения, аналогичный синхронизируемому со звуком - PullRequest
0 голосов
/ 25 мая 2009

Я смотрю, как подойти к следующей проблеме:

У нас есть приложение, которое отображает текст с аудио записанным материалом. Для этого мы используем браузерный контроль (Internet Explorer) в Delphi App. Мы отвечаем на события в Delphi-коде, устанавливающем innerHTML для элементов, если нам нужно обновить стиль ...

Теперь запрос заключается в добавлении опции для динамического перемещения курсора или динамического выделения слов, произнесенных в абзаце. Оно не должно совпадать с абсолютно точным произнесенным словом, поэтому нам придется динамически обновлять содержимое позиции выделенного слова на основе какого-либо таймера или чего-то еще (поскольку речь не идет о тексте).

Каким должен быть самый практичный и легкий подход к решению этой проблемы, все ответы очень ценятся.

Спасибо.

1 Ответ

1 голос
/ 25 мая 2009

давайте предположим, что у вас есть текстовый файл с текстом, который нужно отобразить, и аннотированным временем, когда нужно его подсветить (вид файла субтитров, например стандартный текст с временным текстом w3c (http://www.w3.org/AudioVideo/TT/) или SUB - Формат файла фильма с субтитрами, используемый несколькими медиапроигрывателями.

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

type tSubtitle = class
  num : integer;
  prevTime, fromTime : tdatetime;
  toTime, nextTime: tdatetime;
  text: string;
end;

Возможно, вы захотите расширить объект, чтобы он также содержал некоторые атрибуты подсветки.

Тогда вам просто нужно отобразить эти объекты, синхронизированные с таймером.

procedure TForm1.Timer1Timer(Sender: TObject);
var rt : TDateTime;
    done:boolean; 
    si,st,sb:integer; 
    s:string;
begin
  rt:=now-startTime;
  st:=0;
  sb:=subtitles.Count;  // binary search the subtitle for the current time
  repeat
     si:=(st+sb) div 2;
     s:=TSubtitle(subtitles.Objects[si-1]);
     done:= ((t>=s.prevTime) and (t<=s.nextTime));
     if not done then 
     begin
        if t>s.prevTime then st:=si 
        else if t<s.nextTime then sb:=si;
        if st=sb then done:=true;
     end;
  until done;
  // do what you want with s
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...