我开始创建其中很大一部分依赖于流媒体从PC视频(几个视频流)的WP8手机的应用程序。
我从下面的视频格式之一,选择:
Motion JPEG
,MPEG-4
H.264
。流应该得到某种保护,使未经授权的人将有时间难以接受或可能对其进行解码。
- 手机具有通过Wi-Fi连接到互联网。 手机是不同的WIFI网络比PC服务器英寸
现在的问题是:(1)如何从PC到手机WP8和(2)如何合理地确保这一传输流的上述指定格式的视频?
在PC服务器的一部分将被写在C#。
我开始创建其中很大一部分依赖于流媒体从PC视频(几个视频流)的WP8手机的应用程序。
我从下面的视频格式之一,选择: Motion JPEG
, MPEG-4
H.264
。
流应该得到某种保护,使未经授权的人将有时间难以接受或可能对其进行解码。
现在的问题是:(1)如何从PC到手机WP8和(2)如何合理地确保这一传输流的上述指定格式的视频?
在PC服务器的一部分将被写在C#。
由于它是一个小项目,你可以设置你的家用电脑与IIS,并直接从自己的家庭服务器流式传输的内容。
您使用H.264编码的视频在MP4文件,因为它这是支持几乎所有的设备上那里的格式是很重要的。
内容将通过HTTP流式传输,并且可以在应用程序或浏览器中查看。
由于它只是一个小规模的系统,你将被实施,则可以忽略很多安全部分,集中力量首先得到视频流......你还需要什么相关的视频数据库已存储和它们所在的位置上你的硬盘,我的建议是所有视频都存储在同一位置,如C:\MP4\
接下来的部分将安装IIS,您可以使用您的IP地址,或者购买一个域名,并改变其A记录指向你的IP。
然后,您可以创建一个小的数据库表命名影片,有列标记视频ID和文件路径,并与您的视频填充数据库。
数据库完成后,你可以继续编写一个通用的处理程序将处理视频流。
创建一个新的名为.ashx的文件Watch.ashx
,现在你想观看视频为准,你很快就可以通过将视频ID参数Watch.ashx这样这样做...
http://127.0.0.1/Watch.ashx?v=VIDEOID
以下附上全班让你开始。
<%@ WebHandler Language="C#" Class="Watch" %>
using System;
using System.Globalization;
using System.IO;
using System.Web;
public class Watch : IHttpHandler {
public void ProcessRequest(HttpContext context)
{
// Get the VideoID from the requests `v` parameters.
var videoId = context.Request.QueryString["v"];
/* With the videoId you'll need to retrieve the filepath
/ from the database. You'll need to replace the method
/ below with your own depending on whichever
/ DBMS you decide to work with.
*////////////////////////////////////////////////////////
var videoPath = DataBase.GetVideoPath(videoId);
// This method will stream the video.
this.RangeDownload(videoPath, context);
}
private void RangeDownload(string fullpath, HttpContext context)
{
long size;
long start;
long theend;
long length;
long fp = 0;
using (StreamReader reader = new StreamReader(fullpath))
{
size = reader.BaseStream.Length;
start = 0;
theend = size - 1;
length = size;
context.Response.AddHeader("Accept-Ranges", "0-" + size);
if (!string.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"]))
{
long anotherStart;
long anotherEnd = theend;
string[] arrSplit = context.Request.ServerVariables["HTTP_RANGE"].Split('=');
string range = arrSplit[1];
if ((range.IndexOf(",", StringComparison.Ordinal) > -1))
{
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + theend + "/" + size);
throw new HttpException(416, "Requested Range Not Satisfiable");
}
if ((range.StartsWith("-")))
{
anotherStart = size - Convert.ToInt64(range.Substring(1));
}
else
{
arrSplit = range.Split('-');
anotherStart = Convert.ToInt64(arrSplit[0]);
long temp;
if ((arrSplit.Length > 1 && Int64.TryParse(arrSplit[1], out temp)))
{
anotherEnd = Convert.ToInt64(arrSplit[1]);
}
else
{
anotherEnd = size;
}
}
anotherEnd = (anotherEnd > theend) ? theend : anotherEnd;
if ((anotherStart > anotherEnd | anotherStart > size - 1 | anotherEnd >= size))
{
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + theend + "/" + size);
throw new HttpException(416, "Requested Range Not Satisfiable");
}
start = anotherStart;
theend = anotherEnd;
length = theend - start + 1;
fp = reader.BaseStream.Seek(start, SeekOrigin.Begin);
context.Response.StatusCode = 206;
}
}
context.Response.ContentType = "video/mp4";
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + theend + "/" + size);
context.Response.AddHeader("Content-Length", length.ToString(CultureInfo.InvariantCulture));
context.Response.TransmitFile(fullpath, fp, length);
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
我适应了上面的类从cipto0382's
工作,原来可以在这里找到:
http://blogs.visigo.com/chriscoulson/easy-handling-of-http-range-requests-in-asp-net/
在离别的笔记,以节省带宽,我强烈建议你从IIS应用项目库下载媒体服务,可以说油门视频被发送,使得它不会吃掉你的整个带宽的比特率。