2014-02-17 23 views
0

我使用vlc插件来播放用于直播的rtmp链接。它工作正常,如果发生在目标标签中的流媒体链接像下面的代码:用于字符串返回的HTTP Hanlder asp.net

<embed 
type='application/x-vlc-plugin' 
pluginspage='http://www.videolan.org' 
version='VideoLAN.VLCPlugin.2' 
width='800' 
height='600' 
id='vlc' 
loop='yes' 
autoplay='yes' 
target="rtmp://122.221.75.124:1935/live/myc001"> 
</embed> 

问题: 所以我的要求是通过显示HTML源代码隐藏从观众RTMP链接。我使用Http Handler从数据库返回链接。 的VLC插件目标标记是:

target="Handler1.ashx?ChannelID=22"> 

而且我Hanlder1.ashx代码:

public class Handler1 : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     if (context.Request.QueryString["ChannelID"] == null) return; 
     string connStr = Connection_Class.Str_Conn; 
     string channelID = context.Request.QueryString["ChannelID"]; 
     if (channelID == "") { return; } 

     using (SqlConnection conn = new SqlConnection(connStr)) 
     { 
      using (SqlCommand cmd = new SqlCommand("SELECT Link FROm TblChannel WHERE ChannelID = @id", conn)) 
      { 
       cmd.Parameters.Add(new SqlParameter("@id", channelID)); 
       conn.Open(); 
       using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
       { 
        reader.Read(); 
        if (reader.HasRows == true) 
        { 
         string lnk = ""; 
         lnk = reader["Link"].ToString(); 
         context.Response.Clear(); 
         context.Response.Write(lnk); 
         reader.Close(); 
         context.Response.End(); 
        } 
        else 
        { return; } 
       } 
      } 
     } 

的Hanlder1返回正确的链接,当我在浏览器中键入:

http://localhost:54091/handler1.ashx?channelid=22 

我在vlc中使用了相同的方法Target tage :(目标=“http:// localhost:54091/handler1.ashx?channelid = 22”)但链接不起作用。我使用断点来验证处理程序的工作原理,并返回字符串,但vlc不播放流。

回答

0

我试过302重定向,VLC也没有反应。问题是vlc期待rtmp或rtmpt协议,并且您试图在http层上重定向它 - 这不会起作用。您必须在rmpt级别执行重定向,或者创建rmpt代理而不是http处理程序。如果你想这样看看http://www.fluorinefx.com/download.html - 看起来很棒的.NET API。

其他方法(我不知道你对rmpt服务器本身有多少控制权,并且这种方式假定你对它有一定的控制权)是破解握手阶段 - 即你将生成链接到rmtp直接作为链接的一部分,您将传递对称加密的令牌。 - 即。 rmpt:// whatver?token =秘密部分中的秘密将是时间戳和一些随机rubish以确保安全; rptpt服务器将解码令牌并拒绝所有具有旧时间戳的请求 - 这样人们可以看到该链接,但它会在一段时间后变得不可用。

+0

它不适合我@Ondrej Svejdar。请帮助,我非常担心和疲惫,但我需要解决它。谢谢。 – ZahidKakar

+0

我跟着你输入的内容,但仍然不走运。等待你的回复。 – ZahidKakar

+0

再次感谢@Ondrej,我只有rtmp链接,不能控制rtmp服务器。 – ZahidKakar

0

问题是你的处理程序正在返回流的URL,而不是VLC期望的流本身。对付这种最简单的方法是,而不是使用一个处理程序,并在其指向的目标,是当你的页面像这样设置从ASP目标属性:

<embed 
type='application/x-vlc-plugin' 
pluginspage='http://www.videolan.org' 
version='VideoLAN.VLCPlugin.2' 
width='800' 
height='600' 
id='vlc' 
loop='yes' 
autoplay='yes' 
target="<%= GetStreamLocation() %>" /> 

然后在后面的代码为该页面具有以下功能:

protected string GetStreamLocation() 
{ 
    int channelId; 
    var success = int.TryParse(Request.QueryString["ChannelID"], out channelId); 
    if (!success) throw new Exception("Invalid channel id specified"); 
    string returnValue; 

    using (SqlConnection conn = new SqlConnection(connStr)) 
    { 
     using (SqlCommand cmd = new SqlCommand("SELECT Link FROM TblChannel WHERE ChannelID = @id", conn)) 
     { 
      cmd.Parameters.Add(new SqlParameter("@id", channelID)); 
      conn.Open(); 
      using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
      { 
       reader.Read(); 
       if (reader.HasRows == true) 
       { 
        returnValue = reader["Link"].ToString(); 
        reader.Close(); 
       } 
      } 
     } 
    } 
    if (string.IsNullOrEmpty(returnValue)) throw new Exception("Error loading link from database"); 
    return returnValue; 
} 

这会在页面加载时自动将Feed的链接插入到目标属性中。

+0

感谢您的回复@Anduril,但是当您通过萤火虫或某件事物检查源代码时,它暴露了链接。如何隐藏观众的链接? – ZahidKakar

+0

@Kahid我能想到的唯一的其他选项(我强烈建议不要)使用处理程序,但不是传递URL,而是需要从目标URL提取源并将该流写入响应 - 实际上充当代理人;这样只有处理程序URL会被暴露。 但是,这个选项更加复杂,并且会非常糟糕,因为它需要拉动提要并将其发送回客户端,从而快速饱和服务器连接。隐藏URL是否非常重要? – Anduril

+0

是的,有必要根据客户要求隐藏电视频道链接。这可以被任何玩家使用。 – ZahidKakar