PDA

Просмотр полной версии : Механизм отображения субтитров


marat_sa
14.01.2009, 14:36
Здравствуйте, возник вопрос: есть ли что-нибудь во Flex для отображения и синхронизации субтитров или что-нибудь, что облегчит процесс написания своего механизма?

DarkLight
14.01.2009, 14:46
Есть CuePoint-ы для видео, которые можно задать массивом. Соответственно, пишем простой скрипт преобразования файла субтитров в нужный нам формат, и отображаем. Либо генерируем xml из файла субтитров, и расставляем cuepoint-ы на стадии кодирования. Проблема в том, что в в mpeg-видео, которые выглядит намного качественнее, субтитры не встраиваются, а синхронизация происходит по тайперу, что плохо сказывается на ее качестве.

MyXus
14.01.2009, 15:23
1. А что значит "в mpeg-видео субтитры не встраиваются"? А куда встраиваются? В flv?
2. А чем плохо отображение по таймеру? Можно использовать таймер + netStream.time и всё будет точно. В чём беда?
3. На перспективу, есть еще hXMP (ttp://www.adobe.com/devnet/xmp/)
4. Самый волнующий вопрос: а как реализовать мультиязычные субтитры? Все равно ведь XML (вот титлы (http://video.google.com/timedtext?hl=ru&v=fa60Ue2HmuU&ts=1231932101218&type=track&name=PTBR&lang=pt) ютьюба).

marat_sa
14.01.2009, 15:33
Если уже самому делать, то использовать playheadUpdate и синхронизировать по этому времени. Титры хранить в XML в формате, что то типа:

<subtitle text="первый субтитр" time="00:00:00.00" />

Ну это я так думаю)))
Хотелось бы узнать, может кто уже изобрел велосипед?

DarkLight
14.01.2009, 15:33
1. Да, в flv встраиваются cuepoint-ы с произвольными текстовыми данными.
2. Просто меньше точность, чем родной механизм в flv.
4. Завести атрибут в xml, прописать там язык, сложить все субтитры в один xml и отображать нужный язык. Либо несколько xml и грузить нужный. 1ое лучше тем, что в рантайме переключается моментально, но грузяться субтитры для всех языков в этом случае.

Хотелось бы узнать, может кто уже изобрел велосипед?
есть xml-ный формат субтитров - usf. Можно по его спецификации сделать.

marat_sa
14.01.2009, 15:45
Под велосипедом я имел не организацию XML файла, распарсить можно все что угодно, а еще какой-нибудь механизм для субтитров:) Может класс есть какой во флексе?

Это что же получается? На каждый playheadUpdate (по умолчанию, интервал вроде 250 мс) мы должны перебирать в цикле весь массив субтитров и искать между какими временными значениями субтитров он находится и что сейчас показывать? А если субтитров тысячи? О_о

DarkLight
14.01.2009, 16:03
Нет, загрузить субтитры, распарсить и скормить CuePointManager-у

marat_sa
15.01.2009, 08:20
Начал делать - возник вопросик:
содаем экземпляр CuePointManager. В качестве первого параметра в него передается owner:VideoPlayer, а у меня видео проигшрывается через кастмный компонент-плеер на базе VideoDisplay. Этот VideoPlayer должен лежать вроде по адресу mx.controls.videoClasses.VideoPlayer, но у меня в пакете videoClasses только 2 класса CuePointManager и VideoError.
Откуда взять этот класс и как привести VideoDisplay к нему???

MyXus
15.01.2009, 12:27
let me google this for you:
http://blog.goosepoopproductions.com/?tag=cuepointmanager

marat_sa
16.01.2009, 08:59
Спасибо, отличная статья! :)
Но субтитры выводяться (событие CuePointEvent вызывается) только при прохождении "головки" проигрывателя непосредственно "через точку". А как быть в случае перемотки (изменения значения playheadTime)? Надо чтобы выводились субтитры, соответствующие последней ближайшей cuePoint из manager'a. Надо подписывать плеер на rewind и в нем бежать по всем точкам, сравнивая их значение с playheadTime? В таком случае не намного мы упростили поставленную задачу(((

MyXus
16.01.2009, 12:22
ну, я думаю, это задача максимум. Я думаю, никто не обломится, если при ревайнде 3-5 сек будут без субтитров.
А если уж так охота, всегда есть первое решение - XML, распарсеный в индексированный масив операторов show/hide subtitles + playheadUpdate event.

marat_sa
18.01.2009, 15:07
Мда... От чего ушел, к тому и вернулся)))
А по такой ситуации может кто что-нибудь знает, чтоб темы еще одной не создавать спрошу сразу:
Вобщем есть набор flv файлов мелких и нужно чтобы плееру мы даем xml со списком нужных нам файлов, а он их грузил в себя и временная шкала(перемотка) отображала суммарное время проигрывания всех файлов списка, натипа плейлиста. То есть как 1 целый большой файл, но на самом деле состоящий из нескольких мелких. При поиске по временной шкале, он начинал проигрывать соответствующий файл. Нужно в xml-листе этих кусочков прописывать время для каждого, а потом их складывать вручную и задавать плееру?

djyamato
28.09.2010, 01:14
Под велосипедом я имел не организацию XML файла, распарсить можно все что угодно, а еще какой-нибудь механизм для субтитров:) Может класс есть какой во флексе?

Это что же получается? На каждый playheadUpdate (по умолчанию, интервал вроде 250 мс) мы должны перебирать в цикле весь массив субтитров и искать между какими временными значениями субтитров он находится и что сейчас показывать? А если субтитров тысячи? О_о

массив может же быть и таким:

Subtitles["время в секундах"]="мой текст"
Subtitles["время в секундах"]="мой текст 2"


Высчитывать во время воспроизведения секунды - переводить это в строку и далее,
текущее время воспроизведения в секундах у нас же есть


myPlayHeadSeconds // текущее время воспроизведения
var currSecond:String=myPlayHeadSeconds.toString();
if(Subtitles[currSecond]!=undefined){
/// trace(Subtitles[currSecond]); - текущий субтитр
}


Читал тему и вижу никто не сказал про ГАШЕНИЕ субтитры текущей (чел сказал допустим и далее сцена без диалога )
Я заводил пустую субтитру в таком случае

marat_sa
28.09.2010, 10:03
Чувак, ты некропостер)))