none
WMP(axWindowsMediaPlayerコンポーネント)で再生中のDVD字幕(caption,subtitles)複数の取得(get)をし、string型 で複数のテキストボックスに表示したいのです。 RRS feed

  • 質問

  • こんばんは、初級者です。VS2008STD,C#.Net3.5でVista上で開発しています。早速ですが、内容はタイトルのままです。

    WMP(axWindowsMediaPlayerコンポーネント)で再生中のDVD字幕(caption,subtitles)複数の取得(get)をし、string型 で複数のテキストボックスに表示したいのです。以下のあたりでキャストが問題でエラーが出ています。

    using WMPLib;
    using AxWMPLib;
    using System.Runtime.InteropServices;

                IWMPClosedCaption2 cap = (IWMPClosedCaption2)axWindowsMediaPlayer1.closedCaption;
                //for (int j = 0; j < cap.SAMILangCount; j++)
                //{
                    //int k = 0;
                    //textBox3.Text += "capid" + cap.getSAMILangName(k);
                //}
                //var newOption="";
                for (int i = 0; i < cap.SAMILangCount; i++) //cap.SAMILangCount; i++)
                {
                    try
                    {
                        WebBrowser web = new WebBrowser();
                        //web.Document.CreateElement("option");
                        //newOption = document.createElement("OPTION");
                        textBox3.Text = cap.getSAMILangName(i);
                        //textBox3.Text = newOption.text;
                        //newOption.value = newOption.text;
                        //CCLang.options.add(newOption);
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show(ex.Message, "error");
                    }

                }

    また、以下のコードも何も文字を返してくれません。

                textBox1.Text += cap.captioningId;
                textBox1.Text += cap.SAMIFileName;

    どなたか、DVDから字幕の取得の仕方をご教授、よろしくお願いします。

    ちなみにthe sound of musicとthe untouchablesのDVDで試しています。

    DVDによっても微妙にオーディオの言語変更に違いがありました。

    2010年8月29日 13:08

回答

  • 外池です。すいません、プログラムの細かいことよりも、根本的なところで「?」と思うことがあります。

    http://msdn.microsoft.com/en-us/library/dd388582(VS.85).aspx
    の情報を踏まえて・・・、

    司鵬さんが、まずは、目にされている字幕なんですが、DVDのソフトを普通のDVDプレーヤーで再生した場合でも、英語字幕とか日本語字幕とか選らんで表示させられるものですか? そうだとすると、上記URLで説明されているsubpicture streamというものに載っかっているコンテンツじゃないかと危惧しています。

    一方で、司鵬さんが取り出そうとプログラムされているものは、上記URLで説明されているline 21 Closed Caption dataに該当するもので、上記の「普通の字幕」情報は取り出せないんじゃないかと・・・。

    この辺り、確認されました?

    もし外していたらごめんなさい。

     


    (ホームページを再開しました)
    • 回答としてマーク 2010年9月6日 13:51
    2010年8月30日 6:30
  • つなげておきます。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=52936


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 2010年9月6日 13:51
    2010年8月30日 13:45
    モデレータ

