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

質問
-
こんばんは、初級者です。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によっても微妙にオーディオの言語変更に違いがありました。
回答
-
外池です。すいません、プログラムの細かいことよりも、根本的なところで「?」と思うことがあります。
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
すべての返信
-
ひらぽんさん、返信ありがとうございます。
>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
上記でまずそれを学びました。勉強しながらなので、時間がかかってしまいますが、よろしくお願いします。
引き続きご教授お願いします。
-
ひらぽんさん、返信ありがとうございます。
>for (int i = 0; i < cap.SAMILangCount; i++)
で、まずキャストが有効ではないとでたきがします。WindowsMediaPlayer を C# で少しコーディングしながら調べてみました。
ClosedCaption.SAMILangCount プロパティは Int32 を返すので、ここで 「キャストが有効でない」 というエラーを返すのは考えにくいです。「でたきがします」 ではなく、 「この行でこういう例外が発生した」 という確実な情報が欲しいところですね。
ひらぽん http://d.hatena.ne.jp/hilapon/ -
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再生しながら上記の太字を含むボタンを押すと、
太字が強調されて、指定されたキャストは、有効ではありませんと出ます。
-
残念ながら メディア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/- 編集済み ひらぽんModerator 2010年8月30日 5:49 追記した
-
外池です。すいません、プログラムの細かいことよりも、根本的なところで「?」と思うことがあります。
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
-
外池様、ありがとうございます。
普通のDVD再生機では、トップメニューで言語を選択できるようになっています。
VISTA搭載のWMP11は、字幕も音声も再生中に言語を変更できるようになっています。(wmplib.dllではなくWmp.dllを用いているようですが...)
字幕には、画像の形式のものとタグ形式のものがあるようですね。
前者ならWINDOW? SDKのダイレクトショーで動画を駒切りにしてとOCRを用いて取り出そうと思っています。(難しい)
後者ならwebbrowserからテキストを取り出す方法と同じなので非常に簡単です。
どちらでもよいのですが、それを調べる手段もわかりません。
-
丁寧で有力な情報、皆様本当にありがとうございました。
目的は、難聴者(昔の知人も含め)の方のための語学学習用に字幕を2カ国同時表示するDVD再生プレイヤーソフトを作るためです。
DSHOWのDVDナビゲーター(VOBからsubpicture streamを分離してくれる。)というのを試してみようと考えています。
それには、やはりC++を使うしかないようです。
ソフトが悪用されるのを防ぐために、subpicture stream(動画)のままDVD再生のリアルタイム表示し、テキスト(string,char*)にせず表示することにします。
OCRでテキストにするのはやめます。進展がありましたらまた書き込みします。
それでは、失礼しました。
-
C++ですが、DSHOWを扱うのにここが、助かりました。
http://msdn.microsoft.com/ja-jp/library/cc370402.aspx
開発環境がC++に移動しスレッド違いなので、この質問は、ここで打ち切りにします。
勝手にすみません。皆様、本当にありがとうございました。
それでは、失礼しました。
-