Software 版 (精华区)
发信人: checcy (老巴夺), 信区: Software
标 题: 也 谈 数 字 视 频 编 程 技 术
发信站: 哈工大紫丁香 (Mon Apr 6 12:11:40 1998), 转信
也 谈 数 字 视 频 编 程 技 术
湖 南 长 水 国 防 科 技 大 学 自 动 控 制 系 研
究 生 队(410073) 李 强
---- 贵 报1997 年11 月17 日 软 件 版 的《 数 字 视 频 编 程 技
术》( 以 下 简 称“ 数 文”) 一 文 详 细 介 绍 了 采 用VB 进
行 视 频 编 程 的 三 种 方 法, 读 后 受 益 匪 浅, 唯 觉 该
文 关 于 采 用 多 媒 体 控 件MCI 一 段 还 不 够 深 入, 想 谈
谈 自 己 的 体 会。
---- VB 的 多 媒 体MCI 控 件 集 成 了Windows 系 统 的 多 媒
体 控 制 接 口 — —MCI 的 大 部 分 功 能, 提 供 了 一 个 与
媒 体 播 放 器 相 似 的 按 钮 界 面、 相 关 的 各 种 属 性 和
事 件, 以 及 简 单 的 使 用 方 法。 特 别 是 其hWndDisplay 属
性 允 许 使 用 其 它 控 件( 拥 有hWnd 属 性) 的 窗 口 播 放 视
频 信 息, 使 编 程 人 员 可 以 灵 活 地 设 置 视 频 播 放 窗
口, 因 此 十 分 方 便。 另 外, 它 带 有 帮 助 文 件, 使 编
程 人 员 可 以 很 快 地 熟 悉 其 功 能 和 使 用 方 法, 为VB
编 程 人 员 所 乐 于 采 用。
---- 但 是,MCI 控 件 只 实 现 了MCI 接 口 的 部 分 功 能; 对
于 音 量 控 制、 视 频 播 放 窗 口 的 控 制 和 播 放 速 度 控
制 等 方 面,MCI 控 件 未 提 供 相 应 功 能。 对 于 播 放 进
度 显 示 和 帧 的 任 意 控 制 等 功 能, 需 要 自 己 编 程 实
现。 下 面 我 们 结 合 一 个 例 子 说 明 这 些 问 题。
---- 首 先 创 建 一 个Standard EXE 工 程。 用Form1 作 为 视
频 播 放 控 制 单 元。 在Form1 上 放 置MMControl(MMControl1
)、Slider(Slider1)、CommonDialog(CommonDialog1) 各 一 个,
label 三 个: 分 别 用 于 显 示 媒 体 的 起 始(lblstart)、 结
尾(lblend) 和 当 前 位 置(lblDis), 括 号 中 为 控 件 的 名
字, 下 同。 再 建 立 两 个 菜 单File(mnuFile)
和Display(mnuDisplay):File 下 包 含Open(mnuOpen)
和Exit(mnuExit),Display 下 包 含Time(mnuTime)
和Frame(mnuFrame)。
---- 打 开Form1 的 代 码 窗 口, 输 入 如 下 代 码:
Dim sec As Single
Private Sub Form_Load()
Left=0
Top=0 ’ 窗 体 位 置
End Sub
Private Sub Form_Unload(Cancel As Integer)
MMControl1.Command=“close”
End
End Sub
Private Sub MMControl1_BackClick(Cancel As Integer)
Slider1.Value=MMControl1.Position
End Sub
Private Sub MMControl1_NextClick(Cancel As Integer)
Slider1.Value=MMControl1.Position
End Sub
Private Sub MMControl1_PlayClick(Cancel As Integer)
Slider1.Value=MMControl1.Position
Form2.Show 0
End Sub
Private Sub MMControl1_PrevClick(Cancel As Integer)
Slider1.Value=MMControl1.Position
End Sub
Private Sub MMControl1_StatusUpdate()
Slider1.Max=MMControl1.Length
Slider1.Min=MMControl1.Start
Slider1.Value=MMControl1.Position
If MMControl1.TimeFormat=0 Then
sec=MMControl1.Position /1000 #
lblDis.Caption=see &“ 秒”
lblend.Caption=MMControl1.Length /1000 #
lblstart.Caption=0
Else
lblDis.Caption=MMControl1.Position &“ 帧”
lblstart.Caption=MMControl1.Start
lblend.Caption=MMControl1.Length
End If
End Sub
Private Sub MMControl1_StepClick(Cancel As Integer)
Slider1.Value=MMControl1.Position
End Sub
Private Sub mnuExit_Click()
MMControl1.Command=“close”
End
End Sub
Private Sub mnuFrame_Click()
MMControl1.TimeFormat=3
lblDis.Caption=MMControl1.Position &“ 帧”
lblend.Caption=MMControl1.Length
End Sub
Private Sub mnuOpen_Click()
MMControl1.DeviceType=“avivideo”
MMControl1.hWndDisplay=Form2.Picturel1.hWnd
CommonDialog1.Flags=cdlOFNFileMustExist
Or cdlOFNHideReadOnly
CommonDialog1.Action=1
MMControl1.filename=CommonDialog1.filename
MMControl1.TimeFormat=3
MMControl1.Command=“open”
MMControl1.UpdateInterval=100
MMControl1.To=MMControl1.Start
MMControl1.Command=“seek”
Slider1.Max=MMControl1.Length
Slider1.Min=MMControl1.Start
lblstart.Caption=MMControl1.Start
lblend.Caption=MMControl1.Length
lblDis.Caption=MMControl1.Position &“ 帧”
End Sub
Private Sub mnuTime_Click()
If MMControl1.Mode<>mciModeNotOpen Then
MMControl1.TimeFormat=0
sec=MMControl1.Position /1000 #
lblDis.Caption=sec &“ 秒”
lblstart.Caption=MMControl1.Start
lblend.Caption=MMControl1.Length /1000 #
End lf
End Sub
Private Sub Slider1_Scroll()
If MMControl1.Mode<>mciModeNotOpen Then
MMControl1.To=Slider1.Value
MMControl1.Command=“seek”
Form2.Show
End If
' 任 意 帧 控 制 功 能, 注 意 此 处 未 用Position 属 性
End Sub
---- 选 择Project|Add Form, 加 入 一 个Form(Form2), 在 其
上 放 置 一 个PictureBox(Picture1), 并 在 其 代 码 窗 口 中
输 入:
Private Sub Form_Load()
Form2.Top=Form1.Height
Form2.Left=0
Form2.Width=Screen.Width
Form2.Height=Screen.Height -400
Picture1.Width=Form2.ScaleWidth
Picturel.Height=Form2.ScaleHeight -400
End Sub.
Private Sub Picture1_MouseDown
(Button As Integer,Shift As Integer, X As Single, Y As Single)
If Button=2 Then PopupMenu Form1.mnuFile
End Sub
Private Sub Form_Unload(Cancel As Integer)
Form1.MMControl1.Command=“close”
Form1.lblstart.Caption=“”
Form1.lblend.Caption=“”
Form1.lblDis.Caption=“”
End Sub
---- 播 放 进 度 显 示 与 任 意 帧 控 制 基 于 同 一 机 制,
它 们 需 要 用 到MCI 控 制 的 几 个 属 性 — —Length、
TimeFormat、Position 和StatusUpdate 事 件。 其 中TimeFormat
定 义 了 视 频 文 件 的 时 间 计 数 方 式, 最 常 用 的 有 两
种 — —mciFormatMilliseconds (=0) 为 以 毫 秒 为 单 位 计
数;mciFormatFrames (=3) 以 帧 为 单 位 计 数。 此 属 性 可
以 在 打 开 具 体 的 媒 体 文 件 前 设 置。Length 定 义 了 媒
体 文 件 的 播 放 时 间 长 度,Position 定 义 了 目 前 播 放
的 位 置, 它 们 与TimeFormat 属 性 紧 密 相 关。 需 要 注 意
的 是,Position 是 只 读 的, 因 此 在 进 行 任 意 帧 控 制 时
不 能 使 用 它。
---- 另 外, 进 度 显 示 在VB 中 一 般 采 用ProgressBar 控
件, 但 由 于 同 时 我 们 要 进 行 任 意 帧 控 制, 因 此 这
里 采 用 了Slider 控 件, 使 其 兼 有 输 入 输 出 功 能。
---- 这 样, 我 们 就 创 建 了 一 个 与mplayer.exe 类 似 的 视
频 媒 体 播 放 器。
--
*********************************
Chengyan Che - Software Freelancer
Harbin, P.R.China
mailto: checcy@public.hr.hl.cn
ICQ: 5116726
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: checcy@public.hr.hl.]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.554毫秒