tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDirectShowについて
記事No11800
投稿日: 2017/02/11(Sat) 23:44
投稿者daigodappe
お世話になります。

 Windows8.1、Excel2010のVBAです。
(特定のコーデックで、Excel2010VBAで再生できて、VisualStudio2015Expressでは再生できなかったと言う事例なのですが、こちらのカテゴリで質問させて頂きました)
 参照設定でActiveMovie control type libraryにチェックを入れ、ダイアログを準備してButton1を追加し以下をコーディングします。

[Excel2010]
Option Explicit
'再生する動画ファイル
Private Const VIDEOFILE$ = "C:\Users\Videos\RealTimes\RealDownloader\YouTube1.mp4"
'グラフマネージャ
Private mGrp As QuartzTypeLib.FilgraphManager
Private ivideow As QuartzTypeLib.IVideoWindow

Private Sub CommandButton1_Click()
  'グラフマネージャの作成
  Set mGrp = New QuartzTypeLib.FilgraphManager
  '再生用のグラフを作成
  mGrp.RenderFile VIDEOFILE$
  'ウィンドウ内で動画を再生させる
  Set ivideow = mGrp
  ivideow.WindowStyle = &H40000000 'WS_CHILD
  ivideow.SetWindowPosition 10, 30, 320, 240
  Dim hwnd1 As Long
  hwnd1 = FindWindow("ThunderDFrame", "UserForm2")
  ivideow.Owner = hwnd1
  'ビデオウィンドウへのメッセージをフォームで受け取る
  ivideow.MessageDrain = hwnd1
  '再生
  mGrp.Run
End Sub

 これを実行(Button1押下)すると、指定した動画が再生されました。
 次に、上記ソースを、同一PC上のVisualStudio2015Expressで構築したプロジェクトに持って行って(一部、VS2015用に変更)同様に実行すると、サポートされていないフォーマット(エラーコード:0x80040265)とエラーが出ました。

[VisualStudio2015Express]
Option Explicit On
'再生する動画ファイル
Private Const VIDEOFILE$ = "C:\Users\Videos\RealTimes\RealDownloader\YouTube1.mp4"
'グラフマネージャ
Private mGrp As QuartzTypeLib.FilgraphManager
Private ivideow As QuartzTypeLib.IVideoWindow

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 'グラフマネージャの作成
 mGrp = New QuartzTypeLib.FilgraphManager
 '再生用のグラフを作成
 mGrp.RenderFile(VIDEOFILE$)
 'ウィンドウ内で動画を再生させる
 ivideow = mGrp
 ivideow.WindowStyle = &H40000000 'WS_CHILD
 ivideow.SetWindowPosition(10, 30, 320, 240)
 ivideow.Owner = Me.Handle
 '再生
 mGrp.Run()
End Sub

 VisualStudio2015Expressでも、同様にActiveMovie control type libraryにチェックを入れて試行しましたが、再生できませんでした。
 ActiveMovie control type libraryは、参照先を見た限り、双方ともC:\WINDOWS\System32quartz.dllを参照しています。

 何故だか分かる方、解決方法、回避策等お分かりの方おられますでしょうか。
VisualStudio2015Expressに何かしらの制限があるのでしょうか。
 ちなみに、.mov(クイックタイムムービー)も同様に再生できませんでしたが、.aviはどちらも再生できました。
 ご回答の程、宜しくお願い致します。

[ツリー表示へ]
タイトルRe: DirectShowについて
記事No11801
投稿日: 2017/02/13(Mon) 11:56
投稿者魔界の仮面弁士
検証環境が無いので、具体的な回答はできないのですが:


> Windows8.1、Excel2010のVBAです。
> 特定のコーデックで、Excel2010VBAで再生できて、VisualStudio2015Expressでは再生できなかった

実行環境が 64bit 版の Windows ということはないでしょうか。
(32bit 版の Windows をお使いの場合は、以下の発言を無視してください)


Office は 2010 以降、64bit 版が存在していますが、
多くの場合、32bit 版がインストールされている状態だと思います。

一方、Visual Studio Express は、既定で AnyCPU ビルドのアプリを生成するため、
64bit 環境で実行すると、64bit アプリとして実行されます。


もしも 64bit OS だとしたら、AnyCPU ビルドから x86 ビルドに変更してみては如何でしょう。
http://d.hatena.ne.jp/fofofofo/20090819/1250696028
http://d.hatena.ne.jp/sys-arts/20110905/1315230373
http://fnya.cocolog-nifty.com/blog/2012/02/net-32bit-6a08.html

[ツリー表示へ]
タイトルRe^2: DirectShowについて
記事No11802
投稿日: 2017/02/14(Tue) 11:32
投稿者daigodappe
> もしも 64bit OS だとしたら、AnyCPU ビルドから x86 ビルドに変更してみては如何でしょう。

ありがとうございます。
ビンゴで御座います。X86ビルドで再生できました。

 そもそも、この問題にぶつかったのは、Excel2010VBAで試して動いたものをそのままVS2015に移行した為でした。(私事乍、Excel系の作業が多い関係で、アプリ化する場合、大概このルートで開発)
 最初は、Excel側でWindowsMediaPlayerで試行していたのですが、VBA側では画面サイズのコントロールが出来なかった(コンテンツ依存?)ので、VS2015側に持って行った際に、画面サイズがコントロール出来るDirectShowに切り替えたというものでした。
 で、原点に返ってVS2015側でWindowsMediaPlayerを配置したら、画面サイズのコントロールが出来ることを知り、現在はWindowsMediaPlayerで構築を進めているという、まことに身勝手な状態となっております。

 然し、魔界の仮面弁士さまのアドバイス、まことに的確でした。
 折角なので、WindowsMediaPlayerと、DirectShowの何れでも選択可能なアプリケーションとして構築して置き度いと思います。(ま、身内のワガママを解消する為のアプリなので、両方搭載すること自体は自己満足の域となりますが、同様の開発ルート上で、今後の問題解決の一案となりますので大いに助かりました)
 開発やってるなら、その辺、気付けよって話ですよね。まったく。

 有難うございました。

[ツリー表示へ]
タイトルRe^3: DirectShowについて
記事No11803
投稿日: 2017/02/19(Sun) 07:42
投稿者daigodappe
追加情報です。
(と言いましても、まだ、原因が特定できてはいないのですが…(^^;)

その後、お教え頂いたようにX86でデバッグしておりましたが、色々機能追加でプロジェクトにゴミが溜まってきたので、一端再構築(ソース、フォームを新規プロジェクトに移行)することにしました。
その際、忘れてビルド環境を変更せず継続しておりました。

いつの間にか、AnyCPU環境でも.mov、.mp4等が再生できている。

若しかすると、機能追加でImportしたライブラリ等の何れかに、何らかの有効な手段があったのだと思います。
そんな訳で、直ぐにとは行きませんが、プロジェクト構築がある程度落ち着いたら、何が影響したか特定して、改めてご報告させて頂き度いと思います。

改めて、ありがとうございました。

[ツリー表示へ]