Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ffmpeg, flvtool2 и actionscript 3 (http://www.flasher.ru/forum/showthread.php?t=145376)

DenverZ 06.10.2010 04:25

ffmpeg, flvtool2 и actionscript 3
 
Здравствуйте,
сорри если не в тот раздел,

тут вот какая незадача, на сервере хочу сделать онлайн видео
собственно конвертирую видео из wmv в flv вот такой коммандой

Код:

ffmpeg -y -i in.wmv -f flv -s 320x240 -b 700k -acodec libmp3lame -ar 22050 -ab 64k out.flv
далее заношу мета данные

Код:

flvtool2 -UP out.flv
далее сам код actionscript

Код AS3:

package
{
        import flash.display.MovieClip;
        import flash.events.*;
        import flash.media.Video;
        import flash.net.NetConnection;
        import flash.net.NetStream;
 
        public class Player extends MovieClip
        {
                private var nc:NetConnection;
                private var ns:NetStream;
                private var video:Video;
 
                public function Player()
                {
                        video = new Video();
                        addChild(video);
 
                        nc = new NetConnection();
                        nc.connect(null);
 
                        ns = new NetStream(nc);
                        ns.client = {};
                        ns.client.onMetaData = ns_onMetaData;
                        ns.client.onCuePoint = ns_onCuePoint;
                        ns.play("http://site.ru/out.flv");
 
                        video.attachNetStream(ns);
 
                        function ns_onMetaData(item:Object):void {
                                trace("metaData");
                                // Resize video instance.
                                video.width = item.width;
                                video.height = item.height;
                                // Center video instance on Stage.
                                video.x = (stage.stageWidth - video.width) / 2;
                                video.y = (stage.stageHeight - video.height) / 2;
                        }
 
                        function ns_onCuePoint(item:Object):void {
                                trace("cuePoint");
                                trace(item.name + "\t" + item.time);
                        }
                }
        }
}

мое видео крутится с начала и не показываются точки (cuePoint), если загружаю видео, которое было в примерах

Код AS3:

ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv");

то все ок

собственно вопросы, как правильно внести метаданные? надеюсь за помощь тех людей, кто на практике работал(ет) в онлайн видео

спасибо.

P.S. нужно все это для потокового воспроизвидения видео, с возможностью прокрутки не дожидаясь полной загрузки видео.

Добавлено через 2 минуты
забыл добавить, после комманды

Код:

flvtool2 -UP out.flv
выдается статистика

Код:

  audiocodecid: 2
  videodatarate: 702.466944369793
  duration: 595.4
  hasCuePoints: false
  width: 320

собственно как видно, тут hasCuePoints: false вот в этом месте проблема, но как я не пытался изменить параметры, все равно false...

Добавлено через 9 минут
накопал шелл скрипт, может кому пригодится

Код:

#!/bin/bash
#
# /usr/local/bin/cuepoints
#
# Generate an XML file used by FLVTool2 to add cuepoints to a flash file
# The XML file adds a cuepoint every ten seconds, to line up with timestamps
#
# Syntax: cuepoints [<seconds>] [<filename>]
#        cuepoints 1800 cuepoints-1800.xml
#        cuepoints 7200
#        cuepoints
#
# Options for start time and interval could be added
#
# -----------------------------------------------------------------------------

# Add a help screen
if [ "$1" = "-h" -o "$1" = "--help" -o "$1" = "help" ]
 then echo -e "\ncuepoints [<seconds>] [<filename>]"
  echo -e "\tThe cuepoints script creates an XML file used by FLVTool2 to add cuepoints to a flash file"
  echo -e "\nSyntax:"
  echo -e "\tcuepoints \t\t(defaults to 3600 seconds, or one hour, written to cuepoints.xml)"
  echo -e "\tcuepoints 1800 \t\t(create cuepoints for a half-hour file)"
  echo -e "\tcuepoints 1800 cuepoints-1800.xml\t(specify a filename)\n"
  exit
fi

echo -e "\nCreating cuepoints.xml, used by FLVTool2 to add cuepoints to a flash file \
(see \"cuepoints help\" for syntax and options)\n"

# Check for length
if [ "$1" = "" ]
 then LENGTH="3600"
 else LENGTH="$1"
fi

# Check for filename
if [ "$2" = "" ]
 then FIL="cuepoints.xml"
 else FIL="$2"
fi
 
# Write the header
echo "<?xml version=\"1.0\"?>" > $FIL
echo "<tags>" >> $FIL
echo "  <!-- navigation cue points -->" >> $FIL
 
# Write the body
for N in $(seq 0 10 $LENGTH)
do
 NAME="$( echo $(date -d "+$N seconds"\ 00:00:00 +%H:%M:%S) )"
 echo "  <metatag event=\"onCuePoint\">" >> $FIL
 echo "    <name>"$NAME"</name>" >> $FIL
 echo "    <timestamp>"$N"000</timestamp>" >> $FIL
 echo "    <type>navigation</type>" >> $FIL
 echo "  </metatag>" >> $FIL
done
 
# Write the footer
echo "</tags>" >> $FIL
 
echo -e "An XML file specifying $LENGTH timestamps has been written to $FIL\n"

echo -e "To create a flash file with these cuepoints, use \"flvtool2 -AUPt cuepoints.xml input.flv output.flv\"\n"

проверил, с помощью него отлично расставляются точки, работаю дальше!

Добавлено через 14 минут
мде... чет все равно по точкам прыгать не получается
я по выше указанному скрипту создал xml файлик

Код:

./cue.sh 600
собственно после этого

Код:

flvtool2 -AUPt cuepoints.xml in.flv out.flv
код отлично работает в плане, выводит инфу:

Код:

metaData
cuePoint
00:00:00        0
metaData
cuePoint
00:00:10        10
cuePoint
00:00:20        20
cuePoint
00:00:30        30

т.е. точки находит, но стоит сделать например

Код AS3:

                        ns.play("http://site.ru/out.flv");
                        ns.seek(30);

выдает ошибку

Код:

Error #2044: Необработанный NetStatusEvent:. level=error, code=NetStream.Seek.InvalidTime
        at Player()
cuePoint
00:00:00        0
metaData

как быть?

Добавлено через 17 минут
забыл добавить, на сервере стоит бекэндом nginx собранный с --with-http_flv_module
на нужный домен в конфиге nginx прописан flv

Код:

                location ~ \.flv$ {
                        root /home/user/site.ru;
                }


fljot 06.10.2010 12:02

CuePoints не при чём для такой навигации. Вам нужно посмотреть в сторону KeyFrames (должны лежать в MetaData, если конечно энкодер их туда положил). У них есть время и byte offset. При перемотке определяется, скачан ли нужный ключевой кадр, если до то перематывается на его время, иначе грузишь play(file.flv?параметрОткудаНачинать=время). Это всё http pseudo streaming.

Цитата:

Код AS3:

// Resize video instance.
                video.width = item.width;
                video.height = item.height;


и вот так полагаться нельзя, вдруг там нет размеров

DenverZ 06.10.2010 12:38

2fljot поподробней бы, где пример по конвертации посмотреть =) (строку параметров правильную)

насчет item.width, я конвертирую ролики сам, поэтому там размеры есть 100%
но в целом согласен с Вами (брал из примера adobe)

fljot 06.10.2010 13:35

Я полагаю http://tinyurl.com/2bx248m

DenverZ 06.10.2010 13:52

ну я бы не спрашивал, если бы не погуглил :-)
я уже все перерыл... поэтому и написал, именно кто на практике с этим сталкивался помочь....

Добавлено через 2 минуты
для инфы:
-sameq размер выходного flv будет в 4-5 раз больше исходника
-g 1 качество будет ниже плинтуса :-)
более того, это все равно не помогает для перемотки (она просто не работает)

тут как-то иначе надо делать

неужели никто не занимался видео онлайн и главное, смог сделать это грамотно? или жалко поделиться опытом для будущего поколения? :-) дык можно тогда и за деньги...


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

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