//------------------------------------------------------------- // 概要:ストリームURLの解析結果と、想定結果の比較 //------------------------------------------------------------- private static void GetUrlInfoTest(string streamUrl, string host, string portNo, string streamId) { StreamUrlInfo info = StreamUrlAnalyzer.GetUrlInfo(streamUrl); Assert.AreEqual(info.Host, host); Assert.AreEqual(info.PortNo, portNo); Assert.AreEqual(info.StreamId, streamId); }
//------------------------------------------------------------- // 概要:チャンネル情報取得 // 詳細:指定URL,指定ストリームIDのチャンネル情報を取得する //------------------------------------------------------------- private static ChannelInfo GetChannelInfo(string xmlUri, string streamId) { // URL情報の取得 StreamUrlInfo info = StreamUrlAnalyzer.GetUrlInfo(TestSettings.StreamUrl); info.StreamId = streamId; // XMLの読み込み XElement elements = XElement.Load(xmlUri); // チャンネル情報取得 PeerCastConnection pecaConnection = new PeerCastConnection(info); PrivateObject accessor = new PrivateObject(pecaConnection); ChannelInfo channelInfo = (ChannelInfo)accessor.Invoke("AnlyzeViewXML", new object[] { elements }); return(channelInfo); }
//------------------------------------------------------------- // 概要:ストリームURL情報の取得 //------------------------------------------------------------- public static StreamUrlInfo GetUrlInfo(string streamUrl) { Logger.Instance.DebugFormat("GetUrlInfo(streamUrl:{0})", streamUrl); StreamUrlInfo info = new StreamUrlInfo(); Regex regex = new Regex(StreamUrlPattern); Match match = regex.Match(streamUrl); if (match.Groups.Count == GroupCount) { info.Host = match.Groups[1].Value; info.PortNo = match.Groups[2].Value; info.StreamId = match.Groups[3].Value.Substring(0, match.Groups[3].Value.Length - 1); Logger.Instance.DebugFormat("ストリームURLの取得:正常(Host:{0}, PortNo:{1}, StreamId:{2})", info.Host, info.PortNo, info.StreamId); } else { Logger.Instance.Error("ストリームURLの取得:異常"); } return(info); }
//------------------------------------------------------------- // 概要:ストリーム情報の初期化 //------------------------------------------------------------- public PeerCastConnection(StreamUrlInfo streamUrlInfo) { Logger.Instance.DebugFormat("PeerCastConnection(Host:{0}, PortNo:{1}, StreamId:{2})", streamUrlInfo.Host, streamUrlInfo.PortNo, streamUrlInfo.StreamId); urlInfo = streamUrlInfo; }
//------------------------------------------------------------- // 概要:指定URLを再生 // 詳細:動画を再生し、チャンネル情報を取得する //------------------------------------------------------------- public void Open(string streamUrl) { Logger.Instance.DebugFormat("Open(streamUrl:{0})", streamUrl); // PeerCast通信の準備 StreamUrlInfo info = StreamUrlAnalyzer.GetUrlInfo(streamUrl); pecaConnect = new PeerCastConnection(info); // 動画再生開始 moviePlayer.PlayMoive(streamUrl); // チャンネル更新スレッド updateChannelInfoWorker.DoWork += (sender, e) => { for (int i = 0; i < UpdateRetryCount; i++) { Logger.Instance.DebugFormat("チャンネル更新トライ[{0}回目]", i + 1); ChannelInfo chInfo = pecaConnect.GetChannelInfo(); if (!String.IsNullOrEmpty(chInfo.Name)) { ChannelInfo = chInfo; e.Result = true; return; } System.Threading.Thread.Sleep(1000); } Logger.Instance.Debug("チャンネル更新に失敗しました。"); e.Result = false; }; updateChannelInfoWorker.RunWorkerCompleted += (sender, e) => { if ((bool)e.Result) { Logger.Instance.InfoFormat("チャンネル更新完了 [チャンネル名:{0}] [ジャンル:{1}] [詳細:{2}] [コメント:{3}] [コンタクトURL:{4}]", ChannelInfo.Name, ChannelInfo.Genre, ChannelInfo.Desc, ChannelInfo.Comment, ChannelInfo.Url); ChannelInfoChange(sender, e); } }; // チャンネル情報の取得 Timer timer = new Timer(); timer.Interval = UpdateInterval; timer.Tick += (sender, e) => { // チャンネル更新 UpdateChannelInfo(); /* * // メモリリーク防止 * if (moviePlayer.Ctlcontrols != null) * { * moviePlayer.Ctlcontrols.play(); * } */ }; timer.Start(); // チャンネル更新 UpdateChannelInfo(); }