我用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 SubPrivate 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 SubPrivate Sub ComboWalk_Click()       '设置步进帧数
MMControl1.Frames = CInt(ComboWalk.Text)
End SubPrivate Sub Command1_Click()        '标记开始时间
StartTime = MMControl1.Position
Command1.Enabled = False
End SubPrivate Sub Command2_Click()        '标记结束时间
EndTime = MMControl1.Position
TextWorkTime.Text = (EndTime - StartTime) / 1000
TextWorkTime.Enabled = False
MMControl1.Command = "pause"
MMControl1.PauseEnabled = False
Command2.Enabled = False
End SubPrivate 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 SubPublic 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 FunctionPrivate Sub Command5_Click()        '正常播放
Timer1.Enabled = False
PlayMode = 0
MMControl1.Command = "play"
MMControl1.UpdateInterval = 1000
ComboSpeed.Text = ""
End SubPrivate Sub Form_Load()
Dim i, j As Integer
With MMControl1
    .hWndDisplay = Picture1.hwnd
    .Notify = True
    .Wait = False
    .UpdateInterval = 1000
    .TimeFormat = 0
End WithFor 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
NextAdodc1.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 SubPrivate Sub Form_Unload(Cancel As Integer)
MMControl1.Command = "stop"
MMControl1.Command = "close"
End SubPrivate Sub MMControl1_BackClick(Cancel As Integer)
With MMControl1
    .Command = "back"
End With
End SubPrivate Sub MMControl1_Done(NotifyCode As Integer)
With MMControl1
    If .Error <> 0 Then
        MsgBox "Error: " & .Error & .ErrorMessage
    End If
End With
'Timer1.Enabled = False
End SubPrivate Sub MMControl1_NextClick(Cancel As Integer) '快进
With MMControl1
    .Command = "play"
    .From = .Position + 1000
End WithEnd 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 FunctionPrivate 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 SubPrivate Sub MMControl1_PrevClick(Cancel As Integer) '快退
With MMControl1
    .Command = "play"
    .From = .Position - 1000
End With
End SubPrivate 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 SubPrivate Sub MMControl1_StepClick(Cancel As Integer)
With MMControl1
    .Command = "step"
End With
End SubPrivate Sub MMControl1_StopClick(Cancel As Integer)
MMControl1.Command = "stop"
MMControl1.Command = "close"
End SubPrivate Sub Timer1_Timer()
With MMControl1
    .Command = "step"
    .Command = "Play"
End With
End Sub