问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VB PICTUREBOX里播放视频的问题

发布网友 发布时间:2022-12-16 17:09

我来回答

4个回答

热心网友 时间:2024-12-05 07:58

VB开发流媒体的播放技术

为了是说明如何在VB中利用ActiveMovie Control type library实现流媒体的播放,下面给出了一个名为VBDemo的项目实现代码,该程序可以以不同的速率来播放wav、avi、mepg等多种格式的多媒体文件,同时显示多媒体文件的长度、播放速率等信息。 在这个项目的窗体上定义一个FILE(名字为mnu_File)的主菜单,它包含OPEN(名字为mnu_FileOpen)和EXIT(名字为mnu_FileExit)子菜单,分别用于打开流媒体文件和退出应用程序;工具条tbControlBar上定义三个按钮,分别为实现流媒体的"播放"、"暂停"、"停止"功能的按钮;名为picVideoWindow的PictureBox控件用来作为播放流媒体视频数据的容器;slBanlance和slVolume两个Slider控件分别用来*体流的声音大小和平衡度,它们的最大最小值分别为(-10000,0)和(-5000,5000);在界面的信息栏中,txtDuration和txtBox这两个TextBox控件分别用来显示正在播放的流媒体的时间长度和播放速率;关于播放速率,用户可以通过optplaybackR单选框来选择正常播放、两倍速率播放还是半速播放。程序编译后的界面如下(抱歉,使用考屏的方法无法将播放的图像一同考贝下来):

程序的主要实现思路是在调用了Windows\System下动态链接库Quatrz.dll的基础上,定义一个全局的Object对象m_objMediaControl,令m_objMediaControl指向FilgraphManager的一个新实例,调用它的RenderFile函数装载需要播放的流媒体文件,然后使用Run等函数就可以实现各种播放功能了;为了将流媒体的语音效果准确的显示出来,需要再定义一个IbasicAudio音频对象m_objBasicAudio,用来提取流媒体的音频数据并控制语音的大小,IMediaPosition 对象m_objMediaPosition是用来为多媒体文件定位的。最后显示流媒体时需要打开一个播放Video的窗口,可以将picVideoWindow的句柄hWnd赋给的m_objVideoWindow的Owner属性 ,这样picVideoWindow就可以显示接收的多媒体数据流了。具体实现代码如下:

******************************************************************
为了处理多媒体流,定义以下全局变量.
*******************************************************************

Option Explicit
Private m_dblRate As Double '多媒体流播放的帧速率,也既是每秒播放的帧数;
Private m_bstrFileName As String '需要播放的流媒体文件名;
Private m_dblRunLength As Double '播放的流媒体的持续时间,单位为秒;
Private m_dblStartPosition As Double '待播放的流媒体文件的初始位置,以秒为单位;
Private m_boolVideoRunning As Boolean '多媒体流正在播放的标志;
Private m_objBasicAudio As IBasicAudio 'Basic 的音频对象,用来处理媒体流中的语音数据;
Private m_objVideoWindow As IVideoWindow '视频窗口对象;
Private m_objFilgraphManager As FilgraphManager '媒体控制对象;
Private m_objMediaPosition As IMediaPosition '媒体位置对象;

********************************************************************************
* 窗体加载时作一些初始化工作
********************************************************************************
Private Sub Form_Load()
On Local Error GoTo ErrLine
optPlaybackRate(1).Value = True '回放速率设置为正常;
frmMain.ScaleMode = 3 '窗体的坐标单位设置为像素;
'将工具栏上的所有按钮设置为"无效"
tbControlBar.Buttons("play").Enabled = False
tbControlBar.Buttons("stop").Enabled = False
tbControlBar.Buttons("pause").Enabled = False
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub

***********************************************************************
窗体卸载时清除与多媒体流相关的全局对象;
***********************************************************************
Private Sub Form_Unload(Cancel As Integer)
On Local Error GoTo ErrLine
'停止播放;
m_boolVideoRunning = False
DoEvents
If m_objFilgraphManager <>NULL Then
m_objFilgraphManager.Stop
End If
'清除视频窗口;
If m_objVideoWindow <> NULL Then
m_objVideoWindow.Owner = 0 '设置m_objVideoWindow对象的拥有者为空;
End If
'清除与多媒体流相关的全局对象;
If m_objBasicAudio <> Null Then Set m_objBasicAudio = Nothing
If m_objBasicVideo <> NULL Then Set m_objBasicVideo = Nothing
If m_objFilgraphManager <> NULL Then Set m_objFilgraphManager = Nothing
If m_objVideoWindow <> NULL Then Set m_objVideoWindow = Nothing
If m_objMediaPosition <> NULL Then Set m_objMediaPosition = Nothing
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub

