ページ 11

Windows Media Playerへのデータ送信

Posted: 2012年3月09日(金) 14:11
by たぴおか
動画データをWindows Media Player(WMP)へ送信するプログラムを作成しています。

具体的には
 WMPの「ファイル」→「URLを開く」で、あるURL(今回はhttp://127.0.0.1:12345/)へアクセスしたときに、このプログラムから動画データを少しずつ送信しています。
 下記のコード例ではWMPへ送信するデータをファイルから読み込んでいますが、実際は別の場所から少しずつ受信するデータを少し加工し、WMPへ送信します。
 このためWMPからダイレクトに”hoge.flv"を読み込むことはできないものとしてください。
 また、別の場所からのデータ受信が終わらないうちでも、WMPで動画再生を始めたいため、別の場所からのデータをすべて受信し、ファイルに書き出し、それをWMPで読むということもできないものとしてください。

質問、希望
 この際に42行目のWriteで「指定されたネットワーク名は利用できません。」というエラーが出てしまうのですが、何か回避策はありますか?
 私の環境では i=3(4回目)のWriteでエラーとなります。そしてこのコードのように一度Breakし、もう一度for文に入ると今度はエラーとならずWMPで再生が始まります。
 一応再生が始まるので良いのかもしれませんが、気持ちが悪いのでできれば一度もエラーとならずに再生するようにしたいところです。

すみませんが、教えていただけると助かります。

コード:

using System;
using System.IO;
using System.Net;

class Program
{
    static void Main(string[] args)
    {
        HttpListener listener = new HttpListener();
        string prefix = "http://127.0.0.1:12345/";
        listener.Prefixes.Add(prefix);
        listener.Start();

        while (true)
        {
            HttpListenerContext context = listener.GetContext();
            HttpListenerRequest req = context.Request;
            HttpListenerResponse res = context.Response;

            using (FileStream streamR = new FileStream("hoge.flv", FileMode.Open))
            {
                res.AppendHeader("Pragma", "no-cache");
                res.AppendHeader("Cache-Control", "no-cache");
                res.AppendHeader("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
                res.AppendHeader("Content-Disposition", "attachment; filename=" + req.RawUrl.Substring(1));
                res.AppendHeader("Connection", "close");
                FileInfo fi = new System.IO.FileInfo("hoge.flv");
                res.ContentLength64 = fi.Length;
                //res.ContentType = 設定必要?;

                byte[] resBytes = new byte[100000];
                int resSize = 0;
                int TotalSize = 0;
                for (int i = 0; TotalSize != res.ContentLength64; i++)
                {
                    resSize = streamR.Read(resBytes, 0, resBytes.Length);
                    TotalSize += resSize;
                    try
                    {
                        res.OutputStream.Write(resBytes, 0, resSize);
                    }
                    catch (HttpListenerException ex)
                    {
                        Console.WriteLine(ex.Message);
                        break;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        return;
                    }
                }
            }
            try
            {
                res.Close();
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }

        }
    }
}
環境
 Windows XP, Visual Studio C# 2010 Express

Re: Windows Media Playerへのデータ送信

Posted: 2012年3月09日(金) 14:35
by たぴおか
すみません、25行目訂正します。

コード:

                res.AppendHeader("Content-Disposition", "attachment; filename=" + req.RawUrl.Substring(1));
       //↓訂正
                res.AppendHeader("Content-Disposition", "attachment; filename=hoge.flv");