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毫秒