【DirectX】 AudioVideoPlayback 中的事件BUG
当访问 Video 中的 Audio 属性时,会造成 Video 的所有事件失效。
经过反汇查看源码,原来在访问Audio属性时,Audio会通过当前Video对象创建一个新实例。
而这个新实例会覆盖掉当前的 Video 对象,因此所有之前注册的事件都会失效。
解决办法,就是利用 Audio 来进行事件注册。
但是要注意的是,必须要访问过一次 Audio,让 Audio 生成实例之后,再进行动态事件的绑定!
同时,不要再使用 Video 的静态绑定了,原先的动态绑定也没关系,因为都会失效,所以不需要取消事件绑定了。
另外:记得一定要用变量来保存Audio对象,否则每次使用 Video.Audio 访问的都是一个新创建的对象!!!
Dim vod As New Video("视频路径")
Dim ado As Audio = vod.Audio '这里Audio会覆盖Video的实例
ado.Volume = - '静音
' 绑定事件
AddHandler ado.Starting, AddressOf vod_Starting
AddHandler ado.Ending, AddressOf vod_Ending
' 绑定容器
vod.Owner = Panel1
vod.Owner.Width = vod.DefaultSize.Width
vod.Owner.Height = vod.DefaultSize.Height
' 开始播放
vod.Play()
附一个完整的安全实例:
Dim vod As Video
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim fp As String
Using op As New OpenFileDialog
If op.ShowDialog = Windows.Forms.DialogResult.Cancel Then
Return
End If
fp = op.FileName
End Using
If vod IsNot Nothing AndAlso vod.Playing Then
vod.Stop()
vod.Dispose()
vod = Nothing
End If
' 尝试第一次视频实例化
Try
vod = New Video(fp)
Catch ex As Exception
MsgBox("视频载入问题")
Return
End Try
Dim ado As Audio = Nothing
' 尝试音频实例化
Try
ado = vod.Audio
ado.Volume = -
' 尝试将事件绑定(采用Audio)
AddHandler ado.Starting, AddressOf vod_Starting
AddHandler ado.Ending, AddressOf vod_Ending
Catch ex As Exception
'MsgBox("音频出错!")
' 音频出错表示视频没有音频,但实例化Audio即会让Video所有事件无效化,因此仍需要重新实例化一个新对象
ado.Dispose()
vod.Dispose()
vod = New Video(fp)
' 尝试将事件绑定(采用Video)
AddHandler vod.Starting, AddressOf vod_Starting
AddHandler vod.Ending, AddressOf vod_Ending
End Try
' 其他设置
vod.Owner = Panel1
vod.Owner.Width = vod.DefaultSize.Width
vod.Owner.Height = vod.DefaultSize.Height
' 播放~
vod.Play()
End Sub
Private Sub vod_Starting(ByVal sender As Object, ByVal e As System.EventArgs)
' 开始播放
End Sub
Private Sub vod_Ending(ByVal sender As Object, ByVal e As System.EventArgs)
vod.CurrentPosition = 0.0 '立刻重播
'vod.Play() '这行无所谓
End Sub
【DirectX】 AudioVideoPlayback 中的事件BUG的更多相关文章
- onbeforeunload与a标签在IE中的冲突bug(转载)
onbeforeunload与a标签在IE中的冲突bug onbeforeunload 是window的一个事件,目前Firefox,IE都支持,主要用来提示用户是否真的要离开该页面,通常在一些比 ...
- React 中阻止事件冒泡的问题
在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- javascript中的事件冒泡和事件捕获
1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...
- jQuery文本框中的事件应用
jQuery文本框中的事件应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- 怎么理解js中的事件委托
怎么理解js中的事件委托 时间 2015-01-15 00:59:59 SegmentFault 原文 http://segmentfault.com/blog/sunchengli/119000 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- 四、jquery中的事件与应用
当用户浏览页面时,浏览器会对页面代码进行解释或编译--这个过程实质上是通过时间来驱动的,即页面在加载时,执行一个Load事件,在这个事件中实现浏览器编译页面代码的过程.时间无论在页面元素本身还是在元素 ...
- ActiveX(二)Js 监听 ActiveX中的事件
在上一篇随笔:ActiveX(一)第一个简单的Demo 中,已经可以实现 js 单向调用 ActiveX 中的方法,在很多情况下ActiveX中的方法的执行时相对耗时.耗性能的.在这样的情况下.Act ...
随机推荐
- Spring ApplicationContext(十)finishRefresh
ApplicationContext(十)finishRefresh Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 经过 ...
- Best Sightseeing Pair LT1014
Given an array A of positive integers, A[i] represents the value of the i-th sightseeing spot, and t ...
- anaconda的源配置的坑
anaconda是一个python的科学计算的包集合,它提供了一个非常好用的包管理器 conda,类似于pip. 为了速度(不仅为了速度,没有清华源你就被墙了,速度为0),我们使用清华源: 在类uni ...
- pc-H5 适配方案
一.介绍 在前端项目页面开发中,尤其是H5页面开发,我们常常要适配各种分辨率的屏幕,才能让用户获得最好的体验效果.pc也是如此,很多页面是一屏,也是要适配各种尺寸的分辨率.这时候我们就需要对各种分辨率 ...
- mybatis3.2初学感悟
新手,学了mybatis框架一周,写点感悟下来. mybatis,是操作数据库,持久层的一个框架,它是对JDBC的封装.看到了这个框架,我突然感受到封装与抽象的力量.也明白了些为什么要分层的原因. 记 ...
- Web Api 2 认证与授权 2
HTTP Message Handler 在 Web Api 2 认证与授权 中讲解了几种实现机制,本篇就详细讲解 Message Handler 的实现方式 关于 Message Handler 在 ...
- mac安装oh my zsh
克隆项目到本地 git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh 2.创建配置文件 cp ~/.oh-my-zsh/ ...
- bootstrap表格参数说明
表格参数: 名称 标签 类型 默认 描述 - data-toggle String ‘table’ 不用写 JavaScript 直接启用表格. classes data-classes String ...
- (13)How to stay calm when you know you'll be stressed
https://www.ted.com/talks/daniel_levitin_how_to_stay_calm_when_you_know_you_ll_be_stressed/transcrip ...
- 在运行bat文件时,报错发生系统错误123,文件名,目录名或卷标语法不正确
报错:发生系统错误123,文件名,目录名或卷标语法不正确 这个错误就相当于你在dos命令行中输入一个命令,报错“不是内部或外部命令,也不是可运行的程序”.此时你可以在系统环境变量中检查是否配置了这个命 ...