Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с перемоткой видео и переходами к ключевым кадрам / cuePoint'ам (http://www.flasher.ru/forum/showthread.php?t=193236)

digitorum 24.01.2013 18:31

Проблема с перемоткой видео и переходами к ключевым кадрам / cuePoint'ам
 
Доброго времени суток!

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

Есть самописный видео плеер, нужно сделать так, чтобы можно было перематывать видео на "незабуферизованную" часть.

Как я понял, перемотать видео к конкретной секунде можно только если видео стримится по rtmp://, либо если мы используем FLVPlayback (что не есть правда, или я совсем криворукий (оба варианта звучат не радужно) )

Собственно мой пост содержит 2 вопроса (выделил их подчеркиванием) :)

Так вот. Что я пытаюсь сделать:
* из исходного видео получить flv
* заполнить его cuePoints
* организовать навигацию по ним с помощью FLVPlayback или NETStream

"Фашизм" с точки зрения размера файла, но "вещание" уж очень не хочется организовывать.

Набросал простой батник:
Код AS3:

ffmpeg -i s_input.mp4 -ar 22050 -b:a 32k -b:v 700k -f flv -s 320x240 -r 25 -y i_ffmpeg.flv
copy i_ffmpeg.flv i_flvtool2.flv
flvtool2 -AUtP i_flvtool2.xml i_flvtool2.flv

В i_flvtool2.xml указал 2 точки
Код AS3:

<tags>
    <metatag event="onCuePoint" overwrite="true">
        <name>Cue Point 1</name>
        <timestamp>22000</timestamp>
        <parameters>
            <textinfo>This is some text 1</textinfo>
            <thumb></thumb>
        </parameters>
        <type>navigation</type>
    </metatag>
    <metatag event="onCuePoint" overwrite="true">
        <name>Cue Point 2</name>
        <timestamp>44000</timestamp>
        <parameters>
            <textinfo>This is some text 2</textinfo>
            <thumb></thumb>
        </parameters>
        <type>navigation</type>
    </metatag>
</tags>

oNMetData отдает то, что я хочу видеть:
Код AS3:

Metadata:
        audiosize -> 3001709
        duration -> 673.12
        audiosamplesize -> 16
        lasttimestamp -> 673.08
        datasize -> 61806104
        videosize -> 58777869
        videocodecid -> 2
        metadatadate -> Thu Jan 24 16:59:42 GMT+0400 2013
        metadatacreator -> inlet media FLVTool2 v1.0.6 - "http://www.inlet-media.de/flvtool2" target="_blank">http://www.inlet-media.de/flvtool2
        audiosamplerate -> 22000
        framerate -> 25
        lastkeyframetimestamp -> 672.68
        canSeekToEnd -> false
        hasAudio -> true
        filesize -> 61976517
        stereo -> true
        cuePoints -> ,
        hasMetadata -> true
        hasVideo -> true
        width -> 320
        audiodatarate -> 32.308325904795865
        keyframes -> [object Object]
        height -> 240
        audiocodecid -> 2
        videodatarate -> 696.413632851964
        hasCuePoints -> true
        audiodelay -> 0
        hasKeyframes -> true
CuePoints:
        "Cue Point 1" 22
        "Cue Point 2" 44
Keyframes :
        0
        1
        2
        ...
        1401
        1402

То есть есть и ключевые кадры и cuePoints.

Но, например

Код AS3:

ns.seek(300);

Вместо того, чтобы бросить к ближайшему ключевому кадру, выдаст:
Код AS3:

[NetStatusEvent type="netStatus" bubbles=false cancelable=false eventPhase=2 info=[object Object]]
        level -> error
        code -> NetStream.Seek.InvalidTime
        details -> 8.64

Почему так происходит? Может я что-то не правильно делаю, или у меня возник рассинхрон с пониманием документации?

Если же использовать FLVPlayback, то он ведет себя как-то странно.

Код AS3:

var cuePount = _flvPlayback.findCuePoint("Cue Point 2");
_flvPlayback.seekToNavCuePoint(cuePount.name);

Иногда бросает на 44ю секунду (второй cuePoint), иногда нет.

Из за чего может быть такое поведение?

Буду благодарен за советы!

iflamberg 25.01.2013 14:36

Перемотать видео к куску, который еще не закачан на клиента, можно только если есть сервер, который по запросу "отдай-ка мне видео с секунды N", выдаст файл с этой секунды. Без сервера сколько бы ты ключевых точек в видео не наставил, ничего тебе не поможет. Ключевые точки только облегчают поиск конкретного тайминга и перемотку к нему.

Стримить с перемоткой умеет Flash Media server, wowza, red5. Теперь еще nginx это умеет, я слышал.
Есть еще понятие "pseudostreaming", когда с помощью пхп или модуля веб-сервера организуется система, когда при перемотке, сервер не использует rtmp, а просто на POST/GET запрос клиента "пришли мне с секунды N" отдает новый flv/mp4 файл, который создается из оригинального видео, но с конкретной секунды + стандартного заголовка flv/mp4. Так умеет, например, lighthttpd + flowplayer.

Ну, а дальше гуглите себе решение. Куча постов в блогах и на хабре на ключевые слова red5, nginx video streaming, wowza, pseudo streaming flowplayer и т.д.

При чем здесь компонент FLVPlayback к перемотке видео, я так и не понял.

digitorum 25.01.2013 14:45

ок, спасибо.

Добавлено через 2 минуты
Ввела в заблуждение фраза из документации:
Код AS1/AS2:

Во-первых, при последовательной загрузке можно перейти только к ключевому кадру, поэтому переход происходит к первому ближайшему ключевому кадру к заданному времени. При использовании потокового воспроизведения переход осуществляется точно в указанное время, даже если исходный FLV-файл не имеет ключевых кадров.

То есть я думал, что NetStream может начать читать со смещением, указанным в метадата (про keyframes). Значит зря я так думал =)


Часовой пояс GMT +4, время: 02:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.