Adobe Flash Player 浏览器插件已于2025年1月12日正式停用,这意味着传统的 .swf 文件无法在现代浏览器中直接运行,本教程的目标是:

flash的视频播放器开发教程
(图片来源网络,侵删)
  1. 教学目的:理解 Flash 时代如何构建交互式媒体播放器,掌握 ActionScript 3.0 的核心编程思想(事件、类、时间轴控制等)。
  2. 现代替代方案:学习如何将 Flash 项目导出为 HTML5,使其能在现代浏览器中运行,并使用 WebGL 渲染,实现类似 Flash 的视觉效果。

Flash 视频播放器开发教程

第一部分:项目准备与界面设计

软件与环境

  • 主软件Adobe Animate 2025 (或更高版本),这是目前官方推荐的替代 Flash Professional 的软件。
  • 视频素材:准备一个 .mp4.flv 格式的视频文件,为了最佳兼容性,建议使用 H.264 编码的 MP4 文件。
  • ActionScript 版本:本教程将使用 ActionScript 3.0,它是 Flash 开发的标准,功能更强大,结构更清晰。

创建新文档

  1. 打开 Adobe Animate。
  2. 选择 “文件” > “新建”
  3. 在“常规”选项卡中,选择 “ActionScript 3.0”
  4. 设置舞台尺寸,640x360 像素(一个常见的视频尺寸)。
  5. 点击“创建”。

设计播放器界面

我们将创建一个简单的播放器界面,包含以下元素:

flash的视频播放器开发教程
(图片来源网络,侵删)
  • 视频显示区:一个 MovieClip,用于承载视频。
  • 播放/暂停按钮:一个按钮,用于控制视频播放状态。
  • 进度条:一个 MovieClip,用于显示视频播放进度。
  • 音量控制:一个滑动条,用于控制音量。

步骤:

  1. 视频显示区

    • 在舞台上绘制一个矩形,尺寸为 640x360
    • 选中矩形,按 F8 将其转换为 “影片剪辑” (MovieClip)。
    • 在“属性”面板中,为这个影片剪辑设置一个实例名,videoHolder
  2. 播放/暂停按钮

    • 在舞台上绘制一个圆形或一个播放图标 (▶)。
    • 选中它,按 F8 转换为 “按钮” (Button)。
    • 在“属性”面板中,设置实例名为 playPauseBtn
  3. 进度条

    flash的视频播放器开发教程
    (图片来源网络,侵删)
    • 进度条通常由两部分组成:背景和可拖动的滑块。
    • 背景:绘制一个细长的灰色矩形,640x10 像素。
    • 滑块:绘制一个小圆形或方形,作为进度滑块。
    • 组合:将滑块放在背景的左侧。将背景和滑块全部选中,按 F8 转换为一个“影片剪辑”
    • 在“属性”面板中,为这个影片剪辑设置实例名 progressBar
    • 重要:双击进入 progressBar 的编辑界面,选中滑块,在“属性”面板中设置其实例名为 progressHandle,这是为了让我们能够单独控制滑块。
  4. 音量控制

    • 设计方法与进度条类似,但尺寸更小,一个 100x10 的背景和一个滑块。
    • 将它们组合成一个影片剪辑,实例名设为 volumeBar
    • 进入 volumeBar 编辑界面,为滑块设置实例名 volumeHandle

你的舞台应该看起来像这样:


第二部分:ActionScript 3.0 编程

我们将把所有代码都放在时间轴的第1帧,按下 F9 打开“动作”面板,开始编写代码。

导入必要的类

ActionScript 3.0 使用类来组织功能,我们需要导入与视频和事件相关的类。

// 导入用于处理视频的类
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.media.Video;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.geom.Rectangle;

声明变量

在代码的开头,声明我们将要使用的对象。

// 视频连接和流
var nc:NetConnection;
var ns:NetStream;
// 用于显示视频的Video对象
var video:Video;
// 播放状态
var isPlaying:Boolean = false;
// 视频总时长
var videoDuration:Number = 0;

初始化视频播放器

这是核心部分,我们将在这里连接视频、创建视频流并将其显示在舞台上。

// 1. 创建一个NetConnection对象,用于连接到本地(无服务器)
nc = new NetConnection();
nc.connect(null);
// 2. 创建一个NetStream对象,用于通过nc来传输视频数据
ns = new NetStream(nc);
// 3. 创建一个Video对象,并设置其尺寸
video = new Video();
video.width = 640;
video.height = 360;
// 4. 将Video对象添加到我们之前创建的videoHolder影片剪辑中
videoHolder.addChild(video);
// 5. 将NetStream附加到Video对象上,这样视频才能显示
video.attachNetStream(ns);
// 6. 监听视频的元数据加载完成事件
ns.client = this; // 将当前对象设为client,以便接收onMetaData回调
// 7. 加载视频文件
ns.play("your_video.mp4"); // <-- 将 "your_video.mp4" 替换为你的视频文件名

处理元数据

当视频的元数据(如时长、尺寸等)加载时,会触发 onMetaData 函数,我们需要在时间轴上定义这个函数。

