关于mmc控件播放器的几个问题
我用MMC控件做了个播放器,但有几个问题,调试了好久,一直没有得到满意的结果,大家帮忙看看,有什么好建议!1.我是用picturebox 做为播放窗口的,但在播放WMV文件时,画面总是只占了PICTUREBOX的一部分。但在播放MPEG文件时画面却又受限于PICTUREBOX的大小,PICTUREBOX的AUTOSIZE属性我也设置了,但还是没用
2.播放MPEG文件时无法进行步进操作,但WMV文件却又可以?
3.我想控制视频播放的速度,原理是利用TIMER控件来控制mmc进行步进操作,但实施的结果并不我所预期的,主要的原因应该是视频文件每帧播放的时间设置的不对,我是按照固定每帧播放40ms来计算的,但实际上不是这样的,我的问题我该怎样获取视频正常播放是每秒多少帧?
4.当我执行“停止”时,mmc总是报错,提示mci设备的标示无效,请使用打开mci设备时使用的标示。
5.当播放文件小于100m以下时可以显示图像,但当播放文件较大时(>150m)时就只有声音没有图像?
代码如下:
Public StartTime, EndTime As Long
Public Speed As Long
Public PlayMode As Integer '设定播放模式,1-变速播放,0-正常播放
Public FilePlayFrames As Long
Private Sub ComboAmple_Click() '计算标准工时
If OptOk.Value = True Or OptAss.Value = True Then
If ComboCircle.Text <> "" And ComboRatio.Text <> "" And ComboAmple.Text <> "" Then
TextST.Text = CSng(TextWorkTime.Text) / CSng(ComboCircle.Text) * CSng(ComboRatio.Text) * CSng(ComboAmple.Text)
Else
MsgBox "请先选择循环周期,评价系数,宽放周期!"
End If
End If
End Sub
Private Sub ComboSpeed_Click() '改变播放速度
Speed = CSng(ComboSpeed.Text) * 25 'FilePlayFrames
Timer1.Enabled = True
Timer1.Interval = 40 / CSng(ComboSpeed.Text)
MMControl1.UpdateInterval = 40 / CSng(ComboSpeed.Text)
PlayMode = 1
'MMControl1.Command = "set nowmusic speed " & Speed
'SetSpeed (Speed)
End Sub
Private Sub ComboWalk_Click() '设置步进帧数
MMControl1.Frames = CInt(ComboWalk.Text)
End Sub
Private Sub Command1_Click() '标记开始时间
StartTime = MMControl1.Position
Command1.Enabled = False
End Sub
Private Sub Command2_Click() '标记结束时间
EndTime = MMControl1.Position
TextWorkTime.Text = (EndTime - StartTime) / 1000
TextWorkTime.Enabled = False
MMControl1.Command = "pause"
MMControl1.PauseEnabled = False
Command2.Enabled = False
End Sub
Private Sub Command4_Click()
Dim RefInt, v As Long
Dim FileFrames, Filelength As Long
'On Error GoTo fail
With CommonDialog1
.Filter = "MPEG Video files(*.mpeg;*.mpg;*.mpe)|*.mpeg;*.mpg;*.mpe" + "|Video for Windows files(*.avi)|*.avi" + "|影像文件(*.WMV)|*.wmv"
.ShowOpen
MMControl1.Command = "stop"
MMControl1.Command = "close"
If .FileName <> "" Then
MMControl1.FileName = .FileName
MMControl1.DeviceType = GetDriverID(.FileName)
MMControl1.Command = "open"
' v = mciExecute("open " & .FileName & " alias curFile type MPEGVideo")
If MMControl1.Mode <> 524 Then
Label19.Visible = True
Label19.Caption = .FileName
Slider1.Max = MMControl1.Length
Slider1.SmallChange = 1
Slider1.LargeChange = Slider1.Max / 10
Else
MsgBox "该文件无法播放!"
End If
End If
End With
Exit Sub
'fail:
' Exit Sub
End Sub
Public Function SetSpeed(Speed As Long) As Boolean
Dim RefInt As Long
SetSpeed = False
RefInt = mciSendString("set openfile speed " & Speed, vbNull, 0, 0)
If RefInt = 0 Then SetSpeed = True
MMControl1.Command = "play"
End Function
Private Sub Command5_Click() '正常播放
Timer1.Enabled = False
PlayMode = 0
MMControl1.Command = "play"
MMControl1.UpdateInterval = 1000
ComboSpeed.Text = ""
End Sub
Private Sub Form_Load()
Dim i, j As Integer
With MMControl1
.hWndDisplay = Picture1.hwnd
.Notify = True
.Wait = False
.UpdateInterval = 1000
.TimeFormat = 0
End With
For i = 1 To 15
ComboSpeed.AddItem i / 10, i - 1
ComboRatio.AddItem i / 10, i - 1
ComboAmple.AddItem 1 + i / 100, i - 1
ComboCircle.AddItem i, i - 1
Next
For i = 1 To 25
ComboWalk.AddItem i
Next
Adodc1.ConnectionString = DataConnectString
Adodc1.RecordSource = "select 产品类别 from 产品"
Adodc1.Refresh
Do While Not Adodc1.Recordset.EOF
ComboProduct.AddItem Adodc1.Recordset.Fields(0), 0
Adodc1.Recordset.MoveNext
Loop
TextAnalyser.Text = User
TextDate.Text = Date
TextAnalyser.Enabled = False
TextDate.Enabled = False
Adodc1.RecordSource = "select * from 动素表"
Adodc1.Refresh
j = 0
Do While Not Adodc1.Recordset.EOF
If MSFlexGrid1.Row > 5 Then j = j + 3: MSFlexGrid1.Row = 0
MSFlexGrid1.Col = j
For i = 1 To 3
MSFlexGrid1.Text = Adodc1.Recordset.Fields(i - 1)
MSFlexGrid1.Col = MSFlexGrid1.Col + 1
Next
MSFlexGrid1.Row = MSFlexGrid1.Row + 1
Adodc1.Recordset.MoveNext
Loop
MSFlexGrid1.ColWidth(0) = 400
MSFlexGrid1.ColWidth(3) = 400
MSFlexGrid1.ColWidth(6) = 400
MSFlexGrid1.ColWidth(7) = 1200
PlayMode = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
MMControl1.Command = "stop"
MMControl1.Command = "close"
End Sub
Private Sub MMControl1_BackClick(Cancel As Integer)
With MMControl1
.Command = "back"
End With
End Sub
Private Sub MMControl1_Done(NotifyCode As Integer)
With MMControl1
If .Error <> 0 Then
MsgBox "Error: " & .Error & .ErrorMessage
End If
End With
'Timer1.Enabled = False
End Sub
Private Sub MMControl1_NextClick(Cancel As Integer) '快进
With MMControl1
.Command = "play"
.From = .Position + 1000
End With
End Sub
Public Function GetDriverID(ff As String) As String '获取设备名
Select Case UCase(Right(ff, 3))
'Case "MID", "RMI", "IDI"
'GetDriverID = "Sequencer"
'Case "WAV"
'GetDriverID = "Waveaudio"
Case "WMV"
GetDriverID = ""
Case "AVI"
GetDriverID = "avivideo"
Case "ASF", "ASX", "IVF", "LSF", "LSX", "P2V", "WAX", "WVX", ".WM", "WMA", "WMX", "WMP"
GetDriverID = "MPEGVideo2"
'Case ".RM", "RAM", ".RA"
'GetDriverID = "RealPlayer"
Case Else
GetDriverID = "MPEGVideo"
End Select
End Function
Private Sub MMControl1_PlayClick(Cancel As Integer) '播放
With MMControl1
If .FileName <> "" Then
.Command = "play"
.From = Slider1.Value
Slider1.Max = .Length
Else
MsgBox "没有可供播放的文件!"
End If
End With
End Sub
Private Sub MMControl1_PrevClick(Cancel As Integer) '快退
With MMControl1
.Command = "play"
.From = .Position - 1000
End With
End Sub
Private Sub MMControl1_StatusUpdate()
With MMControl1
If .DeviceID <> 0 Then
Label8.Visible = True
LblCurTime.Caption = .Position / 1000 & " S"
LblTtlTime.Caption = .Length / 1000 & " S"
If Slider1.Value <> .Position Then Slider1.Value = .Position
If Slider1.Value = Slider1.Max Then Slider1.Value = 0: LblCurTime.Caption = 0
End If
End With
End Sub
Private Sub MMControl1_StepClick(Cancel As Integer)
With MMControl1
.Command = "step"
End With
End Sub
Private Sub MMControl1_StopClick(Cancel As Integer)
MMControl1.Command = "stop"
MMControl1.Command = "close"
End Sub
Private Sub Timer1_Timer()
With MMControl1
.Command = "step"
.Command = "Play"
End With
End Sub
--------------------编程问答--------------------
.....
--------------------编程问答-------------------- 我看下哦…… --------------------编程问答-------------------- 谢谢了。 --------------------编程问答-------------------- 使用directshow可以达到你的控制要求,但directshow的使用略为复杂点,但网上可以找到例子源码,稍修改下就行了。
至于播放速率的控制,一般对于mpeg1格式的视频没多在问题,但对于高压缩的格式(比如wmv),就不太理想了,具体情况自己试验一下就知道了。 --------------------编程问答--------------------
补充:VB , 多媒体