2014年8月9日



 主題:C#で動画プレイヤー作り DirectShow編

 動画プレイヤーを作るために使えそうな情報をまとめておきます。
 

 1. Windows Media Playerを使う方法
 2. DirectShowを使う方法
 
 動画プレイヤーを作る方法は以上の二通りが考えられます。
 他にも外部プレイヤーを導入する方法があるかもしれませんが本項では割愛します。

 1.は"お手軽"との評判の一方でカスタマイズ性に難あり。
 一応作りかけのテキストファイル(wmp1.txt, wmp2txt)があるので、使えそうな箇所があれば参考にしてください。

 本項では2. DirectShowを使う方法を取り扱います。
 


using QuartzTypeLib; //quartz.dll参照設定の追加が必要 Windows\system32フォルダなどに含まれている

FilgraphManager filgraphManager = new FilgraphManager();
filgraphManager.RenderFile("ファイルパス"); // 動画ファイルを読み込む

filgraphManager.Run(); // 再生する 停止・一時停止中ならその位置から再生


// ----- ----- ここまでで最低限の動画再生が可能 ----- ----- //


filgraphManager.Pause(); //一時停止する 再生位置を移動すると表示が変わる
filgraphManager.Stop(); //停止する 再生位置を移動しても表示が変わらない

int state;
filgraphManager.GetState(100,out state); // 再生状態の確認 state=0 停止中 state=1 ポーズ state=2 再生中





QuartzTypeLib.IMediaPosition = (QuartzTypeLib.IMediaPosition)filgraphManager;

double Time=IMediaPosition.CurrentPosition; // 再生地点を取得 初期値=0 単位s(秒)
IMediaPosition.CurrentPosition=600; // 再生地点の書き換え
IMediaPosition.CurrentPosition=IMediaPosition.CurrentPosition+10;

double test1 = IMediaPosition.StopTime; // 終了地点を取得
textBox1.Text = (int)(IMediaPosition.StopTime/60)+"分"+(int)(IMediaPosition.StopTime%60)+"秒"+(IMediaPosition.StopTime%1);




QuartzTypeLib.IBasicVideo bv;
QuartzTypeLib.IVideoWindow vw;
bv = (QuartzTypeLib.IBasicVideo)filgraphManager;
vw = (QuartzTypeLib.IVideoWindow)filgraphManager;

int vx, vy;
bv.GetVideoSize(out vx, out vy);

// ----- ----- ここをコメントアウトすると動画再生用の別ウィンドウが開く ----- ----- //
vw.Owner = (int)this.Handle;
vw.WindowStyle = 0x40000000 | 0x4000000;
vw.SetWindowPosition(0, 0, vx, vy);
vw.MessageDrain = (int)this.Handle;
// ----- ----- ----- ----- //




QuartzTypeLib.IBasicAudio IBasicAudio;
IBasicAudio.Volume+=-100; //音量調整 初期値=0 最小-10000〜最大0




・DirectShowLibを使用する ※要ダウンロード DirectShowLib-2005.dllを参照設定に追加する

using DirectShowLib;

DirectShowLib.IMediaSeeking mediaSeeking = default(IMediaSeeking);
mediaSeeking = (IMediaSeeking)filgraphManager;
mediaSeeking.SetRate(2.0); //2倍速
mediaSeeking.SetRate(0.5);

DirectShowLib.IVideoFrameStep videoFrameStep = default(IVideoFrameStep);
videoFrameStep = (IVideoFrameStep)filgraphManager;
videoFrameStep.Step(1, null); //コマ送り













 C#でウェブブラウザ作り

ツールバーからwebBrowserを使用

String Main_Path=System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); //ファイル作成までの一連の流れ
String URL = System.IO.Path.Combine(Main_Path,@"TEST.html");
String URL_Text="test";
System.IO.StreamWriter HTML = new System.IO.StreamWriter(URL, true, System.Text.Encoding.GetEncoding("EUC-JP"));
HTML.WriteLine(URL_Text); //ファイル作成・書き込み
HTML.Close();

webBrowser1.Navigate(new Uri(URL)); //ページを表示


上記の基本的なウェブブラウザではマウスのサイドボタンによる戻る進むができない
改善策として上記のウェブブラウザは破棄し、カスタムブラウザを使用する


 

 ウェブブラウザに必要になるかもしれないもの

・ウェブブラウザでダブルクリック

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
webBrowser1.Document.Body.AttachEventHandler("ondblclick", Document_DoubleClick);
}
void Document_DoubleClick(object sender, EventArgs e) { MessageBox.Show("test"); } //ここに中身を記述

・ウェブブラウザでキーボードクリック

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int GetAsyncKeyState(int vKey);
[DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x2;
private const int MOUSEEVENTF_LEFTUP = 0x4;

private void timer1_Tick(object sender, EventArgs e) { //timerを使用
for (int i = 1; i <= 256; i++){
int rtn = GetAsyncKeyState(i);
if ((rtn & 1) != 0) {
//textBox1.Text=i+""; //キー数値確認用
if(i==27||i==46||i==110) { this.Close(); } // Esc 27 Del 46 .Del 110
}}}
 

 その他

・記録用iniファイル実装

using System.Runtime.InteropServices;

/* ------------------------------ ini ------------------------------ */
public class IniFile {
[DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(
string lpApplicationName, string lpKeyName, string lpDefault, StringBuilder lpReturnedstring, int nSize, string lpFileName);

[DllImport("kernel32.dll")]
private static extern int WritePrivateProfileString(
string lpApplicationName,string lpKeyName, string lpstring, string lpFileName);
string filePath;
public IniFile(string filePath) {this.filePath = filePath;}
public string this[string section,string key] {
set {WritePrivateProfileString(section, key, value, filePath);}
get {StringBuilder sb = new StringBuilder(256);
GetPrivateProfileString(section, key, string.Empty, sb, sb.Capacity, filePath);
return sb.ToString();
} }
public string GetValue(string section, string key, string defaultvalue) {
StringBuilder sb = new StringBuilder(256);
GetPrivateProfileString(section, key, defaultvalue, sb, sb.Capacity, filePath);
return sb.ToString();
}}
/* ------------------------------ ini ------------------------------ */

IniFile ini = new IniFile("./Anime_HTML.ini"); //ファイル読み込み

this.Left=int.Parse(ini["List", "Window_X"]); //読み込み例
this.Top=int.Parse(ini["List", "Window_Y"]);
ini["List", "Window_X"]= this.Left.ToString(); //書き込み例
ini["List", "Window_Y"]= this.Top.ToString();

//iniファイル記述例
[List]
Window_X=306
Window_Y=210
; コメント
 

・ユーザー定義関数

TEST_TEST1(); //呼び出し方
private void TEST_TEST1(){ MessageBox.Show("test1"); } //中身

TEST_TEST2("test2");
private void TEST_TEST2(String MOJI){ MessageBox.Show(MOJI); }

int k=3;
String TEST3="test";
TEST_TEST3(k,TEST3);
public void TEST_TEST3(int k,String MOJI){ MessageBox.Show(MOJI+k); } // 必要に応じてpublicに
 

・他

this.FormBorderStyle=FormBorderStyle.None; //枠線を消す
this.FormBorderStyle=FormBorderStyle.Sizable; //基本的な枠線、その他サイズ固定など有り

this.Width=800; //横サイズ
this.Height=600; //縦サイズ
this.Left=100; //ウインドウの位置、X軸
this.Top=100; //ウインドウの位置、Y軸
this.Close(); //閉じる