// 定义一个函数来接收元数据
function onMetaData(info:Object):void {
    trace("视频元数据已加载");
    videoDuration = info.duration; // 获取视频总时长
    // 设置进度条的最大宽度(视频宽度)
    progressBar.width = 640;
}

实现播放/暂停功能

playPauseBtn 添加点击事件监听器。

// 为播放/暂停按钮添加点击事件
playPauseBtn.addEventListener(MouseEvent.CLICK, togglePlayPause);
function togglePlayPause(e:MouseEvent):void {
    if (isPlaying) {
        ns.pause(); // 暂停
        playPauseBtn.gotoAndStop(1); // 假设按钮第1帧是播放图标
    } else {
        ns.resume(); // 恢复播放
        playPauseBtn.gotoAndStop(2); // 假设按钮第2帧是暂停图标
    }
    isPlaying = !isPlaying; // 切换状态
}

实现进度条

进度条稍微复杂一些,我们需要一个 enterFrame 事件来持续更新进度,并允许用户拖动滑块。

// 添加一个 enterFrame 事件,用于实时更新进度
stage.addEventListener(Event.ENTER_FRAME, updateProgress);
function updateProgress(e:Event):void {
    if (videoDuration > 0) {
        // 计算当前播放进度百分比
        var percent:Number = ns.time / videoDuration;
        // 根据百分比更新进度条背景的宽度
        progressBar.width = 640 * percent;
    }
}
// 为进度条滑块添加鼠标事件,使其可拖动
var dragBar:Boolean = false;
progressHandle.addEventListener(MouseEvent.MOUSE_DOWN, startDragBar);
stage.addEventListener(MouseEvent.MOUSE_UP, stopDragBar);
function startDragBar(e:MouseEvent):void {
    dragBar = true;
    // 限制拖动范围只在进度条背景的X轴上
    progressHandle.startDrag(false, new Rectangle(0, progressHandle.y, progressBar.width - progressHandle.width, 0));
}
function stopDragBar(e:MouseEvent):void {
    if (dragBar) {
        dragBar = false;
        progressHandle.stopDrag();
        // 计算新的播放位置
        var clickPercent:Number = progressHandle.x / (progressBar.width - progressHandle.width);
        ns.seek(videoDuration * clickPercent);
    }
}

实现音量控制

音量控制的逻辑与进度条非常相似。

// 为音量滑块添加鼠标事件
var dragVolume:Boolean = false;
volumeHandle.addEventListener(MouseEvent.MOUSE_DOWN, startDragVolume);
stage.addEventListener(MouseEvent.MOUSE_UP, stopDragVolume);
function startDragVolume(e:MouseEvent):void {
    dragVolume = true;
    // 限制拖动范围
    volumeHandle.startDrag(false, new Rectangle(0, volumeHandle.y, volumeBar.width - volumeHandle.width, 0));
}
function stopDragVolume(e:MouseEvent):void {
    if (dragVolume) {
        dragVolume = false;
        volumeHandle.stopDrag();
        // 计算新的音量值 (0到1之间)
        var volumePercent:Number = volumeHandle.x / (volumeBar.width - volumeHandle.width);
        ns.soundTransform = new flash.media.SoundTransform(volumePercent);
    }
}

第三部分:测试与导出

在 Animate 中测试

按下 Ctrl + Enter (Windows) 或 Cmd + Enter (Mac) 来测试你的播放器,如果一切顺利,你应该能看到视频播放,并且可以控制播放、暂停和进度。

导出为 HTML5 (现代部署方式)

这是让你的播放器在现代浏览器中运行的关键步骤。

  1. 在 Animate 中,选择 “文件” > “发布设置”
  2. 在弹出的窗口中,确保勾选了 “HTML5 Canvas”
  3. 点击“发布”按钮。

Animate 会在你的项目文件夹中生成一个 index.html 文件和一个 js 文件夹,这个 index.html 文件使用了 WebGL 技术,可以在 Chrome, Firefox, Edge 等现代浏览器中运行,完美复现你的 Flash 动画和交互逻辑。

双击 index.html 文件,你就可以在浏览器中看到你的视频播放器了!


总结与重要提示

  • ActionScript 3.0 是核心:本教程的重点是学习 AS3 的编程思想,包括事件驱动、对象管理和时间轴控制,这些概念在其他编程语言中同样适用。
  • FLV vs MP4:虽然 FLV 是 Flash 的原生视频格式,但 MP4 (H.264) 现在更通用,Animate 对其支持也很好。
  • 性能:在 Animate 中,复杂的图形和动画可能会影响性能,导出为 HTML5 Canvas 后,性能会依赖于用户的浏览器和硬件。
  • 未来:虽然 Flash 技术本身已成为历史,但通过 Animate 导出 HTML5 的方式,你依然可以利用其强大的动画和交互设计能力来为现代网络创作内容,对于视频播放器,HTML5 的 <video> 标签是更原生、更简单的解决方案,但本教程的价值在于学习和复用 Flash 的设计工作流和交互逻辑。