ビデオコンテンツをダウンロードする次のコードがあります。
WebRequest wreq = (HttpWebRequest)WebRequest.Create(url);
using (HttpWebResponse wresp = (HttpWebResponse)wreq.GetResponse())
using (Stream mystream = wresp.GetResponseStream())
{
using (BinaryReader reader = new BinaryReader(mystream))
{
int length = Convert.ToInt32(wresp.ContentLength);
byte[] buffer = new byte[length];
buffer = reader.ReadBytes(length);
Response.Clear();
Response.Buffer = false;
Response.ContentType = "video/mp4";
//Response.BinaryWrite(buffer);
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.End();
}
}
しかし、問題は、ファイル全体が再生される前にダウンロードされることです。ダウンロード中の状態でストリーミングして再生するにはどうすればよいですか?それとも、これは管理するクライアント/レシーバーアプリケーション次第ですか?
ファイル全体を単一のバッファに読み込んでから、バイト配列全体を一度に送信します。
while
ループ内の小さなバッファに読み込む必要があります。
例えば:
byte[] buffer = new byte[4096];
while(true) {
int bytesRead = myStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
Response.OutputStream.Write(buffer, 0, bytesRead);
}
これは、特にサーバー上のファイルからビデオをストリーミングする必要がある場合、またはこのファイルが別のサーバーでホストされている場合に、より効率的です。
サーバー上のファイル:
context.Response.BinaryWrite(File.ReadAllBytes(HTTPContext.Current.Server.MapPath(_video.Location)));
外部サーバー上のファイル:
var wc = new WebClient();
context.Response.BinaryWrite(wc.DownloadData(new Uri("http://mysite/video.mp4")));
スムーズストリーミング を見たことがありますか?
サンプルコードを見てください ここ