[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/09/25(Sat) 18:24
投稿者名:YAS
Eメール:yasunari@sakai.atnifty.com
URL :
タイトル:
DirectShowでタイムシフト
こんにちは。YASと申します。よろしくお願いします。
VB6.0でDirectShowとVideoControlを使ってDVカメラの画像をタイムシフトして
表示したいのですがうまくいきません。
以下のコードで,ファイルの記録まではうまくいきますが,そのファイルの再生ができません。
ご存知の方がいらっしゃいましたらご教授をお願いいたします。
Option Explicit

Dim mobjMCSink As FilgraphManager
Dim MSVidCtlSrc As MSVidCtl

'一時ファイルに録画する
Private Sub Form_Load()
    Set mobjMCSink = New FilgraphManager
    Dim objFGSink As IGraphBuilder
    Set objFGSink = mobjMCSink
    Dim objSBESink As New MSVidStreamBufferSink
    Call objFGSink.AddFilter(objSBESink.SBESink, "SBESink")
    objSBESink.SinkName = "c:\temp.avi"
    Call RenderOutPin(mobjMCSink, AddFilter(mobjMCSink, "microsoft dv camera and vcr"))
    objSBESink.NameSetLock
    mobjMCSink.Run
End Sub

'一時ファイルを再生する
'参考:hhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/DirectX9_c/directx/htm/usingthestreambufferinscript.asp

Private Sub Command1_Click()
    Set MSVidCtlSrc = New MSVidCtl
    Dim InputDev As IMSVidInputDevice
    Dim objStreamBufferSource As IMSVidInputDevice
    For Each InputDev In MSVidCtlSrc.InputsAvailable("{00000000-0000-0000-0000-000000000000}")
        If InputDev.ClassID = "{AD8E510D-217F-409B-8076-29C5E73B98E8}" Then
            MSVidCtlSrc.InputActive = InputDev
            Set objStreamBufferSource = InputDev
        End If
    Next
    objStreamBufferSource.FileName = "c:\temp.avi"
    MSVidCtlSrc.Run
End Sub

Private Sub Form_Unload(Cancel As Integer)
    mobjMCSink.Stop
    MSVidCtlSrc.Stop
    Set mobjMCSink = Nothing
    Set MSVidCtlSrc = Nothing
End Sub

Private Function AddFilter(objMC As FilgraphManager, strFilterName As String) As IFilterInfo
    Dim objRegFilter As IRegFilterInfo
    Set AddFilter = Nothing
    For Each objRegFilter In objMC.RegFilterCollection
        If LCase(objRegFilter.Name) = LCase(strFilterName) Then
            Call objRegFilter.Filter(AddFilter)
            Exit For
        End If
    Next
    Set objRegFilter = Nothing
End Function

Private Sub RenderOutPin(objMC As FilgraphManager, objFilter As IFilterInfo)
    Dim objPin As IPinInfo
    If objFilter Is Nothing Then Exit Sub
    For Each objPin In objFilter.Pins
        If objPin.Direction = 1 Then
            Call objPin.Render
            Exit For
        End If
    Next
    Set objPin = Nothing
End Sub

投稿時間:2004/09/27(Mon) 13:48
投稿者名:りっとっと
Eメール:
URL :
タイトル:
Re: DirectShowでタイムシフト
カメラ関係(動画関係)はプログラミングしたことがありませんので正しい返答はできませんが、
マイクロソフトのプログラムを見て処理概要を見てみると、
1.ストリームバッファシンクの初期化
2.ストリームバッファソースの初期化
3.ストリームバッファソースの実行
4.ストリームバッファシンクの実行
という流れですよね。
つまり、ストリームバッファソースを実行してできる"C:\Example.wmv"ファイルを
ストリームバッファシンクでコントロールを行うという手順となっております。
ですので、ストリームバッファシンクの実行は、ストリームバッファソースの実行より後
に行わなければならないかと思います。

YASさんのプログラムを見てみますと、Form_Load
    Set mobjMCSink = New FilgraphManager
    Dim objFGSink As IGraphBuilder
    Set objFGSink = mobjMCSink
    Dim objSBESink As New MSVidStreamBufferSink
    Call objFGSink.AddFilter(objSBESink.SBESink, "SBESink")
    objSBESink.SinkName = "c:\temp.avi"
    Call RenderOutPin(mobjMCSink, AddFilter(mobjMCSink, "microsoft dv camera and vcr"))
    objSBESink.NameSetLock
    mobjMCSink.Run    '★
となっており、ストリームバッファシンクの初期化及び実行を行っていますが、
ストリームバッファソースの実行が行われていないのにもかかわらず
(★のところで)ストリームバッファシンクを実行していることになりますので、
ここがうまくいかない原因ではないでしょうか。
Form_Load時では、ストリームバッファシンクの初期化のみを行い、
Command1_Clickで、
MSVidCtlSrc.Run
mobjMCSink.Run
という感じでやってみてはいかがでしょうか。
あくまでも私が受け取った印象での返答ですので、うまくいかないかもしれません。

投稿時間:2004/09/28(Tue) 22:52
投稿者名:YAS
Eメール:yasunari@sakai.atnifty.com
URL :
タイトル:
Re^2: DirectShowでタイムシフト
りっとっとさんありがとうございます。

>つまり、ストリームバッファソースを実行してできる"C:\Example.wmv"ファイルを
>ストリームバッファシンクでコントロールを行うという手順となっております。

マイクロソフトのサンプルを見ると確かにソースの方からグラフを実行しています。
私もおかしいなと思っていろいろ調べたところ,
hhttp://www.microsoft.com/japan/msdn/library/ja/DirectX9_c/directx/htm/creatingthestreambuffergraphs.asp
のような記述もありました。
やはり,ストリームバッファシンクで記録したものをストリームバッファソースで読み取るのだと
思います。

前回のプログラムで特にエラーが出るわけでもなく,ストリームバッファシンクはちゃんとファイルを
作成して記録しているようです。
ただ,ストリームバッファソースがシンクが記録した映像を再生してくれないように思われます。

また,ちなみにMSVidStreamBufferSourceオブジェクトはどう宣言して初期化しても初期化していない
というエラーが出てフロパティにアクセスできません。そこでクラスIDで検索してMSVidCtlにグラフを
作らせているのです。

ビデオコントロールやストリームバッファエンジンについてはgoogleなどで検索してもあまりVBに関す
る情報が見つけられません。あまり使われていないのでしょうか? 面白いソフトが作れると思うの
ですけれど。(当方教員で,体育で器械運動の様子をタイムシフトで表示させたりするソフトを作りた
いと思っています。)