C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: mcisendstringを使ってのwmv動画のseek


(過去ログ 122 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■73188 / inTopicNo.1)  mcisendstringを使ってのwmv動画のseek
  
□投稿者/ 赤坂太郎 (1回)-(2014/08/26(Tue) 23:43:44)

分類:[VB.NET/VB2005 以降] 

Win8.1+VB2010+.NET Framework4.0を使用しています。

mcisendstringを使って動画を操作するプログラムを作っているのですが、対象の動画がwmv形式だと、動画の最後から50〜100ミリ秒程度の内容がシークで表示できません。
ソースコードは以下の通りです。
(横スクロールバー、ピクチャーボックスを1つずつ、ボタンを2つ貼り付けたフォームにて実行しています。)

Public Class Form1
    Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As IntPtr) As Integer
    Const strAlias As String = "MyVideo"
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Ofd As New OpenFileDialog() 'ファイルダイアログ
        Dim Posi As String = ""

        With Ofd
            .InitialDirectory = My.Application.Info.DirectoryPath
            .Filter = "wmv|*.wmv;"

            If .ShowDialog() = DialogResult.OK Then
                If .FileName <> "" And Dir(.FileName) <> "" Then
                    Call SendString("close " & strAlias)
                    Call SendString("open " & """" & .FileName & """" & " alias " & strAlias & " wait")
                    Call SendString("window " & strAlias & " handle " & CStr(PictureBox1.Handle) & " wait")
                    Call SendString("Set " & strAlias & " time format milliseconds")
                    Call SendString("status " & strAlias & " length", Posi)
                    With HScrollBar1
                        .Maximum = CInt(Val(Posi))
                        .Minimum = 0
                        .Value = 0
                        .LargeChange = 1
                        .SmallChange = 1
                    End With
                End If
            End If

        End With
    End Sub
    Private Function SendString(ByVal cmdString As String, Optional ByRef message As String = "") As Boolean
        message = Space(500)
        Return CBool(mciSendString(cmdString, message, Len(message), PictureBox1.Handle))
    End Function
    Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
        Dim Posi As String = ""
        Call SendString("seek " & strAlias & " to " & HScrollBar1.Value)
        Call SendString("status " & strAlias & " position", Posi)
        Me.Text = CStr(HScrollBar1.Value) & "," & Posi
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Call SendString("play " & strAlias & " from " & CStr(HScrollBar1.Value))
    End Sub
End Class

検証に使用している動画はこちらです。
http://www1.axfc.net/u/3306222/test

動画の最後は映像が白くなるようにしているのですが、スクロールバーを最後まで動かしてもそのシーンが表示されません。
(ただし、ボタン2をクリックして再生すると白くなるシーンが表示されます。)
何か対処法はあるのでしょうか。

引用返信 編集キー/
■73189 / inTopicNo.2)  Re[1]: mcisendstringを使ってのwmv動画のseek
□投稿者/ 通りすがり (7回)-(2014/08/27(Wed) 08:06:31)
Testなデータを見る限りではデータ側にキーフレームが存在していないようです。WindowsのCODECを
使わないVLC Media Playerでは全くシークできません。(シーク自体はできるけどまともに表示され
ない)
試しにテストデータをffmpegでmp4に変換したら普通にホワイト化部分までシークできます。という
ことでプログラムは何も悪くありません。
要するにホワイト部分までデコードするにはその前のフレームの再生が必須なために再生のないシー
ク動作では誤魔化して表示しているためにホワイト化部分は再生されないようです。
引用返信 編集キー/
■73197 / inTopicNo.3)  Re[2]: mcisendstringを使ってのwmv動画のseek
□投稿者/ 赤坂太郎 (2回)-(2014/08/27(Wed) 20:36:20)
勉強になりました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -