actionscript-3 actionscript seek netstream

actionscript 3 - Netstream y step() o seek()?



actionscript-3 (3)

Estoy en un proyecto AS3, reproduciendo un video (H264). Quiero, por algunas razones especiales, ir a un cierto puesto.

a) Lo intento con NetStream.seek (). Ahí solo va a fotogramas clave. En mi configuración actual, esto significa que puedo encontrar una posición cada 1 segundo. (para una mejor resolución, tendría que codificar la película con tantos fotogramas clave como sea posible, también conocido como fotograma o fotograma clave)

  • Definitivamente esta no es mi forma favorita, porque no quiero volver a codificar todos los videos.

b) Lo intento con NetStream.step (). Esto debería darme la oportunidad de avanzar lentamente de cuadro a cuadro. Pero en la documentación dice:

Este método está disponible solo cuando se transmiten datos desde Flash Media Server 3.5.3 o superior y cuando NetStream.inBufferSeek es verdadero.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#step ()

¿Esto significa que no es posible con Air for Desktop? Cuando lo intento, nada funciona.

Alguna sugerencia, como resolver este problema?

Saludos y gracias! Nicolas


El video Flash solo puede avanzarse en segundos a menos que tenga Flash Media Server como servidor de su video. Técnicamente, eso significa que puedes hacer que funcione como está previsto en Air, sin embargo, el video tendría que transmitirse (adobe tonto ...).

Tienes dos opciones:

1) Importe el metraje como un clip de película. Flash IDE tiene un asistente para esto, y si está desarrollando exclusivamente en un entorno que no sea de FlashIDE, puede convertirlo y exportarlo como un recurso externo, como un SWF o SWC. Esto luego se integrará o se cargará en tiempo de ejecución en su aplicación proporcionándole acceso a los métodos paso a paso por cuadro de MovieClip. Esto, sin embargo, viene con algunos problemas de sincronización de audio (iirc). Además, restregar hacia atrás no es un forté de MC.

2) Escribe tu propio objeto de video que carga una secuencia de imagen y muestra cada cuadro en orden. Tendría que configurar sus propias capacidades de sincronización de audio, pero podría ser la solución más directa aparte de FLVComponent o NetStream.


Me he dado cuenta de que el flash player 9 se limpia bien y con suavidad, pero en los jugadores de más de 10 años me sale este problema sin exfoliación.

Mi solución fue limitar la frecuencia de las llamadas a la función de búsqueda a <= 200ms. Este es un fregado fijo, pero es mucho menos suave que el reproductor 9. ¿Quizás por la limitación de "Flash video solo se puede avanzar por segundos"? Usé un temporizador para activar la función que llama a seek () para el video.

private var scrubInterval:Timer = new Timer(200); private function videoScrubberTouch():void { _ns.pause(); var bounds:Rectangle = new Rectangle(0,0,340,0); scrubInterval.addEventListener(TimerEvent.TIMER, scrubTimeline); scrubInterval.start(); videoThumb.startDrag(false, bounds); } private function scrubTimeline(e:TimerEvent):void { var amt:Number = Math.floor((videoThumb.x / 340) * duration); trace("SCRUB duration: "+duration+" videoThumb.x: "+videoThumb.x+" amt "+amt); _ns.seek(amt); }


Verifique este enlace Demo (u obtenga el archivo SWF para probarlo fuera del navegador a través de Flash Player de escritorio).
Nota: Demo requiere FLV con códec de video H.264 y códec de audio AAC o MP3.

El código fuente para eso está aquí: enlace de Github

En la demostración anterior hay búsqueda (basada en bytes) y paso a cuadro. Las funciones que desea estudiar principalmente son:

  • Append_SEEK (cantidad de posición) - Llegará a la posición especificada en bytes y buscará el fotograma clave más cercano disponible.

  • get_frame_TAG - Esto extraerá una etiqueta que contiene un marco de datos. El audio también puede estar en marcos, pero supongamos que tiene solo video. Esa función es su oportunidad de ajustar las marcas de tiempo . Cuando se ejecuta, también agregará la etiqueta (por lo que cada "get_frame_TAG" también es un "paso de cuadro").

Por ejemplo: tienes un video de 25 fps, quieres el tercer fotograma a los 4 segundos en la reproducción ...

1000 milisecs / 25 fps = 40 unidades para cada marca de tiempo.
Así que 4000 ms == 4 segundos + agregue el 40 x tercer fotograma == una marca de tiempo esperada de 4120.

Conseguir ese fotograma significa ... Primero buscar un fotograma clave. Luego, recorra cada cuadro y verifique las marcas de tiempo que representan el cuadro que desea. Si no lo está, cámbielo a la marca de tiempo del fotograma clave más reciente (esto fuerza a Flash a avanzar rápidamente a través de los fotogramas para mantener las cosas sincronizadas, ya que supone que el fotograma [con una marca de tiempo menor a la esperada] debería haberse reproducido antes de ese momento) . Puede ocultar el objeto de video durante este proceso si no le gusta el aspecto del reenvío rápido.