************************************************************************
"退出"菜单响应函数;
**************************************************************************
Private Sub mnu_FileExit_Click()
Dim frm As Form
On Local Error GoTo ErrLine
For Each frm In Forms
frm.Move Screen.Width * 8, Screen.Height * 8
frm.Visible = False: Unload frm
Next
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub

******************************************************************
"文件打开"菜单响应函数;
******************************************************************
Private Sub mnu_FileOpen_Click()
Dim nCount As Long
On Local Error GoTo ErrLine
'清理内存,防止在此之前已经打开过一个文件;
Call Form_Unload(True)
'选择打开的文件类型默认为:mov、avi、mp3、mp2、wav;
ctrlCommonDialog.Filter="MediaFiles (*.mpg;*.avi;*.mov;*.wav;*.mp2;*.mp3)|*.mpg;*.avi;*.mov;*.wav;*.mp2;*.mp3"
ctrlCommonDialog.ShowOpen
m_bstrFileName = ctrlCommonDialog.FileName
'初始化一个滤波器图表
Set m_objFilgraphManager = New FilgraphManager
Call m_objFilgraphManager.RenderFile(m_bstrFileName) '装载流媒体文件;
'设置Basic的音频对象,如语音的大小、平衡度等;
Set m_objBasicAudio = m_objFilgraphManager
m_objBasicAudio.Volume = slVolume.Value
m_objBasicAudio.Balance = slBalance.Value
'设置视频窗口对象,初始化位置后将其父窗口设置为窗口上的PictureBox对象;
Set m_objVideoWindow = m_objFilgraphManager
m_objVideoWindow.WindowStyle = CLng(&H6000000)
m_objVideoWindow.Top = 0
m_objVideoWindow.Left = 0
m_objVideoWindow.Width = picVideoWindow.Width
m_objVideoWindow.Height = picVideoWindow.Height
m_objVideoWindow.Owner = picVideoWindow.hWnd
'设置多媒体位置对象;
Set m_objMediaPosition = m_objFilgraphManager
'根据用户的选择来设置多媒体流的播放速率;
For nCount = optPlaybackRate.LBound To optPlaybackRate.UBound
If optPlaybackRate(nCount).Value = True Then
Select Case nCount
Case 0
If m_objMediaPosition <>NULL Then _
m_objMediaPosition.Rate = 0.5
Case 1
If m_objMediaPosition <>NULL Then _
m_objMediaPosition.Rate = 1
Case 2
If m_objMediaPosition <> NULL Then _
m_objMediaPosition.Rate = 2
End Select
Exit For
End If
Next
m_dblRunLength = Round(m_objMediaPosition.Duration, 2)
txtDuration.Text = CStr(m_dblRunLength)
' 设置当前位置为起始位置;
m_dblStartPosition = 0
' 显示用户选择的多媒体流的播放速率;
m_dblRate = m_objMediaPosition.Rate
txtRate.Text = CStr(m_dblRate)
'设置按钮的默认状态;
tbControlBar.Buttons("play").Enabled = True
tbControlBar.Buttons("stop").Enabled = False
tbControlBar.Buttons("pause").Enabled = False
Call tbControlBar_ButtonClick(tbControlBar.Buttons(1))
ErrLine:
Err.Clear
Resume Next
Exit Sub
End Sub

************************************************************************
用户点击播放速率单选按钮时的响应处理函数;
************************************************************************
Private Sub optPlaybackRate_Click(Index As Integer)
On Local Error GoTo ErrLine
Select Case Index
Case 0
If m_objMediaPosition<> NULL Then _
txtRate.Text = 0.5
Case 1
If m_objMediaPosition<> NULL Then _
txtRate.Text = 1
Case 2
If m_objMediaPosition<> NULL Then _
txtRate.Text = 2
End Select
'重新设置媒体回放的播放速率;
If m_objMediaPosition Then
Select Case Index
Case 0
If m_objMediaPosition <>NULL Then _
m_objMediaPosition.Rate = 0.5
Case 1
If m_objMediaPosition <> NULL Then _
m_objMediaPosition.Rate = 1
Case 2
If m_objMediaPosition <> NULL Then _
m_objMediaPosition.Rate = 2
End Select
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub

**************************************************************************
音频平衡滑动条改变时的响应处理函数;
**************************************************************************
Private Sub slBalance_Change()
On Local Error GoTo ErrLine
'用户使用滑动条来设置语音平衡的值;
If m_objFilgraphManager <> NULL Then _
m_objBasicAudio.Balance = slBalance.Value
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub

***********************************************************************
设置音量大小的滑动条改变时的响应处理函数
***********************************************************************
Private Sub slVolume_Change()
On Local Error GoTo ErrLine
'用户使用滑动条来设置语音的大小;
If m_objFilgraphManager <>NULL Then _
m_objBasicAudio.Volume = slVolume.Value
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub

