Table of Contents
This chapter describes how to include external media resources (images, audio, animation, and video) into OpenLaszlo applications.
LZX is designed to make it easy for you to integrate media resources into your application
in a flexible and dynamic manner. You can include images, audio, video, and animations
that were created using standard third-party content creation tools.
This chapter describes the media formats that are currently supported as resources to <view>
s in
OpenLaszlo 4.0. It then goes on to describes how to integrate and control
media in your application. It concludes with some
optimization tips.
Note that in addition to media that can be attached as resources to views, streaming audio and video can be played by <videoview>
s. Please see Chapter 39, Audio and Video for a discussion of streaming media.
For a discussion of streaming media, see Chapter 39, Audio and Video.
The list of supported media types varies slightly depending on the target runtime and whether the application is to be deployed SOLO or proxied.
SWF only: The features described in this section only work in applications compiled to SWF. They do not work in applications compiled to other runtimes.
SOLO applications compiled to SWF depend on Flash to load images (whereas the proxied applications get help from the transcoder on the server). This means that SOLO applications are limited to file types supported natively by Flash.
Flash player version 7 it can only load a limited set of jpegs encodings; it cannot do interleaved or progressive jpeg. If you run Flash player 8 it can do more wide range of jpeg encoding. Set the compiler to compile for Flash 8 as a target runtime to get this expanded range of image formats (also PNG and GIF).
DHTML only: The features described in this section only work in applications compiled to DHTML. They do not work in applications compiled to other runtimes.
Browsers do not natively support .swf or audio or video formats. You must transcode them, omit them from your application, or embed a flash player in your application to handle them.
Files in .swf format can be transcoded to .png format for display by the DHTML runtime. OpenLaszlo provides a facility, called
autopng
, for doing this automatically. As a convenience, the server and compiler search for a corresponding png file if a swf file
is referenced in the DHTML runtime. To use this mechanism in your own code, create a png file with the same basename as the
swf file, and place it in the same directory as the swf resource you want it to replace.
Note | |
---|---|
The following discussion applies to audio and video resources attached to |
In order to display swf-formatted audio and video within a DHTML application, you may embedd a swf player in the page. For a discussion of how to do this, see Chapter 35, Browser Integration.
OpenLaszlo 4.0 and above support the following media types:
Depending on target runtime and mode of deployment, different .jpg and .jpeg files are supported. Progressive and interleaved files are not supported for Flash 7 SOLO deployment. See the W3C JPEG JFIF Specification.
Note | |
---|---|
Progressive files are re-encoded in the OpenLaszlo Server. |
All .gif files are supported. See the GIF Spec.
All Portable Network Graphics files (PNG details at W3C information) are supported. This includes PNGs with alpha channels (transparency).
For proxied applications compiled to .swf, support is limited to audio MP3 files with sample-rates of 44.1 kHz, 22.050 kHz, 11.025 kHz, 8.000 kHz and 5.512 kHz.
Flash behaves poorly with mp3s it doesn't like, which makes tracking down problems difficult. If you run into a problem, a good idea would be to find out whether your mp3 plays in a standalone Flash app separate from OpenLaszlo. (You can use the mtasc.org compiler to test this, using Flash's Sound class to load an play your mp3.) If your mp3 works does not work in standalone Flash, hen the problem is not OpenLaszlo.
Mp3s are not natively supported by browsers, so applications that compile to DHTML should make provisions, as described above.
Macromedia Flash (SWF) files. (See Macromedia documentation).
For applications compiled to Flash, support is limited to SWF files that contain stills or animation only. Very limited ActionScript is allowed/supported (see below for more details).
For applications compiled to DHTML, .swf format files are not supported. See above for a workaround.
For up-to-date discussion of supported media and considerations about their deployment in various runtimes, see the OpenLaszlo Wiki.
The <view>
is the most basic viewable
element in an OpenLaszlo application and it is described in the chapter on views.
A view may have a resource attached to it. The
resource represents a piece of media (image, audio, video, or animation) that the
view controls. For images, the view typically displays the image. For
time-based media (audio, video, animation), the view can be used to start, stop, or jump
to a specific frame or time in the media.
For a simple informal introduction to attaching resources to views, see Chapter 8, Introduction to Media and Art Assets. The chapter you're reading now briefly goes over topics covered in that tutorial and then goes into greater depth.
Resources may be declared directly inside a view using the view's resource
attribute:
Example 18.1. Importing a resource
<canvas height="110"> <view resource="../resources/logo.gif"/> </canvas>
Or they may be declared externally as first-class objects themselves:
Example 18.2. Declaring a resource
<canvas height="110"> <resource name="myname" src="../resources/logo.gif"/> <view resource="myname"/> </canvas>
Note that a <resource>
is not itself a view.
Resources do not have x and y positions, or background color,
or any of the 49 or so attributes that views have. A resource that is not attached to a view is essentially invisible to the
application. As explained below, in order to manipulate a resource, you perform actions on the view to which the resource
is attached.
There are a number of view APIs (methods, fields, and events) that can be used to find out about and control a view's resource.
Resource and view size, scaling and stretching:
Resource loading (discussed below):
Animation/video/frames:
Audio:
When a resource is declared externally, it must be given a name. The namespace for resources is
global to the entire application. Resource tags can only be used
as direct children of either the <canvas>
or <library>
tags.
This style of resource inclusion makes it simpler to separate out art assets from code and can make for improved designer/developer interactions.
When you directly import a resource without naming it, as in the first example, the LZX compiler assigns a unique name to that resource.
Behavior when two resources share the same name is undefined. Therefore you should take care to make sure that each resource has a unique and appropriate name.
Laszlo supports the notion of a resource
<frame>
.
A multi-frame resource is a resource that has a single name but refers
to multiple independent pieces of media that are sequenced. Here is
an example of declaring a multi-frame resource:
Example 18.3. Declaring a multi-frame resource
<canvas height="180"> <resource name="myresource"> <frame src="../resources/logo.gif"/> <frame src="../resources/sky.jpg"/> </resource> <simplelayout spacing="5"/> <view id="myview" resource="myresource"/> <view layout="axis: x; spacing: 3"> <text>Frame:</text> <radiogroup> <radiobutton selected="true">1</radiobutton> <radiobutton>2</radiobutton> <handler name="onvalue" args="v"> myview.setResourceNumber(Number(v)); </handler> </radiogroup> </view> </canvas>
You can use a multi-frame resource to construct an animation that moves between frames when you call the LzView.play() method. Conversely, when you import a resource that contains an animation, each frame of the animation automatically becomes a frame in that resource. In other words, art assets that contain multiple frames themselves are multi-frame resources. Just as with multi-frame resources that are constructed in LZX by importing each frame individually, you can control the frame that is currently displayed.
Example 18.4. Importing an animation
<canvas height="220"> <simplelayout spacing="5"/> <resource name="myresource" src="resources/logo.swf"/> <button onclick="me.stop()"> Stop </button> <button onclick="me.play()"> Play </button> <text text="${me.frame + ' out of ' + me.totalframes + ' frame(s)'}"/> <view layout="axis: x; spacing: 4"> <button isdefault="true" text="Set current frame: " onclick="me.setAttribute('frame', Number(tt.text))"/> <edittext id="tt" width="50"/> </view> <view id="me" resource="myresource"/> </canvas>
Multi-frame resources are also useful for structuring the display of a single visual element or component that takes on different appearances:
Example 18.5. Using multi-frame resources
<canvas height="120"> <!-- create the multi-frame resource and give it a name --> <resource name="mybutton_rsrc"> <!-- first frame is the mouseup state of the button --> <frame src="../resources/button-up.png"/> <!-- second frame is the mouseover state of the button --> <frame src="../resources/button-over.png"/> <!-- third frame is the mousedown state of the button --> <frame src="../resources/button-down.png"/> </resource> <!-- attach the resource to a view with mouse events --> <view resource="mybutton_rsrc" onmouseover="setResourceNumber(2)" onmouseout="setResourceNumber(1)" onmousedown="setResourceNumber(3)" onmouseup="setResourceNumber(2)"/> </canvas>
As of OpenLaszlo 3.1, all LZX applications are compiled to Macromedia Flash (SWF) files. With the exception of audio files noted below, SWF files are played by the Flash plugin at a fixed frame rate and all imported animations are played at that frame rate. This frame rate is fixed at 30 frames per second.
In the examples above, we've declaratively tied resources to view. But we haven't expressed anything about when or how the application should pull in the needed resource. We call this resource loading and LZX provides flexibility over how and when the application loads resources. The most important choice is whether a resource should be loaded at compile time or run time.
Resources that are loaded at compile time are included in the application binary and add to the initial download size of the application.
Example 18.6. Including a resource at compile time
<resource name="myname" src="resources/logo.gif"/>
Compile-time resource inclusion is good for
small assets that are fixed for the life-time of the running application.
assets that are needed by all users of an application
Examples of resources that are included at compile time include most of the assets associated with user-interface components.
The LZX compiler may transcode compile-time resources for inclusion in the SWF application; the OpenLaszlo Server caches the results of these transcodes. The compiler checks the last-modified time of all compile-time-included resources to determine if an application needs to be recompiled.
There are two main ways to load resources at run-time. The first is to use
special syntax that is understood by the <view>
's
resource
attribute. If you specify a value for this attribute that
is an HTTP url, the compiler assumes that this resource should be loaded at runtime:
Example 18.7. Loading a resource at runtime
<canvas height="180"> <view resource="http:../resources/logo.gif"/> </canvas>
The second method is to use the LzView.setSource()()
method.
The previous example is equivalent to the following one:
Example 18.8. Loading a resource at runtime via script
<canvas height="180"> <view oninit="this.setSource('http:../resources/logo.gif')"/> </canvas>
Note | |
---|---|
LZX treats HTTP URLs that omit the two slashes |
LzView.setSource()()
provides more control over
the loading of the resource. Using this method, you can:
choose whether or not the server and/or client should cache the resource;
specify a URL that instructs the server to use a specific protocol to fetch the resource;
specify HTTP request headers that should be used when fetching the resource over HTTP.
Note | |
---|---|
This section does not apply to SOLO applications. |
Before sending resources to a running, proxied, OpenLaszlo application, the OpenLaszlo Server first fetches (or proxies) the resource. The server uses the URL for the resource to determine how and where to get the resource. The term back-end is used to refer to the server that is ultimately providing the resource. Depending on your configuration, the back-end can be the OpenLaszlo Server host itself. Or it may be another distinct host.
The OpenLaszlo Server determines the protocol to use to communicate to the back-end based on the URL for the resource. By default, URLs that are to be loaded at runtime, that don't specify the protocol are assumed to be HTTP urls. OpenLaszlo supports communication to back-end hosts (including localhost itself) via the HTTP protocol. Relative HTTP URLs are thus fetched using a localhost HTTP transfer.
By default, in proxied applications, media that is accessed at runtime is cached both in the server and in the client browser. The OpenLaszlo Server uses the standard HTTP If-Modified-Since/Last-Modified caching mechanism specified in the HTTP 1.1 specification.
The OpenLaszlo Server actually maintains two media caches. One cache is used for resources that are requested at runtime. This is simply called the Media Cache. It also maintains a second cache for resources that are compiled into applications called the Compiler Media Cache. In general, the Compiler Media Cache settings only affect the speed of the OpenLaszlo compiler. The settings for the Media Cache can affect server performance. See The Deployer's Guidefor details.
The example below provides a text input area for you to type in urls that you'd like to test. To run the example, copy it into your local environment and compile it:
Example 18.9. Testing runtime resource loading
<canvas height="400"> <font src="helmetr.ttf" name="helvet"/> <simplelayout spacing="3"/> <view> <simplelayout axis="x" spacing="2"/> <text valign="middle">Type url:</text> <edittext width="500" id="url">http:../resources/logo.gif</edittext> </view> <text>(also try resources/logo.swf)</text> <command onselect="butt.doit();" key="['Enter']" active="true"/> <checkbox text="Cache in client" id="ccache"/> <checkbox text="Cache in server" id="scache"/> <button id="butt">Make request <handler name="onclick"> this.doit(); </handler> <method name="doit"> <![CDATA[ status.setText("Requesting: " + url.getText()); // Determine caching from checkboxes var caching = 'none' if (ccache.getValue() & scache.getValue()) { caching = 'both'; } else if (ccache.getValue()) { caching = 'clientonly'; } else if (scache.getValue()) { caching = 'serveronly'; } me.setSource(url.getText(), caching) ; ]]></method> </button> <button onclick="me.stop()"> Stop </button> <button onclick="me.play()"> Play </button> <text text="${me.frame + ' out of ' + me.totalframes + ' frame(s)'}"/> <text multiline="true" width="200" height="100" id="status"/> <view id="me"> <handler name="onload" args="e"> status.setText('loaded: ' + e); </handler> <handler name="onerror" args="e"> status.setText('error: ' + e); </handler> <handler name="ontimeout" args="e"> status.setText('timeout: ' + e); </handler> </view> </canvas>
The <image>
tag has the effect of declaring a view and associating a
resource with it. This is a convenient shorthand that can make your programs easier to read and maintain. Do not confuse
the <image>
with the <img>
. The latter is used to include images inside HTML text and behaves like the <img> tag in HTML.
Copyright © 2002-2007 Laszlo Systems, Inc. All Rights Reserved. Unauthorized use, duplication or distribution is strictly prohibited. This is the proprietary information of Laszlo Systems, Inc. Use is subject to license terms.