すべての返信

  • WindowsMediaPlayer はあまり詳しくないのですが、一言だけ。

    > 以下のあたりでキャストが問題でエラーが出ています。

    何行目でどういう例外が発生するのか、それともビルドエラーなのか、具体的に記述しないと回答が付きにくいと思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年8月30日 1:52
    モデレータ
  • ひらぽんさん、返信ありがとうございます。

    >for (int i = 0; i < cap.SAMILangCount; i++)

    で、まずキャストが有効ではないとでたきがします。

    現在、オブジェクトブラウザからWMPLib.IWMPCore2にclosedCaptionがあったのでそれを利用できないか実験中です。

    おはずかしながら、インターフェイスとクラスの組み合わせる使い方がわかっていませんでした。

    http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_004/cs2_004_03.html

    上記でまずそれを学びました。勉強しながらなので、時間がかかってしまいますが、よろしくお願いします。

    引き続きご教授お願いします。

     

    2010年8月30日 2:36
  • ひらぽんさん、返信ありがとうございます。

    >for (int i = 0; i < cap.SAMILangCount; i++)

    で、まずキャストが有効ではないとでたきがします。

    WindowsMediaPlayer を C# で少しコーディングしながら調べてみました。
    ClosedCaption.SAMILangCount プロパティは Int32 を返すので、ここで 「キャストが有効でない」 というエラーを返すのは考えにくいです。

     「でたきがします」 ではなく、 「この行でこういう例外が発生した」 という確実な情報が欲しいところですね。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年8月30日 3:22
    モデレータ
  •             IWMPClosedCaption2 cap2 = (IWMPClosedCaption2)axWindowsMediaPlayer1.closedCaption;
                IWMPClosedCaption cap1 = (IWMPClosedCaption)axWindowsMediaPlayer1.closedCaption;
                //IWMPCore core = (IWMPCore)axWindowsMediaPlayer.closedCaption;
                for (int j = 0; j < cap2.SAMILangCount; j++)
                {
                    textBox3.Text += "capid" + cap2.getSAMILangName(j);
                }

    誠にすみません。

    デバッグモードでビルドは、できます。DVD再生しながら上記の太字を含むボタンを押すと、

    太字が強調されて、指定されたキャストは、有効ではありませんと出ます。

     

    2010年8月30日 4:41
  • 残念ながら メディアDVD を再生できる環境にないので、こちらでは実行できませんが・・・

    > for (int j = 0; j < cap2.SAMILangCount; j++)
    > ・・・・・・
    > 太字が強調されて、指定されたキャストは、有効ではありませんと出ます。

    この行にブレークポイントを設け、cap2.SAMILangCount の値を調べてみてはいかがでしょうか?

    余計なことかも知れませんがデバッグの仕方をご存知でしょうか。もしよくご存じでないなら、一度以下の記事を読まれることをお勧めします。

    http://journal.mycom.co.jp/articles/2008/08/18/debug/index.html
    http://journal.mycom.co.jp/articles/2008/08/19/debug/index.html


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年8月30日 5:43
    モデレータ
  • 外池です。すいません、プログラムの細かいことよりも、根本的なところで「?」と思うことがあります。

    http://msdn.microsoft.com/en-us/library/dd388582(VS.85).aspx
    の情報を踏まえて・・・、

    司鵬さんが、まずは、目にされている字幕なんですが、DVDのソフトを普通のDVDプレーヤーで再生した場合でも、英語字幕とか日本語字幕とか選らんで表示させられるものですか? そうだとすると、上記URLで説明されているsubpicture streamというものに載っかっているコンテンツじゃないかと危惧しています。

    一方で、司鵬さんが取り出そうとプログラムされているものは、上記URLで説明されているline 21 Closed Caption dataに該当するもので、上記の「普通の字幕」情報は取り出せないんじゃないかと・・・。

    この辺り、確認されました?

    もし外していたらごめんなさい。

     


    (ホームページを再開しました)
    • 回答としてマーク 2010年9月6日 13:51
    2010年8月30日 6:30
  • 外池様、ありがとうございます。

    普通のDVD再生機では、トップメニューで言語を選択できるようになっています。

    VISTA搭載のWMP11は、字幕も音声も再生中に言語を変更できるようになっています。(wmplib.dllではなくWmp.dllを用いているようですが...)

    字幕には、画像の形式のものとタグ形式のものがあるようですね。

    前者ならWINDOW? SDKのダイレクトショーで動画を駒切りにしてとOCRを用いて取り出そうと思っています。(難しい)

    後者ならwebbrowserからテキストを取り出す方法と同じなので非常に簡単です。

    どちらでもよいのですが、それを調べる手段もわかりません。

     

    2010年8月30日 9:12
  • ひらぽん様、返信ありがとうございます。

    ブレークポイントを設定してみたところ、closedcation関連の変数などは、すべて””かnullでした。

    下記に外池さまがご指摘した通り、closedcaption形式ではないのかもしれません。

    継続してDVDの勉強をしてみます。

    ありがとうございました。

    2010年8月30日 12:15
  • つなげておきます。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=52936


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 2010年9月6日 13:51
    2010年8月30日 13:45
    モデレータ
  • Azulean様、お手間をおかけしてすみません。

    皆様に追伸。

    どうやらDVDの.vob(拡張子)と.ifo(拡張子)のファイルに字幕のデータが入っているようです。
    だから、closedcaptionで得られることは、なさそうです(根拠も自信もありませんが)。

    directshowを検討してみます。

    2010年8月30日 14:17
  • 丁寧で有力な情報、皆様本当にありがとうございました。
    目的は、難聴者(昔の知人も含め)の方のための語学学習用に字幕を2カ国同時表示するDVD再生プレイヤーソフトを作るためです。

    DSHOWのDVDナビゲーター(VOBからsubpicture streamを分離してくれる。)というのを試してみようと考えています。
    それには、やはりC++を使うしかないようです。

    ソフトが悪用されるのを防ぐために、subpicture stream(動画)のままDVD再生のリアルタイム表示し、テキスト(string,char*)にせず表示することにします。

    OCRでテキストにするのはやめます。

    進展がありましたらまた書き込みします。

    それでは、失礼しました。

    2010年9月2日 2:12
  • C++ですが、DSHOWを扱うのにここが、助かりました。

    http://msdn.microsoft.com/ja-jp/library/cc370402.aspx

    開発環境がC++に移動しスレッド違いなので、この質問は、ここで打ち切りにします。

    勝手にすみません。皆様、本当にありがとうございました。

    それでは、失礼しました。

    2010年9月6日 13:50
  • しつこいですが、C#でもDSHOWを使えることが以下のウェブでわかりました。

    http://www.codeproject.com/KB/directx/directshownet.aspx

     

    2010年9月9日 9:44