***************************************************************************
界面上关于多媒体流的"播放"、"暂停"、"停止"等按钮的点击响应函数;
***************************************************************************
Private Sub tbControlBar_ButtonClick(ByVal Button As Button)
On Local Error GoTo ErrLine
If ObjPtr(m_objMediaControl) > 0 Then
If Button.Key = "play" Then '如果用户点击了"播放"按钮;

'如果多媒体的当前位置不处在文件尾部,则对多媒体流的位置重新置位;
If CLng(m_objMediaPosition.CurrentPosition) < CLng(m_dblStartPosition) Then
m_objMediaPosition.CurrentPosition = m_dblStartPosition
ElseIf CLng(m_objMediaPosition.CurrentPosition) = CLng(m_dblRunLength) Then
m_objMediaPosition.CurrentPosition = m_dblStartPosition
End If
Call m_objFilgraphManager.Run
m_boolVideoRunning = True
tbControlBar.Buttons("play").Enabled = False
tbControlBar.Buttons("stop").Enabled = True
tbControlBar.Buttons("pause").Enabled = True
picVideoWindow.Refresh
ElseIf Button.Key = "pause" Then '用户点击了"暂停"按钮;
Call m_objFilgraphManager.Pause
m_boolVideoRunning = False
tbControlBar.Buttons("play").Enabled = True
tbControlBar.Buttons("stop").Enabled = True
tbControlBar.Buttons("pause").Enabled = False
ElseIf Button.Key = "stop" Then '用户点击了"停止"按钮;
Call m_objFilgraphManager.Stop
m_boolVideoRunning = False
' 重新设置视频流的当前播放位置为起始位置;
m_objMediaPosition.CurrentPosition = 0
txtElapsed.Text = "0.0"
tbControlBar.Buttons("play").Enabled = True
tbControlBar.Buttons("stop").Enabled = False
tbControlBar.Buttons("pause").Enabled = False
End If
End If
Exit Sub
ErrLine:
Err.Clear
Exit Sub
End Sub

参考资料:http://www.yesky.com/244/1730744_1.shtml

热心网友 时间:2024-12-05 07:58

用Label就可以了,不一定要用PictureBox的
,关键是hWnd 句柄
若您要做水印效果,用这种方法是行不通的,因为回调每帧图像都要重绘的!

热心网友 时间:2024-12-05 07:59

Label1.BackStyle = 0 这样label就是透明 的

热心网友 时间:2024-12-05 07:59

用DrawText试试吧。写在PictureBox的Paint事件里.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
茶叶可以放在冰箱里吗茶叶能不能放冰箱 茶叶放冰箱里好吗茶叶放冰箱里好不好 茶叶可以放冰箱保存么 茶叶放冰箱放冷藏好吗 甲、乙两根绳子/,甲绳长63米,乙绳长29米、两根绳子前去同样的长度)剩下... 新华书店在送图书下乡活动中,送去的连环画战50%,余下的是故事书,故事书... 李老师带了300元钱去新华书店为学校图书室买《现代汉语词典》38.50.他... dnf55传承重甲套多少钱 dnf漫游55传承套叫什么名字 Dnf刺客五十五级刷图传承套多少钱?叫什么名字? DNF55级传承皮甲套多少钱,每个部位价格分别是多少,20分 su组件库为啥下载了拖不出来 如何去掉delphi2010的欢迎界面 embarcadero.delphi.10.seattle.rtm.v23.0.20618.2753.lite.v1... 歌词,要关于爱的,短点4行 肉牛养多久可以出栏 养牛一般多长时间出栏 牛养多久才能出栏 显卡3050和3050ti运行AE哪个好? 南京哪家招商星期六上班 求《手比头高》答案,急!!! 读完手比头高这篇阅读后,你有什么感受? 手比头高 相关问题 《手比头高》相关问题回答 手比头高阅读答案原文 月经来的少,怎么回事 mac双系统启动不出选项很久才启动 用光纤看电视怎么设置 家里的光纤已经可以正常使用,怎么通过光纤看电视 华为畅享8刷抖音卡吗 免签和落地签的区别 华为nova9打开火山小视频黑屏怎么办 谁知道香蕉app怎么下载 微乐辅助神器试用在哪 微乐外挂买了说要买会员才能用真的假的 微乐麻将训练营在哪 增值税税控系统购买所购买的设备怎么做帐?? 新鲜芦荟哪个部分不能用 开采耳培训学校赚钱吗 和平家园怎么删除近期登陆设备 和平精英怎么退出外设模式? 中世纪2全面战争 人物修改器 中世纪2全面战争王国一回合建筑9格造兵修改器 求一个中世纪2全面战争的修改器 中世纪2全面战争要一个有用的修改器 中世纪2全面战争修改器 中世纪2全面战争之王国的修改器问题 求中世纪2 1.4修改器 中世纪2全面战争修改器 能用于基于中世纪2的国产mod吗? 中世纪2全面战争steam1.52 人物属性修改器 冬天穿的棉毛衫如何防止领子部位越洗越大